Re: Tunnel und Nebel
Verfasst: 13.02.2015, 01:37
Ich wollt mal den Ansatz versuchen, den Vorhang im Tunnel wegzublenden und hab mich dafür mal etwas mit Shadern beschäftigt. Nun hätte ich vermutet, dass das hier gehen sollte:
Es kommt aber ein Fehler, den ich nicht verstehe, und zwar führen in PS_OUTPUT die Kommandos Out.RGBA.r = In.fogFactor * nebelfarbe.r usw. zu einem Fehler. Setzt man die Werte dort einfach z.B. auf Out.RGBA.r = nebelfarbe.r + 0.5; dann kompiliert der Shader erstmal, natürlich nicht wirklich mit dem gewünschten Ergebnis. ich versteh nicht, warum In.fogFactor hier ein Problem macht.
Carsten
Code: Alles auswählen
// +++ globale Variablen - müssen vom Programmcode noch gesetzt werden! +++
float4x4 matWV: WORLDVIEW;
float4x4 matP: PROJECTION;
float4 nebelfarbe = 0.5;
float nebelstart = 0.01;
float nebelende = 10;
float4 auge;
texture t0 < string Name = "tiger.bmp"; >;
// +++ Variablen nur für EffectEdit +++
string XFile = "tiger.x";
// +++ VertexShader +++
struct VS_OUTPUT
{
float4 vDiffuse : COLOR;
float4 vPosition : POSITION;
float1 fogFactor : FOG;
};
struct VS_INPUT
{
float4 vDif : COLOR;
float3 vPos : POSITION;
};
VS_OUTPUT RenderVS( VS_INPUT In )
{
VS_OUTPUT Out;
float4 cameraPosition = mul(auge, matWV);
float4 v = mul(float4(In.vPos,1), matWV);
Out.vPosition = mul(v, (float4x4)matP );
Out.vDiffuse = In.vDif;
Out.fogFactor = saturate((nebelende - cameraPosition.z) / (nebelende - nebelstart));
return Out;
}
// +++ PixelShader +++
struct PS_OUTPUT
{
float4 RGBA: COLOR;
};
PS_OUTPUT RenderPS( VS_OUTPUT In )
{
PS_OUTPUT Out;
Out.RGBA.r = In.fogFactor * nebelfarbe.r;
Out.RGBA.g = In.fogFactor * nebelfarbe.g;
Out.RGBA.b = In.fogFactor * nebelfarbe.b;
Out.RGBA.a = In.fogFactor;
return Out;
}
// Technik(en) und Pass(es)
technique tec0
{
pass p0
{
VertexShader = compile vs_2_0 RenderVS();
PixelShader = compile ps_2_0 RenderPS();
}
}
Carsten