/******************************************************************************* * * Simple HLSL FX file * *******************************************************************************/ // structures and shaders ///////////////////// float4x4 wvIT : WorldViewInverseTranspose; float4x4 wvp : WorldViewProjection; float4x4 wv : WorldView; void mainVS( float4 vertex : POSITION0, float3 normal : NORMAL0, float4 tex : TEXCOORD0, out float4 position: POSITION0, out float3 eyeNormal : TEXCOORD0, out float3 eyeView : TEXCOORD1) { // Must write gl_Position for rasterization to be defined.... // position = mul( vertex, wvp); // Transform to shading space (we are going to shade in eyespace) // // eyeNormal = mul( normal, float3x3(wvIT)); eyeView = -mul( vertex, wv).xyz; } float3 lightDir = float3( 0.57735, 0.57735, 0.57735); float3 warmColor = float3( 0.3, 0.3, 0.0); float3 coolColor = float3( 0.0, 0.3, 0.6); float3 baseColor = float3( 0.8, 0.8, 0.8); float alpha = 0.25; float beta = 0.5; float factor = 0.6; float4 mainPS( float3 eyeNormal : TEXCOORD0, float3 eyeView : TEXCOORD1) : COLOR0 { float3 norm; float4 SurfColor; float3 Cool; float3 Warm; float Intensity; float3 hvec; float3 lightDirection = normalize(lightDir); // // Since the EyeNormal is getting interpolated, we // have to first restore it by normalizing it. // norm = normalize( eyeNormal ); float3 view = normalize(eyeView); // // Per fragment gooch lighting Intensity = dot ( norm, lightDirection ); // Gooch maps Intensity from (-1,1) to (0,1) Intensity = Intensity * 0.5 + 0.5; Cool = alpha * baseColor + coolColor; Warm = beta * baseColor + warmColor; SurfColor.rgb = factor * lerp( Cool, Warm, Intensity); // // Now, specular light.... hvec = normalize(lightDirection + view); Intensity = dot ( norm, hvec ); Intensity = max ( Intensity, 0.0 ); Intensity = pow ( Intensity, 32.0 ); SurfColor += 0.8* Intensity; SurfColor.a = 1.0; return SurfColor; } //////// techniques //////////////////////////// technique Gooch { pass p0 { VertexShader = compile vs_2_0 mainVS(); ZEnable = true; ZWriteEnable = true; ZFunc = LEqual; CullMode = Back; PixelShader = compile ps_2_0 mainPS(); } } technique Bad { pass p0 { VertexShader = compile vs_2_0 mainVS(); ZEnable = true; ZWriteEnable = true; ZFunc = Always; CullMode = Back; PixelShader = compile ps_2_0 mainPS(); } }