//----------------------------------------------------------------------------- // BasicEffect.fx // // Microsoft XNA Community Game Platform // Copyright (C) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- #include "Macros.fxh" DECLARE_TEXTURE(Texture, 0); BEGIN_CONSTANTS float4 DiffuseColor _vs(c0) _ps(c1) _cb(c0); float3 EmissiveColor _vs(c1) _ps(c2) _cb(c1); float3 SpecularColor _vs(c2) _ps(c3) _cb(c2); float SpecularPower _vs(c3) _ps(c4) _cb(c2.w); float3 DirLight0Direction _vs(c4) _ps(c5) _cb(c3); float3 DirLight0DiffuseColor _vs(c5) _ps(c6) _cb(c4); float3 DirLight0SpecularColor _vs(c6) _ps(c7) _cb(c5); float3 DirLight1Direction _vs(c7) _ps(c8) _cb(c6); float3 DirLight1DiffuseColor _vs(c8) _ps(c9) _cb(c7); float3 DirLight1SpecularColor _vs(c9) _ps(c10) _cb(c8); float3 DirLight2Direction _vs(c10) _ps(c11) _cb(c9); float3 DirLight2DiffuseColor _vs(c11) _ps(c12) _cb(c10); float3 DirLight2SpecularColor _vs(c12) _ps(c13) _cb(c11); float3 EyePosition _vs(c13) _ps(c14) _cb(c12); float3 FogColor _ps(c0) _cb(c13); float4 FogVector _vs(c14) _cb(c14); float4x4 World _vs(c19) _cb(c15); float3x3 WorldInverseTranspose _vs(c23) _cb(c19); MATRIX_CONSTANTS float4x4 WorldViewProj _vs(c15) _cb(c0); END_CONSTANTS #include "Structures.fxh" #include "Common.fxh" #include "Lighting.fxh" // Vertex shader: basic. VSOutput VSBasic(VSInput vin) { VSOutput vout; CommonVSOutput cout = ComputeCommonVSOutput(vin.Position); SetCommonVSOutputParams; return vout; } // Vertex shader: no fog. VSOutputNoFog VSBasicNoFog(VSInput vin) { VSOutputNoFog vout; CommonVSOutput cout = ComputeCommonVSOutput(vin.Position); SetCommonVSOutputParamsNoFog; return vout; } // Vertex shader: vertex color. VSOutput VSBasicVc(VSInputVc vin) { VSOutput vout; CommonVSOutput cout = ComputeCommonVSOutput(vin.Position); SetCommonVSOutputParams; vout.Diffuse *= vin.Color; return vout; } // Vertex shader: vertex color, no fog. VSOutputNoFog VSBasicVcNoFog(VSInputVc vin) { VSOutputNoFog vout; CommonVSOutput cout = ComputeCommonVSOutput(vin.Position); SetCommonVSOutputParamsNoFog; vout.Diffuse *= vin.Color; return vout; } // Vertex shader: texture. VSOutputTx VSBasicTx(VSInputTx vin) { VSOutputTx vout; CommonVSOutput cout = ComputeCommonVSOutput(vin.Position); SetCommonVSOutputParams; vout.TexCoord = vin.TexCoord; return vout; } // Vertex shader: texture, no fog. VSOutputTxNoFog VSBasicTxNoFog(VSInputTx vin) { VSOutputTxNoFog vout; CommonVSOutput cout = ComputeCommonVSOutput(vin.Position); SetCommonVSOutputParamsNoFog; vout.TexCoord = vin.TexCoord; return vout; } // Vertex shader: texture + vertex color. VSOutputTx VSBasicTxVc(VSInputTxVc vin) { VSOutputTx vout; CommonVSOutput cout = ComputeCommonVSOutput(vin.Position); SetCommonVSOutputParams; vout.TexCoord = vin.TexCoord; vout.Diffuse *= vin.Color; return vout; } // Vertex shader: texture + vertex color, no fog. VSOutputTxNoFog VSBasicTxVcNoFog(VSInputTxVc vin) { VSOutputTxNoFog vout; CommonVSOutput cout = ComputeCommonVSOutput(vin.Position); SetCommonVSOutputParamsNoFog; vout.TexCoord = vin.TexCoord; vout.Diffuse *= vin.Color; return vout; } // Vertex shader: vertex lighting. VSOutput VSBasicVertexLighting(VSInputNm vin) { VSOutput vout; CommonVSOutput cout = ComputeCommonVSOutputWithLighting(vin.Position, vin.Normal, 3); SetCommonVSOutputParams; return vout; } // Vertex shader: vertex lighting + vertex color. VSOutput VSBasicVertexLightingVc(VSInputNmVc vin) { VSOutput vout; CommonVSOutput cout = ComputeCommonVSOutputWithLighting(vin.Position, vin.Normal, 3); SetCommonVSOutputParams; vout.Diffuse *= vin.Color; return vout; } // Vertex shader: vertex lighting + texture. VSOutputTx VSBasicVertexLightingTx(VSInputNmTx vin) { VSOutputTx vout; CommonVSOutput cout = ComputeCommonVSOutputWithLighting(vin.Position, vin.Normal, 3); SetCommonVSOutputParams; vout.TexCoord = vin.TexCoord; return vout; } // Vertex shader: vertex lighting + texture + vertex color. VSOutputTx VSBasicVertexLightingTxVc(VSInputNmTxVc vin) { VSOutputTx vout; CommonVSOutput cout = ComputeCommonVSOutputWithLighting(vin.Position, vin.Normal, 3); SetCommonVSOutputParams; vout.TexCoord = vin.TexCoord; vout.Diffuse *= vin.Color; return vout; } // Vertex shader: one light. VSOutput VSBasicOneLight(VSInputNm vin) { VSOutput vout; CommonVSOutput cout = ComputeCommonVSOutputWithLighting(vin.Position, vin.Normal, 1); SetCommonVSOutputParams; return vout; } // Vertex shader: one light + vertex color. VSOutput VSBasicOneLightVc(VSInputNmVc vin) { VSOutput vout; CommonVSOutput cout = ComputeCommonVSOutputWithLighting(vin.Position, vin.Normal, 1); SetCommonVSOutputParams; vout.Diffuse *= vin.Color; return vout; } // Vertex shader: one light + texture. VSOutputTx VSBasicOneLightTx(VSInputNmTx vin) { VSOutputTx vout; CommonVSOutput cout = ComputeCommonVSOutputWithLighting(vin.Position, vin.Normal, 1); SetCommonVSOutputParams; vout.TexCoord = vin.TexCoord; return vout; } // Vertex shader: one light + texture + vertex color. VSOutputTx VSBasicOneLightTxVc(VSInputNmTxVc vin) { VSOutputTx vout; CommonVSOutput cout = ComputeCommonVSOutputWithLighting(vin.Position, vin.Normal, 1); SetCommonVSOutputParams; vout.TexCoord = vin.TexCoord; vout.Diffuse *= vin.Color; return vout; } // Vertex shader: pixel lighting. VSOutputPixelLighting VSBasicPixelLighting(VSInputNm vin) { VSOutputPixelLighting vout; CommonVSOutputPixelLighting cout = ComputeCommonVSOutputPixelLighting(vin.Position, vin.Normal); SetCommonVSOutputParamsPixelLighting; vout.Diffuse = float4(1, 1, 1, DiffuseColor.a); return vout; } // Vertex shader: pixel lighting + vertex color. VSOutputPixelLighting VSBasicPixelLightingVc(VSInputNmVc vin) { VSOutputPixelLighting vout; CommonVSOutputPixelLighting cout = ComputeCommonVSOutputPixelLighting(vin.Position, vin.Normal); SetCommonVSOutputParamsPixelLighting; vout.Diffuse.rgb = vin.Color.rgb; vout.Diffuse.a = vin.Color.a * DiffuseColor.a; return vout; } // Vertex shader: pixel lighting + texture. VSOutputPixelLightingTx VSBasicPixelLightingTx(VSInputNmTx vin) { VSOutputPixelLightingTx vout; CommonVSOutputPixelLighting cout = ComputeCommonVSOutputPixelLighting(vin.Position, vin.Normal); SetCommonVSOutputParamsPixelLighting; vout.Diffuse = float4(1, 1, 1, DiffuseColor.a); vout.TexCoord = vin.TexCoord; return vout; } // Vertex shader: pixel lighting + texture + vertex color. VSOutputPixelLightingTx VSBasicPixelLightingTxVc(VSInputNmTxVc vin) { VSOutputPixelLightingTx vout; CommonVSOutputPixelLighting cout = ComputeCommonVSOutputPixelLighting(vin.Position, vin.Normal); SetCommonVSOutputParamsPixelLighting; vout.Diffuse.rgb = vin.Color.rgb; vout.Diffuse.a = vin.Color.a * DiffuseColor.a; vout.TexCoord = vin.TexCoord; return vout; } // Pixel shader: basic. float4 PSBasic(PSInput pin) : SV_Target0 { float4 color = pin.Diffuse; ApplyFog(color, pin.Specular.w); return color; } // Pixel shader: no fog. float4 PSBasicNoFog(PSInputNoFog pin) : SV_Target0 { return pin.Diffuse; } // Pixel shader: texture. float4 PSBasicTx(PSInputTx pin) : SV_Target0 { float4 color = SAMPLE_TEXTURE(Texture, pin.TexCoord) * pin.Diffuse; ApplyFog(color, pin.Specular.w); return color; } // Pixel shader: texture, no fog. float4 PSBasicTxNoFog(PSInputTxNoFog pin) : SV_Target0 { return SAMPLE_TEXTURE(Texture, pin.TexCoord) * pin.Diffuse; } // Pixel shader: vertex lighting. float4 PSBasicVertexLighting(PSInput pin) : SV_Target0 { float4 color = pin.Diffuse; AddSpecular(color, pin.Specular.rgb); ApplyFog(color, pin.Specular.w); return color; } // Pixel shader: vertex lighting, no fog. float4 PSBasicVertexLightingNoFog(PSInput pin) : SV_Target0 { float4 color = pin.Diffuse; AddSpecular(color, pin.Specular.rgb); return color; } // Pixel shader: vertex lighting + texture. float4 PSBasicVertexLightingTx(PSInputTx pin) : SV_Target0 { float4 color = SAMPLE_TEXTURE(Texture, pin.TexCoord) * pin.Diffuse; AddSpecular(color, pin.Specular.rgb); ApplyFog(color, pin.Specular.w); return color; } // Pixel shader: vertex lighting + texture, no fog. float4 PSBasicVertexLightingTxNoFog(PSInputTx pin) : SV_Target0 { float4 color = SAMPLE_TEXTURE(Texture, pin.TexCoord) * pin.Diffuse; AddSpecular(color, pin.Specular.rgb); return color; } // Pixel shader: pixel lighting. float4 PSBasicPixelLighting(PSInputPixelLighting pin) : SV_Target0 { float4 color = pin.Diffuse; float3 eyeVector = normalize(EyePosition - pin.PositionWS.xyz); float3 worldNormal = normalize(pin.NormalWS); ColorPair lightResult = ComputeLights(eyeVector, worldNormal, 3); color.rgb *= lightResult.Diffuse; AddSpecular(color, lightResult.Specular); ApplyFog(color, pin.PositionWS.w); return color; } // Pixel shader: pixel lighting + texture. float4 PSBasicPixelLightingTx(PSInputPixelLightingTx pin) : SV_Target0 { float4 color = SAMPLE_TEXTURE(Texture, pin.TexCoord) * pin.Diffuse; float3 eyeVector = normalize(EyePosition - pin.PositionWS.xyz); float3 worldNormal = normalize(pin.NormalWS); ColorPair lightResult = ComputeLights(eyeVector, worldNormal, 3); color.rgb *= lightResult.Diffuse; AddSpecular(color, lightResult.Specular); ApplyFog(color, pin.PositionWS.w); return color; } VertexShader VSArray[20] = { compile vs_2_0 VSBasic(), compile vs_2_0 VSBasicNoFog(), compile vs_2_0 VSBasicVc(), compile vs_2_0 VSBasicVcNoFog(), compile vs_2_0 VSBasicTx(), compile vs_2_0 VSBasicTxNoFog(), compile vs_2_0 VSBasicTxVc(), compile vs_2_0 VSBasicTxVcNoFog(), compile vs_2_0 VSBasicVertexLighting(), compile vs_2_0 VSBasicVertexLightingVc(), compile vs_2_0 VSBasicVertexLightingTx(), compile vs_2_0 VSBasicVertexLightingTxVc(), compile vs_2_0 VSBasicOneLight(), compile vs_2_0 VSBasicOneLightVc(), compile vs_2_0 VSBasicOneLightTx(), compile vs_2_0 VSBasicOneLightTxVc(), compile vs_2_0 VSBasicPixelLighting(), compile vs_2_0 VSBasicPixelLightingVc(), compile vs_2_0 VSBasicPixelLightingTx(), compile vs_2_0 VSBasicPixelLightingTxVc(), }; int VSIndices[32] = { 0, // basic 1, // no fog 2, // vertex color 3, // vertex color, no fog 4, // texture 5, // texture, no fog 6, // texture + vertex color 7, // texture + vertex color, no fog 8, // vertex lighting 8, // vertex lighting, no fog 9, // vertex lighting + vertex color 9, // vertex lighting + vertex color, no fog 10, // vertex lighting + texture 10, // vertex lighting + texture, no fog 11, // vertex lighting + texture + vertex color 11, // vertex lighting + texture + vertex color, no fog 12, // one light 12, // one light, no fog 13, // one light + vertex color 13, // one light + vertex color, no fog 14, // one light + texture 14, // one light + texture, no fog 15, // one light + texture + vertex color 15, // one light + texture + vertex color, no fog 16, // pixel lighting 16, // pixel lighting, no fog 17, // pixel lighting + vertex color 17, // pixel lighting + vertex color, no fog 18, // pixel lighting + texture 18, // pixel lighting + texture, no fog 19, // pixel lighting + texture + vertex color 19, // pixel lighting + texture + vertex color, no fog }; PixelShader PSArray[10] = { compile ps_2_0 PSBasic(), compile ps_2_0 PSBasicNoFog(), compile ps_2_0 PSBasicTx(), compile ps_2_0 PSBasicTxNoFog(), compile ps_2_0 PSBasicVertexLighting(), compile ps_2_0 PSBasicVertexLightingNoFog(), compile ps_2_0 PSBasicVertexLightingTx(), compile ps_2_0 PSBasicVertexLightingTxNoFog(), compile ps_2_0 PSBasicPixelLighting(), compile ps_2_0 PSBasicPixelLightingTx(), }; int PSIndices[32] = { 0, // basic 1, // no fog 0, // vertex color 1, // vertex color, no fog 2, // texture 3, // texture, no fog 2, // texture + vertex color 3, // texture + vertex color, no fog 4, // vertex lighting 5, // vertex lighting, no fog 4, // vertex lighting + vertex color 5, // vertex lighting + vertex color, no fog 6, // vertex lighting + texture 7, // vertex lighting + texture, no fog 6, // vertex lighting + texture + vertex color 7, // vertex lighting + texture + vertex color, no fog 4, // one light 5, // one light, no fog 4, // one light + vertex color 5, // one light + vertex color, no fog 6, // one light + texture 7, // one light + texture, no fog 6, // one light + texture + vertex color 7, // one light + texture + vertex color, no fog 8, // pixel lighting 8, // pixel lighting, no fog 8, // pixel lighting + vertex color 8, // pixel lighting + vertex color, no fog 9, // pixel lighting + texture 9, // pixel lighting + texture, no fog 9, // pixel lighting + texture + vertex color 9, // pixel lighting + texture + vertex color, no fog }; int ShaderIndex = 0; Technique BasicEffect { Pass { VertexShader = (VSArray[VSIndices[ShaderIndex]]); PixelShader = (PSArray[PSIndices[ShaderIndex]]); } }