PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Der Kampf mit DirectX...


Corrail
2006-02-05, 23:26:14
Hallo!

Ich bin gerade dabei eine 3D Engine unter DirectX zu entwickeln. Habe schon einiges mit OpenGL gemacht, habe also nur Probleme mit der API. Und da die Dokumentation nicht grad lobenswert ist hab ich jetzt ein paar Fragen:

-) Gibt es eine Möglichkeit die "Position" eines Vertexattributes von einem HLSL Shader zu ermitteln? Also wenn ich z.B. folgendes habe:

struct VS_INPUT
{
float4 vPosition : POSITION;
float3 vNormal : NORMAL;
float4 vBlendWeights : BLENDWEIGHT;
};

will ich anhand vom Namen (vPosition, vNormal, ...) wissen, auf was das Attribut gemappt wird (POSITION, NORMAL, ...). In der ID3DXConstantTable gibt es ja nur die Möglichkeiten für Uniforms/Constants.

-) Kann man die varying Variablen von Vertex- und Fragment... *argl* Pixelshader irgendwie von DirectX automatisch mappen lassen (wie bei GLSL).

So, das wars mal fürs erste. Es werden sicher noch mehr Fragen kommen ;)

Vielen Dank fürs Erste!

Demirug
2006-02-06, 07:27:29
Die Namen sind nach dem Compilerlauf nicht mehr vorhanden da sie ja aufgrund der Semantik sowieso fest zugeordnet sind. Aus diesem Grund gibt es auch automatisches Mapping.

Corrail
2006-02-06, 13:55:00
Die Namen sind nach dem Compilerlauf nicht mehr vorhanden da sie ja aufgrund der Semantik sowieso fest zugeordnet sind. Aus diesem Grund gibt es auch automatisches Mapping.

Das ich bei einem DX Shader Objekt so gut wie keine Informationen mehr rauskitzeln kann hab ich auch schon heraus gefunden. Aber wie funktioniert das mit dem automatischen Mapping? Mit D3DXCompileShadern kann ich ja nur einen Shader kompilieren, nicht ein ganzes ShaderProgram (Im OpenGL Sinne, also Fragment und Vertex Shader). Oder muss ich das Effektframework dafür verwenden?

Demirug
2006-02-06, 14:21:28
Was für ein automatische Mapping? Das einzige was automatisch gemacht wird ist das binden von Registern. Das Binden der Vertexdaten an den Vertexshader sowie die Bindung zwischen Vertex und Pixelshader erfolgt über die Semantik.

Corrail
2006-02-06, 14:35:22
Was für ein automatische Mapping?
Aus diesem Grund gibt es auch automatisches Mapping.

Ok, um nochmal auf die Frage zurückzukommen: Ist es möglich von der Applikation aus von einem Shader Objekt (oder vorher) herauszufinden, welche Vertexattribute (vom Shader) wo gemappt wurden?

Demirug
2006-02-06, 14:42:11
Ok, um nochmal auf die Frage zurückzukommen: Ist es möglich von der Applikation aus von einem Shader Objekt (oder vorher) herauszufinden, welche Vertexattribute (vom Shader) wo gemappt wurden?

Ich bezog mich auf die automatisch Zuordnung der Eingangsregister zu der Semantik. Diese Information ist aber für die Applikation selbst vollkommen belangloss weil sie überhaupt keinen Einfluss hat.

Ich verstehe ehrlich gesagt immer noch nicht genau was du überhaupt wissen möchtest. Vielleicht beschreibst du mal was du mit der gewünschten Information überhaupt machen willst. Ich vermute nämlich das wir aneinander vorbei reden.

Corrail
2006-02-06, 15:01:34
Ich will in meiner Engine ausschließlich HLSL verwenden und in Zuge dessen die Vertexattribute (Vertexposition, Normalvector, Tangent, ...) per Namen identifizieren. Also ich will den Normalvektor in jedem Shader "a2v_Normal" benennen, egal auf was der Normalvektor im Shader gemappt wird (NORMAL, TEXCOORDX oder was auch immer). Gibt es eine DX Funktion, mit der ich herausfinden kann, auf was jetzt mein Attribut mit dem Namen "a2v_Normal" vom Shader gemappt wurde?

Demirug
2006-02-06, 15:27:47
Ich will in meiner Engine ausschließlich HLSL verwenden und in Zuge dessen die Vertexattribute (Vertexposition, Normalvector, Tangent, ...) per Namen identifizieren. Also ich will den Normalvektor in jedem Shader "a2v_Normal" benennen, egal auf was der Normalvektor im Shader gemappt wird (NORMAL, TEXCOORDX oder was auch immer). Gibt es eine DX Funktion, mit der ich herausfinden kann, auf was jetzt mein Attribut mit dem Namen "a2v_Normal" vom Shader gemappt wurde?

