struct VS_OUT { float4 hPosition : POSITION; float4 color : COLOR0; }; VS_OUT CauVS(float4 position : POSITION, float4 texCoord : TEXCOORD0, float4 color : COLOR0, uniform float4x4 worldView, uniform float4x4 Proj, uniform float resolution, uniform sampler2D PhotonHitMap : register(s0)) { VS_OUT OUT; float4 cPosition; float pixel = 1.0 / resolution; float2 uv = float2(position.x, 1.0 - position.y); float4 pos = tex2Dlod(PhotonHitMap, float4(uv,0,0)).rgba; if(pos.a == 0)//no photon hit { OUT.color = float4(0,0,0,0); OUT.hPosition = float4(0, 0, 100000000, 1); } else { float4 wPosition = float4(normalize(pos.xyz),1); cPosition = mul(worldView, wPosition); OUT.hPosition = mul(Proj, cPosition); float intensity = 0.5; //read four neighbours float valids = 0; float sumdist = 0; float dist; float4 pos1 = tex2Dlod(PhotonHitMap, float4(uv + float2(pixel, pixel),0,0)).rgba; if(pos1.a != 0) { dist = length(pos1.xyz - pos.xyz); valids++; sumdist += dist; } float4 pos2 = tex2Dlod(PhotonHitMap, float4(uv + float2(-pixel, pixel),0,0)).rgba; if(pos2.a != 0) { dist = length(pos2.xyz - pos.xyz); valids++; sumdist += dist; } float4 pos3 = tex2Dlod(PhotonHitMap, float4(uv + float2(pixel, -pixel),0,0)).rgba; if(pos3.a != 0) { dist = length(pos3.xyz - pos.xyz); valids++; sumdist += dist; } float4 pos4 = tex2Dlod(PhotonHitMap, float4(uv + float2(-pixel, -pixel),0,0)).rgba; if(pos4.a != 0) { dist = length(pos4.xyz - pos.xyz); valids++; sumdist += dist; } float avrdist = sumdist / valids; float maxdist = 0.1; intensity = max(maxdist - avrdist, 0.0) / maxdist; OUT.color = float4(1,1,1,intensity); } return OUT; } float4 CauPS(VS_OUT IN, uniform float3 color ):COLOR { return IN.color * float4(color, 1); }