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?
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?