Robbson
2006-03-29, 08:41:13
Hallo!
Als Anfänger hinsichtlich der Programmierung von Direct3D Applikationen beschäftigt mich zur Zeit die große Frage, wie man wohl ein effizientes Texture Mapping durchführen kann, ohne "Extrawürste". Was ich damit meine, soll an dem folgenden einfachen Beispiel gezeigt werden.
Man nehme einen (einzigen) Würfel. Dessen Vertices und Kanten sind über indizierte Primitives recht effizient definierbar. So genügen 8 Vertices und ein Array für 36 Indices, wenn der Würfel mit eine Triangle List erzeugt bzw. gerendert werden soll. Noch effektiver (weniger Indices) ginge es über Triangle Strips, doch leider sind die für den Würfel unbrauchbar, da bei der Hinzunahme eines weiteren Vertex offensichtlich nicht bestimmbar ist, über welche Dreieckseite das neue Dreieck aufgespannt werden soll.
Aber egal ob Triangle Strip oder List, kommen wir nun endlich zur Texturierung. Der Würfel soll so texturiert werden, daß alle vertikalen Flächen (vorne, rechts, hinten, links) mit Textur A (3x wiederholend) überspannt sind. Die obere und untere Seite sind hingegen mit einer anderen Textur B zu versehen.
Hier stellt sich nun die Frage, wie dieses Ziel erreicht werden kann. Hat jeder Vertex zwei Texturkoordinaten (U,V), dann reichen diese in diesem Fall nicht aus, da jeder Vertex von min. 2 verschiedenen Texturen benutzt wird.
Lösungsmöglichkeiten:
1. Jede Seite des Würfels bekommt eigene Vertices (jeweils 4 Stück), sodaß genügend U,V Koord. zur Verfügung stehen. Allerdings erhöht sich nicht nur die Anzahl der nötigen Vertices von 8 auf 24. Vielmehr gibt es zahlreiche redundante Vertices mit denselben Koordinaten, nur damit ein zusätzliches Paar an Texturkoord. zur Verfügung steht.
2. Jeder Vertex bekommt ein oder zwei zusätzliche(s) Paar(e) an Texturkoordinaten. Das erscheint zunächst am sinnvollsten. Allerdings müssen die Texturen dann womöglich in verschiedenen Stages gerendert werden, denn FVF erlaubt nur bis zu acht zusätzliche Texturkoordinaten für die weiteren Texture Stages. Sollen später noch andere Texturen darübergelegt werden, reichen womöglich die Stages nicht mehr aus.
3. Die komplette Texturierung des Würfels geschieht über eine einzige Textur, die wie folgend (aufgeklappt)gespeichert wird:
# B
#### bzw. AAAA
# B
Allerdings müssten so mehrere Texturen doppelt gespeichert werden, da die vertikalen Seiten ja jeweils nur mit ein und derselben Textur bekleidet werden sollen. Außerdem reichen auch hier die vorhandenen Texturkoordinaten der Vertices nicht (8 Paare).
Der Knackpunkt bei allen 3 Varianten liegt wohl in der Speicherung der zusätzlich nötigen Texturkoodinaten. Hier kann ich mich nicht so recht zu einem Kompromiss entscheiden. Natürlich spielen auch andere Parameter eine Rolle (etwa das Zusammenführen von Einzeltexturen zu Atlases), die hier aber nicht im Fokus liegen.
Für die erste Variante spricht (trotz des Overheads an Vertices), daß jede Fläche bspw. separat gekennzeichnet werden kann, wenn die texturierten Dreiecke später vor dem Rendern sortiert werden müssen.
Oder gibt es noch andere, effizientere und praktischere Methoden für den Würfelfall? Genauso ist die Problematik auch für andere Körper zutreffend, etwa bei benachbarten Flächen mit jeweils unterschiedlichen Texturen.
Es wäre schön, wenn mir jemand einen heißen Tipp geben könnte. Leider habe ich in den vielen Dokumenten (etwa von nVidia oder Microsoft) noch nix brauchbares für solche Fälle gefunden. ;(
Grüße,
Robbson.
Als Anfänger hinsichtlich der Programmierung von Direct3D Applikationen beschäftigt mich zur Zeit die große Frage, wie man wohl ein effizientes Texture Mapping durchführen kann, ohne "Extrawürste". Was ich damit meine, soll an dem folgenden einfachen Beispiel gezeigt werden.
Man nehme einen (einzigen) Würfel. Dessen Vertices und Kanten sind über indizierte Primitives recht effizient definierbar. So genügen 8 Vertices und ein Array für 36 Indices, wenn der Würfel mit eine Triangle List erzeugt bzw. gerendert werden soll. Noch effektiver (weniger Indices) ginge es über Triangle Strips, doch leider sind die für den Würfel unbrauchbar, da bei der Hinzunahme eines weiteren Vertex offensichtlich nicht bestimmbar ist, über welche Dreieckseite das neue Dreieck aufgespannt werden soll.
Aber egal ob Triangle Strip oder List, kommen wir nun endlich zur Texturierung. Der Würfel soll so texturiert werden, daß alle vertikalen Flächen (vorne, rechts, hinten, links) mit Textur A (3x wiederholend) überspannt sind. Die obere und untere Seite sind hingegen mit einer anderen Textur B zu versehen.
Hier stellt sich nun die Frage, wie dieses Ziel erreicht werden kann. Hat jeder Vertex zwei Texturkoordinaten (U,V), dann reichen diese in diesem Fall nicht aus, da jeder Vertex von min. 2 verschiedenen Texturen benutzt wird.
Lösungsmöglichkeiten:
1. Jede Seite des Würfels bekommt eigene Vertices (jeweils 4 Stück), sodaß genügend U,V Koord. zur Verfügung stehen. Allerdings erhöht sich nicht nur die Anzahl der nötigen Vertices von 8 auf 24. Vielmehr gibt es zahlreiche redundante Vertices mit denselben Koordinaten, nur damit ein zusätzliches Paar an Texturkoord. zur Verfügung steht.
2. Jeder Vertex bekommt ein oder zwei zusätzliche(s) Paar(e) an Texturkoordinaten. Das erscheint zunächst am sinnvollsten. Allerdings müssen die Texturen dann womöglich in verschiedenen Stages gerendert werden, denn FVF erlaubt nur bis zu acht zusätzliche Texturkoordinaten für die weiteren Texture Stages. Sollen später noch andere Texturen darübergelegt werden, reichen womöglich die Stages nicht mehr aus.
3. Die komplette Texturierung des Würfels geschieht über eine einzige Textur, die wie folgend (aufgeklappt)gespeichert wird:
# B
#### bzw. AAAA
# B
Allerdings müssten so mehrere Texturen doppelt gespeichert werden, da die vertikalen Seiten ja jeweils nur mit ein und derselben Textur bekleidet werden sollen. Außerdem reichen auch hier die vorhandenen Texturkoordinaten der Vertices nicht (8 Paare).
Der Knackpunkt bei allen 3 Varianten liegt wohl in der Speicherung der zusätzlich nötigen Texturkoodinaten. Hier kann ich mich nicht so recht zu einem Kompromiss entscheiden. Natürlich spielen auch andere Parameter eine Rolle (etwa das Zusammenführen von Einzeltexturen zu Atlases), die hier aber nicht im Fokus liegen.
Für die erste Variante spricht (trotz des Overheads an Vertices), daß jede Fläche bspw. separat gekennzeichnet werden kann, wenn die texturierten Dreiecke später vor dem Rendern sortiert werden müssen.
Oder gibt es noch andere, effizientere und praktischere Methoden für den Würfelfall? Genauso ist die Problematik auch für andere Körper zutreffend, etwa bei benachbarten Flächen mit jeweils unterschiedlichen Texturen.
Es wäre schön, wenn mir jemand einen heißen Tipp geben könnte. Leider habe ich in den vielen Dokumenten (etwa von nVidia oder Microsoft) noch nix brauchbares für solche Fälle gefunden. ;(
Grüße,
Robbson.