Da diese Information nicht als Teil des Compilerlaufs neu erzeugt wird gibt sie der Compiler auch nicht aus. Wenn du sie brauchst musst du sie selber aus dem HLSL Code parsen oder sonst irgendwie speichern. Das binden über Namen ist aus Performances Sicht um einiges komplexer. Ich habe das vor einiger Zeit selbst implementiert.

Corrail
2006-02-06, 15:43:30
Da diese Information nicht als Teil des Compilerlaufs neu erzeugt wird gibt sie der Compiler auch nicht aus. Wenn du sie brauchst musst du sie selber aus dem HLSL Code parsen oder sonst irgendwie speichern. Das binden über Namen ist aus Performances Sicht um einiges komplexer. Ich habe das vor einiger Zeit selbst implementiert.

Alles klar, danke! Dann werd ich eine XML Struktur um den Shader herumbauen, was vermutlich das einfachste sein wird.
Wie stark ist aus deiner erfahrung der Performanceverlust?

Demirug
2006-02-06, 15:56:07
Der Verlust wird stark davon abhängen wie du das Binden genau implementierst. Da gibt es ja viele Möglichkeiten.

Corrail
2006-02-06, 16:23:45
Der Verlust wird stark davon abhängen wie du das Binden genau implementierst. Da gibt es ja viele Möglichkeiten.

Schon klar
Naja, ich werds vorläufig mal mit XML Zusatzinfo implementieren.
Danke dir

Demirug
2006-02-06, 16:43:23
Schon klar
Naja, ich werds vorläufig mal mit XML Zusatzinfo implementieren.
Danke dir

Das meinte ich nicht. Meine Beschreibungen sind primär auch in XML Dateien. Ich bezog mich dabei eher auf das interne Handling zur Laufzeit.

muhkuh_rs
2006-02-06, 16:52:55
Ich will in meiner Engine ausschließlich HLSL verwenden und in Zuge dessen die Vertexattribute (Vertexposition, Normalvector, Tangent, ...) per Namen identifizieren. Also ich will den Normalvektor in jedem Shader "a2v_Normal" benennen, egal auf was der Normalvektor im Shader gemappt wird (NORMAL, TEXCOORDX oder was auch immer).

Interessehalber: Warum eigentlich? "Gedacht" scheint ja bei DirectX 9 zu sein, dass die input semantics in der vertex declaration die verbindung zwischen Vertexdaten und Shader sind. Man sagt DirectX was wo im Vertex Buffer liegt und die Daten liegen in den vorgesehenen Registern des Vertex Shaders.

Ach ja: Gibt es eigentlich einen Grund, das effect framework nicht zu verwenden? Das ist doch eigentlich eine große Stärke von DirectX, dass man damit sämtliche Hardware (auch ohne shader) programmieren kann, ohne gleich extra codepfade einführen zu müssen und die Dinger gleich noch in 3dsmax den Modellern als Preview geben kann.

Corrail
2006-02-06, 17:50:10
Interessehalber: Warum eigentlich? "Gedacht" scheint ja bei DirectX 9 zu sein, dass die input semantics in der vertex declaration die verbindung zwischen Vertexdaten und Shader sind. Man sagt DirectX was wo im Vertex Buffer liegt und die Daten liegen in den vorgesehenen Registern des Vertex Shaders.

Weil ich dadurch einen Software-Zwischenlayer beim Mappen von den Vertexattributen habe, der mir Flexibilität bringt.

Ach ja: Gibt es eigentlich einen Grund, das effect framework nicht zu verwenden? Das ist doch eigentlich eine große Stärke von DirectX, dass man damit sämtliche Hardware (auch ohne shader) programmieren kann, ohne gleich extra codepfade einführen zu müssen und die Dinger gleich noch in 3dsmax den Modellern als Preview geben kann.

Ja, den gibts. Ich will die Engine (vorläufig noch nicht, aber in zukunft) multi-API tauglich machen. Und DX Effect Files unter OpenGL spielst nicht. ;)
Da setz ich lieber auf Collada.


Das meinte ich nicht. Meine Beschreibungen sind primär auch in XML Dateien. Ich bezog mich dabei eher auf das interne Handling zur Laufzeit.

Wie oben beschrieben will ich einen Zwischenlayer zwischen Engine und Shader, der mir Flexibilität beim Mappen verspricht. Wie ich das genau aufziehe und implementiere weiß ich noch nicht. Wollt nur wissen ob du allgemein zur Performance sagen kannst und eventuell ein paar Tipps hättest. ;)

Coda
2006-02-06, 18:50:52
Schau dir doch mal an wie das bei Ogre gemacht wird.

ScottManDeath
2006-02-06, 23:01:18
Weil ich dadurch einen Software-Zwischenlayer beim Mappen von den Vertexattributen habe, der mir Flexibilität bringt.

Ja, den gibts. Ich will die Engine (vorläufig noch nicht, aber in zukunft) multi-API tauglich machen. Und DX Effect Files unter OpenGL spielst nicht. ;)
Da setz ich lieber auf Collada.


CG 1.4 hat CGFX mit integriert.....