PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : DirectX HLSL Problem


Corrail
2006-06-11, 14:31:35
Hallo!

Ich bin gerade dabei ein 3D Spiel zu schreiben. Dafür verwende ich DirectX9 mit Effect Files. Mein Konzept schaut so aus, dass ich für jedes "Material" einen Effect hab mit verschiedenen Techniques (Default, ShadowMapping Z-Only, ...). Jetzt will ich das ganze noch mit mehreren Lichter verwenden und zwar so, dass ich zuerst bestimme, wieviele Lichter ein Objekt beeinflussen und dann die Technique mit der entsprechenden Lichtanzahl aufrufe.
Vom Shader Source hätte ich mir das ungefähr so vorgestellt:

void TerrainVS(
int numLights,
float4 Pos : POSITION,
float2 Tex : TEXCOORD0,
out float4 outPos : POSITION,
out float2 outTex : TEXCOORD0,
out float3 outLVec[numLights] : TEXCOORD2)
{
// Do something
}

float4 TerrainPS(
int numLights,
float2 Tex : TEXCOORD0,
float3 LVec[numLights] : TEXCOORD2) : COLOR
{
// Do something
}

technique Default1
{
pass p0
{
VertexShader = compile vs_2_0 TerrainVS(1);
PixelShader = compile ps_2_0 TerrainPS(1);
}
};

technique Default2
{
pass p0
{
VertexShader = compile vs_2_0 TerrainVS(2);
PixelShader = compile ps_2_0 TerrainPS(2);
}
};

Nur geht das nicht. Gibts da eine Möglichkeit, das so zu machen? Oder muss ich da für jede Lichtanzahl den Shader Source selbst schreiben?

Demirug
2006-06-11, 14:36:07
Schau dir mal das "Depth of Field" Example an. Da wird ein Shader mit variabler Anazahl von Samplepunkten benutzt.

Corrail
2006-06-11, 14:47:56
Danke für den Tipp, aber ich will das abhängig von der Lichtanzahl die Anzahl der Lichtvektor-Interpolatoren verändert:
float3 LVec[numLights] : TEXCOORD2

Sonst müsste ich ein maximum definieren (was nicht so schlimm wäre), aber ich müsste den restlichen Vektoren Werte zuweisen, sonst schreit mir der Effect Compiler. Und das will ich nicht.

Expandable
2006-06-11, 16:49:02
Irgendwie musst Du aber eh aufpassen, dass Du nicht an ein Hardwarelimit stößt. Bei 10 Lichtern oder so (und entsprechend aufwändigen Effekten) werden Dir einige Grafikkarten schon aussteigen... wäre Deferred Shading/Multipasses denn keine Option?

del_4901
2006-06-11, 16:50:24
mit Cg könnte man sich unsized arrays definieren sowie interface funktionen. Die länge kriegt du dann ganz einfach raus, und wenn du noch lustig bist kannst du verschiedene Funktionen in das(oder mehrere) interfaces einhängen.

Ich weiß nicht ob das mit HLSL auch funktioniert, ich glaube das geht mit HLSL und GLSL ned.