Einzelnen Beitrag anzeigen

Benutzerbild von Desmulator
Desmulator

Registriert seit: 3. Mai 2007
Ort: Bonn
169 Beiträge
 
#3

AW: Isometrisch Zeichnen

  Alt 9. Nov 2015, 21:56
Angenommen dein zu zeichnendes Dreieck sei durch die Vertizes u, v und w geben.
Dann musst du als erstes die Flächennormale berechnen. Dies geschieht mittels des Kreuzprodukts und zwar so:
Code:
n = ( v - u ) x ( v - w )
Wichtig, der Vektor n ist nicht normal! Falls er später gebraucht wird um zum Beispiel Licht zu berechnen, musst du ihn noch normalisieren. Allerdings ist im Allgemeinen die Normale für Licht Teil der Vertex-Definition und wird über das Dreieck interpoliert, die hier berechnete Normale dient nur zum Backface-Culling.
Code:
n' = 1/|n| * n
Angenommen der Betrachter befindet sich am Punkt p. Man betrachte nun das Skalarprodukt:
Code:
q = ( p - v ) * n
Falls q größer als 0 ist, so zeigt das Dreieck zum Betrachter hin, muss also gezeichnet werden. Falls kleiner als 0 ist die Rückseite sichtbar. Das ganze bezeichnet man als Backface-Culling. So kann man falsche Dreiecke aussortieren.

Wichtig: Das ganze funktioniert nur bis auf Vorzeichen, wenn du also irgendwo ein Vorzeichen umgedreht hast, musst du es auch hier tun. Also am besten einfach ausprobieren. Wichtig ist auch die Reihenfolge in der die Vertizes aufgelistet sind. Diese entscheidet nämlich ob wie ein Dreieck orientiert ist.

Um nun Objekte in der richtigen Reihenfolge zu zeichnen hast du zwei Möglichkeiten:
Dreiecke nach ihrer Tiefe, vom Betrachter aus gesehen, sortieren. Das ist allerdings sehr und teilweise gar nicht möglich ohne die Dreiecke in kleinere unterteilen zu müssen.

Die "moderne" Methode ist ein Z-Buffer. Dieser merkt sich die Tiefe eines jeden Pixels. Wenn du die Dreiecke also später rasterisierst musst du für jeden Pixel den Tiefenwert berechnen und ihn mit dem im Z-Buffer vergleichen. Ist dieser vergleich positiv, so kann der Farbpuffer aktualisiert werden.


Die Tiefe berechnet sich ganz einfach während der Projizierens auf den Bildschirm. Nach der Homogenen Division steht in der Z-Koordinate der Tiefenwert.

Das ist aber das kleinste Problem. Es wird noch eine ganze Menge Mathematik auf dich zu kommen. Besonders wenn du Texturen verwenden möchtest. Gerade der Rasterisieren von Dreiecken ist ein Flaschenhals auf einer CPU. Es wird jeder Pixel einzeln berechnet! Das keine Grafikkarte mit 100 Shadereinheiten einfach deutlich besser.
Außerdem ist es sehr schwer effektiv einen Z-Buffer zu realisieren. Der Overhead ist einfach gigantisch.

Es lohnt sich wirklich sich damit auseinander zu setzen und die Vorgänge einer Grafikkarte nach zu programmieren. Ich habe es auch getan. Sogar in Assembler mit SSE Optimierung. Das geht auch ganz gut, ist aber absolut nicht zu empfehlen, da das ganze ziemlich schnell in die Knie geht. Und das auf einem Desktop-CPU.


Darum lieber die 3D-Schnittstelle des Handys nutzen.
Lars
There are 10 kinds of people in the world:
those who get binary, and those who don’t.

Geändert von Desmulator ( 9. Nov 2015 um 22:03 Uhr)
  Mit Zitat antworten Zitat