Frage zur Direct3D9 Funktion "SetFVF"
-
Hallo,
seit neustem versuche ich auch schon D3D9 Anwendungen zu schreiben, ich habe ja schon ca. ein Jahr Erfahrung mit OpenGL und stelle auch fest, dass es durchaus einige Parallelen zwischen OGL und D3D gibt.
Allerdings habe ich ein Problem mit der "IDirect3D9Device::SetFVF" Funktion.
Da gibt man ja an, in welcher Reihenfolge die Vertex-Daten in einer eigenen Struktur/ Klasse gespeichert sind. Aber leider gibt es da keinen Parameter für den Vertex-Nebel. In OpenGL kann man ja mittels "glFogCoordPointer" auch Nebel Koordinaten für jeden Vertex angeben. Aber für D3D9 kenne ich nur die Parameter D3DFVF_XYZ, D3DFVF_DIFFUSE, D3DFVF_NORMAL usw. aber keinen für "FOG".In OpenGL kann man komfortabler Weise sogar noch angeben nach wie vielen Bytes die jeweiligen Daten in der Struktur auftauchen. Zum Beispiel auch bei "glVertexPointer" muss man als letzten Parameter einen pointer auf das erste Vertex der Reihe angeben. Somit kann man mit OpenGL auch zusatz Variablen in der Vertex-Struktur speichern die man gar nicht an die GrafikKarte übermitteln will.
Meine Frage ist: geht das auch mit Direct3D9 oder gibt es doch einen Parameter für Nebel aus der D3DFVF_... Reihe?
Danke schon mal im Vorraus

-
Also das mit dem Nebel geht nicht per SetFVF, sondern über sogenannte RenderStates im Fall von Nebel solltest du dir mal das ansehen.
:xmas2: :xmas2: :xmas2:
-
LukasBanana schrieb:
Da gibt man ja an, in welcher Reihenfolge die Vertex-Daten in einer eigenen Struktur/ Klasse gespeichert sind.
Wenn ich mich recht erinnere gibt das FVF nicht die Reihenfolge an, sondern nur WAS im Vertexformat steht. Die Reihenfolge der Daten ist hingegen fest vorgegeben (in der FFP).
Wie schon gesagt macht man FFP-Nebel per Rasterizerstates (oder über Shader).
-
nicht ganz, wenn man shader nutzt, dann kann man sehr wohl genau festlegen welches format welches element im vertex hat und den offset.
-
rapso schrieb:
nicht ganz, wenn man shader nutzt, dann kann man sehr wohl genau festlegen welches format welches element im vertex hat und den offset.
Drum hab ich ja auch extra in Klammern "in der FFP" dazugeschrieben.
-
Somit kann man mit OpenGL auch zusatz Variablen in der Vertex-Struktur speichern die man gar nicht an die GrafikKarte übermitteln will.
Das geht mit Direct3D9 auch, indem man die Daten einfach hinten dranhängt, und eine entsprechend grössere Vertex-Size angibt. Dazu braucht man dann allerdings einen D3D9 Treiber, wenn man D3D9 mit einem D3D8 Treiber verwendet geht es (angeblich - hab's noch nie ausprobiert) nicht.
Ich halte das allerdings sowieso für fragwürdig, denn die Daten werden vermutlich trotzdem auf die Grafikkarte übertragen, nur dort dann einfach nicht genutzt (quasi "übersprungen").
-
Okay, danke. :xmas1:
Aber wenn man in OpenGL die Position der einzelnen Daten angeben kann, warum geht das dann nicht so detailiert in D3D9?
-
warum geht das dann nicht so detailiert in D3D9?
Als man das flexible Vertex Format im Rahmen von DirectX7 (reine fixed-function Pipeline) eingefuehrt hat, bestand keine Notwendigkeit die Reihenfolge der Vertexattribute veraendern zu koennen.
Spaeter wurde darum die Vertex Declaration eingefuehrt.
-
LukasBanana schrieb:
Okay, danke. :xmas1:
Aber wenn man in OpenGL die Position der einzelnen Daten angeben kann, warum geht das dann nicht so detailiert in D3D9?
OpenGL ermöglicht einem viele Dinge so zu machen dass es eine Grafikkarte garnicht beschleunigen kann. (Bzw. nicht direkt, nicht ohne dass man die CPU für bestimmte Zwischenschritte einsetzt.) Zu dem Zeitpunkt als die FVFs in Direct3D eingeführt wurden gab es noch keine (oder kaum?) Grafikkarten mit wirklich frei programmierbaren Vertex-Shadern. Eine zu freie Definition des Vertex-Formats hätte wohl dazu geführt, dass viele der damaligen Grafikkarten damit nichts mehr anfangen können, und erst wieder die CPU verwendet werden muss um die Daten umzukopieren/vorzubereiten. Was nicht Sinn der Sache ist (war).
Ist aber auch nur geraten, bzw. meine Einschätzung.