float cutNearness2;// 100.0 bool red; float alphaCounterStep; struct vsInputBushToAtlas { float4 pos : POSITION; float2 tex : TEXCOORD0; float2 texAtlas : TEXCOORD1; float3 normal : NORMAL; }; struct vsOutputBushToAtlas { float4 pos : POSITION; float2 tex : TEXCOORD0; float4 worldPos : TEXCOORD2; float3 normal : TEXCOORD3; float4 occProjPos : TEXCOORD4; }; vsOutputBushToAtlas vsRenderBushToAtlas(vsInputBushToAtlas input) { vsOutputBushToAtlas output = (vsOutputBushToAtlas)0; output.pos.xy=float2(2,2)*input.texAtlas-float2(1, 1); // output.pos.y=-1*output.pos.y; //Texture space to screen space. output.pos.z=0; output.pos.w=1; output.worldPos = mul(input.pos, modelToWorldMatrix); output.normal = mul(inverseTransposedModelToWorldMatrix, float4(input.normal, 0)); output.occProjPos = mul(output.worldPos, occWorldToProjMatrix); output.tex = input.tex; return output; } float4 psRenderBushToAtlas(vsOutputBushToAtlas input) : COLOR0 { // return float4(0.1, 0.0, 0.0, alphaCounterStep); input.occProjPos /= input.occProjPos.w; float2 occTexPos = mul(input.occProjPos.xyw, occProjToTexMatrix); input.normal = normalize(input.normal); float3 diff = lightPos - input.worldPos.xyz; float4 retVal = float4(0, 0, 0, 1); float3 diffDir = normalize(diff); float cosa = dot(diffDir, input.normal); float cosb = -dot(diffDir, normalize(lightDir)); float dist2 = dot(diff, diff); float visibility = tex2Dproj(depthMapSampler, float4(occTexPos, input.occProjPos.z, 1) ); float formFactor; if( cosa > 0.0) { if( cosb < 0.01 && cosb > -0.1) cosb = 0.01; float nearness = cosb * cosb * dist2; if( nearness < cutNearness2) { float e2 = dist2 * (1.0 - cosb * cosb); float dist2dash = e2 + cutNearness2; formFactor = cosa * sqrt(cutNearness2 / dist2dash ) / dist2dash; } else formFactor = cosa * cosb / dist2; if( cosb > 0.0) { retVal = float4(lightPower * formFactor * visibility , 1); } } retVal.a = alphaCounterStep; return retVal;// + float4(0.3, 0, 0, 1); } technique BushToAtlas{ pass P0 { VertexShader = compile vs_3_0 vsRenderBushToAtlas(); PixelShader = compile ps_3_0 psRenderBushToAtlas(); } }