PDA

View Full Version : [PROBLEM] - Bsp 5) Z-Buffer


Flowyes
07-11-2004, 15:09
Ich hab wieder Probleme: Mit z buffering.

In CG1Canvas das Z-Buffer initialisieren und in CG1Canvas.setPixel(int x,int y,Color c, double z) schauen, ob ich einen Z-Wert hab, der größer ist als der aktuelle Wert an der entsprechenden Stelle im Z-Buffer, funktioniert.

In CG1FlatShadedPolygon buildEdgeList() und fillScan() um zIntersect und dzPerScan erweitern müsste an sich auch funktionieren bei mir. In CG1FlatShadedPolygon.buildEdgeList() speichere ich einfach zu jedem xIntersect den entsprechenden zIntersect und dzPerScan krieg ich einfach mit:

(z2 - z1) / (x2 - x1)
wobei ich die Z-Werte aus dem array depth[] lese und z1, x1 die Anfangspunkte, und z2, x2, die Endpunkte dieser Kante sind.

In CG1FlatShadedPolygon.fillScan() setze ich ein Pixel und erhöhe dann den Wert von zIntersect um dzPerScan, gleich nachdem ich den x-Wert in dieser Scanlinie erhöht habe (ist das vielleicht ein Schwachsinn? Mir machts irgendwie Sinn aber sagt bitte ob das falsch ist oder nicht). Sonst hab ich bis jetzt nichts gemacht. Meiner (wahrscheinlich falschen) Meinung nach müsste die Z-Buffer-Methode funktionieren aber dieser screenshot z.B. schaut sehr fr33ky aus :) (Hier liegen alle Flächen der Kugel hinter der Teekanne) Also müsste nur der kleine Teil unten sichtbar sein eigentlich)

Wo könnte mein Fehler liegen, ich komm echt nicht dahinter...

tivolo
07-11-2004, 18:03
das z-buffering ist ansich nicht schwierig, aber du scheinst hier was verwechselt zu haben: so wie du's beschrieben hast, kann es nicht funktionieren.

In der Methode buildEdgeList() übergibst du (richtigerweise) den zIntersect, den du aus dem depth[]-Array ausliest. So weit, so gut. dzPerScan kann aber nicht (z2 - z1)/(x2 - x1) sein! ScanLines gehen in Y-Richtung *hint, hint* :)

Deshalb stimmt auch dein fillscan() nicht. Mit dzPerScan weißt du, um wieviel du den Z-Wert pro ScanLine erhöhen musst. In der Schleife in der fillscan()-Methode gehst du aber immer nur um EIN Pixel in EINER ScanLine weiter - du musst dir also vorher noch ausrechnen, um WIEVIEL du pro PIXEL erhöhen musst... der Rest passt: Pixel setzen (canvas.setPixel()), Z erhöhen.

mfg,
tivolo

Matthias
07-11-2004, 18:12
Und noch ein kleiner Hinweis von mir: um das Update von zIntersect musst du dich nicht kümmern, das wird in der update Methode von CG1EdgeList schon gemacht. Aber eben das, was tivolo schon beschrieben hat.

Flowyes
07-11-2004, 19:58
dz/dx war natürlich falsch, jetzt versteh ich warum ich y nehmen soll!
Dann kann ich natürlich auch gleich update() verwenden, eh klar...
Oh mein Gott, das war das Problem, jetzt gehts.