float4x4 gWorld : WORLD; float4x4 gWorldViewProj : WORLDVIEWPROJECTION; float3 gLightDirection = float3(-0.577f, -0.577f, 0.577f); Texture2D gDiffuseMap; Texture2D gOpacityMap; bool gIgnoreLightDirection; SamplerState samLinear { Filter = MIN_MAG_MIP_LINEAR; AddressU = Wrap;// or Mirror or Clamp or Border AddressV = Wrap;// or Mirror or Clamp or Border }; RasterizerState Solid { FillMode = SOLID; CullMode = FRONT; }; struct VS_INPUT{ float3 pos : POSITION; float3 normal : NORMAL; float2 texCoord : TEXCOORD; }; struct VS_OUTPUT{ float4 pos : SV_POSITION; float3 normal : NORMAL; float2 texCoord : TEXCOORD; }; DepthStencilState EnableDepth { DepthEnable = TRUE; DepthWriteMask = ALL; }; RasterizerState NoCulling { CullMode = NONE; }; //-------------------------------------------------------------------------------------- // Vertex Shader //-------------------------------------------------------------------------------------- VS_OUTPUT VS(VS_INPUT input){ VS_OUTPUT output; // Step 1: convert position into float4 and multiply with matWorldViewProj output.pos = mul ( float4(input.pos,1.0f), gWorldViewProj ); // Step 2: rotate the normal: NO TRANSLATION // this is achieved by clipping the 4x4 to a 3x3 matrix, // thus removing the postion row of the matrix output.normal = normalize(mul(input.normal, (float3x3)gWorld)); output.texCoord = input.texCoord; return output; } //-------------------------------------------------------------------------------------- // Pixel Shader //-------------------------------------------------------------------------------------- float4 PS(VS_OUTPUT input) : SV_TARGET{ float opacity = gOpacityMap.Sample(samLinear, input.texCoord).r; clip(opacity - 0.1f); float4 diffuseColor = gDiffuseMap.Sample(samLinear, input.texCoord); float3 color_rgb = diffuseColor.rgb; //float color_a = diffuseColor.a; //HalfLambert Diffuse :) float diffuseStrength = .8; if (!gIgnoreLightDirection) { diffuseStrength = dot(input.normal, -gLightDirection); diffuseStrength = diffuseStrength * 0.5 + 0.5; diffuseStrength = saturate(diffuseStrength); } color_rgb = color_rgb * diffuseStrength; return float4(color_rgb, opacity); } BlendState EnableBlending { BlendEnable[0] = TRUE; DestBlend = INV_SRC_ALPHA; SrcBlend = SRC_ALPHA; }; //-------------------------------------------------------------------------------------- // Technique //-------------------------------------------------------------------------------------- technique11 Default { pass P0 { SetRasterizerState(NoCulling); SetDepthStencilState(EnableDepth, 0); SetBlendState(EnableBlending, float4(0.0f, 0.0f, 0.0f, 0.0f), 0xFFFFFFFF); SetVertexShader( CompileShader( vs_4_0, VS() ) ); SetGeometryShader( NULL ); SetPixelShader( CompileShader( ps_4_0, PS() ) ); } }