Tunnel und Nebel

Grafik, Musik, Sound, Spieledesign, Spielmechanik, Story Writing und sonstiger kreativer Kram, der nichts mit Programmieren zu tun hat.

Re: Tunnel und Nebel

Beitragvon Carsten » 13.02.2015, 02: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:

Code: Ansicht erweitern :: 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();
}
}


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
Carsten
 
Beiträge: 11
Registriert: 08.04.2003, 18:35

Re: Tunnel und Nebel

Beitragvon Schrompf » 13.02.2015, 13:21

Das sagt Dir evtl. die konkrete Fehlermeldung, die Dir der Compiler ausgespuckt hat.
Häuptling von Dreamworlds. Baut an was Neuem. Hilft nebenbei nur höchst selten an der Open Asset Import Library mit.
Benutzeravatar
Schrompf
Thomas Ziegenhagen
Moderator
 
Beiträge: 3640
Registriert: 26.02.2009, 00:44
Wohnort: Dresden
Benutzertext: Lernt nur selten dazu

Re: Tunnel und Nebel

Beitragvon Carsten » 13.02.2015, 14:41

Die Fehler haben leider die von MS gewohnte Aussagekraft:

....\nebel.fx(88): ID3DXEffectCompiler::CompileEffect: There was an error compiling expression
ID3DXEffectCompiler: Compilation failed

Carsten
Carsten
 
Beiträge: 11
Registriert: 08.04.2003, 18:35

Re: Tunnel und Nebel

Beitragvon Zudomon » 13.02.2015, 15:35

Kann dir auf die schnelle leider nicht helfen, weil ich gleich weg muss... allerdings ist mir aufgefallen, dass du den Pixelshader ein wenig optimierter schreiben kannst. Weniger code heißt ja auch manchmal weniger Fehlerquellen:

Code: Ansicht erweitern :: Alles auswählen
// +++ PixelShader +++
float4 RenderPS( VS_OUTPUT In )
{
float4 c = In.fogFactor;
c.rgb *= nebelfarbe;
return c;
}

Nicht getestet... also ohne Gewähr :D
Bild
Benutzeravatar
Zudomon
Establishment
 
Beiträge: 2077
Registriert: 25.03.2009, 08:20

Re: Tunnel und Nebel

Beitragvon Carsten » 13.02.2015, 16:00

ja, optimiert ist das nicht im Ansatz. hab's extra "aufgedröselt", um die Fehler besser eingrenzen zu können.

Carsten
Carsten
 
Beiträge: 11
Registriert: 08.04.2003, 18:35

Re: Tunnel und Nebel

Beitragvon Schrompf » 13.02.2015, 16:21

Mit dem Effects Framework kenne ich mich leider nicht aus, ich schreib meine Shader immer direkt. Ich bin aber halbwegs sicher, dass man da irgendwo vorher auch ne konkrete Fehlermeldung abgreifen kann. Zudomons kurzer Code-Schnippsel würde z.b. eine Warnung "Implicit truncation of vector" generieren, weil der Code einen float4 nebelfarbe mit einem float3 c.rgb multipliziert. OpenGL würde Dich an der Stelle schon geiseln, weil es nicht erraten kann, welche drei Komponenten von den 4 verfügbaren es für die Multiplikation verwenden soll.

Ich will damit sagen, dass Microsoft in diesem Fall keine Schimpfe verdient - der Shader-Compiler ist normalerweise sehr ausführlich bei Fehlermeldungen und Warnungen. Die Fehler, die Dich interessieren, sind aber wahrscheinlich irgendwo in einem Zwischenschritt des Effect Frameworks versteckt. Keine Ahung, wie Du da rankommst, aber die Doku kennt sicher einen Weg.
Häuptling von Dreamworlds. Baut an was Neuem. Hilft nebenbei nur höchst selten an der Open Asset Import Library mit.
Benutzeravatar
Schrompf
Thomas Ziegenhagen
Moderator
 
Beiträge: 3640
Registriert: 26.02.2009, 00:44
Wohnort: Dresden
Benutzertext: Lernt nur selten dazu

Re: Tunnel und Nebel

Beitragvon Krishty » 13.02.2015, 19:00

Mit SM 2.0:
ERROR 0:19: error X4502: invalid ps_2_0 input semantic 'POSITION'

Mit SM 3.0 kompiliert der hier gut.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
 
Beiträge: 6193
Registriert: 26.02.2009, 12:18
Benutzertext: state is the enemy

Re: Tunnel und Nebel

Beitragvon Carsten » 16.02.2015, 22:00

Danke für den Hinweis, bei mir auch. Wie kommt denn das?

Hab's jetzt zum Laufen bekommen mit diesem Code:

Code: Ansicht erweitern :: Alles auswählen
// Simples Sample

// +++ globale Variablen - müssen vom Programmcode noch gesetzt werden! +++
float4x4 matWV: WORLDVIEW;
float4x4 matP: PROJECTION;
float4 nebelfarbe = 0.5;
float nebeldichte = 0.5;
float3 auge;

// +++ VertexShader +++
struct VS_OUTPUT
{
float4 vPosition : POSITION;
float1 fogFactor: FOG;
};


struct VS_INPUT
{
float3 vPos : POSITION;
float3 vNormal: NORMAL;
float2 vTex0: TEXCOORD0;
};


VS_OUTPUT RenderVS( VS_INPUT In )
{
VS_OUTPUT Out;
float4 cameraPosition = mul(float4(auge,1), matWV);
float4 v = mul(float4(In.vPos,1), matWV);
Out.vPosition = mul(v, matP );
Out.fogFactor = 1 - (1 / exp(Out.vPosition.z * nebeldichte));

return Out;
}


// +++ PixelShader +++
struct PS_OUTPUT
{
float4 RGBA: COLOR;
};


PS_OUTPUT RenderPS( VS_OUTPUT In )
{
PS_OUTPUT Out;

float4 c = 0;
Out.RGBA.r = c.r * (1-In.fogFactor) + nebelfarbe.r * In.fogFactor;
Out.RGBA.g = c.g * (1-In.fogFactor) + nebelfarbe.g * In.fogFactor;
Out.RGBA.b = c.b * (1-In.fogFactor) + nebelfarbe.b * In.fogFactor;
Out.RGBA.a = In.fogFactor;
return Out;
}


// Technik(en) und Pass(es)
technique nebelwand
{
pass p0
{
VertexShader = compile vs_3_0 RenderVS();
PixelShader = compile ps_3_0 RenderPS();
}
}
Carsten
 
Beiträge: 11
Registriert: 08.04.2003, 18:35

Vorherige

Zurück zu Gamedesign und Kreatives

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron