Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

1

10.09.2010, 17:20

Probleme bei Verwendung mehrerer Direct3D9 Shader

Ich habe ein neues Tutorial für meine 3D Engine angefangen: "ShaderLibrary" wo mehrere Shader Beispiele demonstriert werden.
Acht sind es an der Zahl und jeweils für OpenGL und Direct3D9 (Shader Model 2 und 3 je nach dem). Bei D3D9 funktionieren manche Shader nicht, wenn ich zu viele geladen habe. Ist das bei D3D9 irgendwie stark begrentzt?? Oder mache ich vielleicht intern irgend was falsch, dass die sich in die Quere kommen?!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

10.09.2010, 17:56

Was heißt funktionieren nicht? Hängt das wirklich mit der Anzahl zusammen (funktionieren sie wenn du stattdessen einmal andere Shader die normal funktionieren nicht lädst)? Wieviele sind es denn wenn du denkst dass die Anzahl ein Problem sein könnte? Sind das wirklich nur Shader oder Effekte?

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

3

11.09.2010, 13:37

Kann auch sein, dass die RenderTargets in meiner Engine bei D3D9 noch nicht richtig funktionieren. Meine WasserSimulation sieht sehr merkwürdig aus, wenn ich den BumpMapping shader dazu nehme.

Aber wo ist bitte der Unterschied zwischen Shader und Effekte? Meinst du damit diese "technique" semantic?

EDIT:
Ich hab den Eindruck, als würden meine D3D9 ConstantTables durcheinander geraten. Kann mir aber nicht erklären, wie das passieren soll.

EDIT(2):
In meinem einen Shader (ProceduralTextures) habe ich das Problem, dass die Constanten nicht richtig gesetzt werden. Das sind meine Konstanten:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//! World matrix used to transform only the vertex normal.
float4x4 WorldMatrix;

//! WorldViewProjection matrix used to transform the vertex coordinate.
float4x4 WorldViewProjectionMatrix;

//! Light position for per-pixel lighting.
float3 LightPosition;

//! Mode for procedure texture demonstration.
uint DemoMode;

//! Material ambient color.
float4 AmbientColor; // FEHLER: diese Variable wird zwar richtig erkannt, aber erhält überhaupt keine Werte

//! Material diffuse color.
float4 DiffuseColor;

//! Material specular color (For shininess).
float4 SpecularColor;

//! Material shininess factor.
float Shininess;

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »LukasBanana« (11.09.2010, 14:46)


LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

4

15.09.2010, 15:52

Könnte das Problem vlt. auch darin bestehen, dass die größe aller Shader Konstanten (in Bytes) durch 4*4 Teilbar sein muss.
Also ähnlich wie bei D3D11 wo immer in 4-Float Blöcken gearbeitet wird?!

In einem anderen Shader von mir habe ich folgende Konstanten:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
//! Light direction vector for simple vertex lighting.
float3 LightDirection;

//! Height of the last hair layer.
float MaxLayerHeight;

//! Interpolation value in the range [0.0 .. 1.0].
float LayerInterpolation;

//! Texture coordinate translation.
float3 TexCoordTranslation;

Wenn ich alle Shader lade und deren Konstanten setzte, kommen sich die Shader irgendwie in die Quere. Aber nur bei D3D9. Bei OpenGL funktioniert alles bestens.
Kann mir bitte jemand helfen, ich bin schon langsam am verzweifeln. Und bevor das nicht richtig funktioniert, will ich die neue SPE Version erst gar nicht veröffentlichen :|

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

15.09.2010, 16:05

Wie setzt du die Konstanten? Kann es sein dass du der Fehlannahme erliegst dass ID3DXConstantTable ihren Zustand speichert!? Die ConstantTable sorgt im Prinzip nur dafür dass die Werte in die richtigen Register kommen. Aber du musst wenn du den Shader setzt natürlich genauso alle Parameter neu setzen.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (15.09.2010, 16:11)


LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

6

15.09.2010, 16:24

Tatsächlich. Vielen Dank, das war's :)
Aber warum funktioniert das bei OpenGL? Da muss ich nicht alles neu setzten. Vielleicht weil man da nicht mit einer ConstantTable arbeitet, sondern das ganz anders löst?!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

15.09.2010, 16:27

Bei OpenGL muss man nicht alles neu setzen? Das wär mir irgendwie neu. OpenGL Uniforms funktionieren doch praktisch gleich wie D3DX ConstantTables!?

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

8

15.09.2010, 16:40

Ich hab alle Shader von GLSL nach HLSL umgeschrieben und bei OpenGL funktioniert alles einwandfrei ohne, dass ich alle Konstanten dauernd neu setzen muss.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

15.09.2010, 16:49

Hm interessant. Mal ausprobieren...

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

15.09.2010, 16:54

Stimmt. Tatsächlich. Das OpenGL Program Object puffert die Werte seiner Uniforms, wird auch vom OpenGL Standard so gefordert. Das war mir gar nicht bewusst^^

Zitat von »OpenGL 4.0 Specification«

Uniforms are program object-specific state. They retain their values once loaded, and their values are restored whenever a program object is used, as long as the program object has not been re-linked.

Werbeanzeige