sampler indirectTexture: register(s0); sampler sourceTexture: register(s1); sampler visibilityTexture: register(s2); uniform float epsilonX; uniform float epsilonY; uniform float sourceTextureSize; uniform float numSamples; uniform float sqrtNumSamples; float4 main_fp(float2 texCoord: TEXCOORD0, float2 subTexCoord: TEXCOORD1): COLOR { float4 ocolor = float4(0.0, 0.0, 0.0, 0.0); float2 epsilon = float2(epsilonX, epsilonY); float4 value = tex2D(indirectTexture, subTexCoord).xyzw; float2 coords = texCoord - ( value.xy - epsilon ); if (value.w != 0.0) { float2 unifcoord; float2 scale; unifcoord = (texCoord - value.xy) * float2(sourceTextureSize, sourceTextureSize); scale = coords * float2(sourceTextureSize, sourceTextureSize) / float2(sqrtNumSamples, sqrtNumSamples); float2 newcoord = float2(1.0, 1.0) - value.zw + scale; ocolor = tex2D(sourceTexture, newcoord).xyzw; if (ocolor.w != 0.0) { float4 visibility = tex2D(visibilityTexture, subTexCoord).xyzw; float greyRange = 12.9107; float absGreyMin = abs(min(-6.47313, 0.0)); visibility.xyzw = (visibility.xyzw * float4(greyRange, greyRange, greyRange, greyRange)) - float4(absGreyMin, absGreyMin, absGreyMin, absGreyMin); float e = lerp(visibility.x, visibility.y, unifcoord.x); float f = lerp(visibility.w, visibility.z, unifcoord.x); float g = lerp(e, f, unifcoord.y); ocolor.xyz = g * ( ocolor.xyz ); } // Debugging values... //ocolor.xyz = float3( epsilon.x, epsilon.y, 0.0 ); //ocolor.xyz = float3( unifcoord.x, unifcoord.y, 0.0 ); //ocolor.xyz = float3( unifcoord.x, 0.0, 0.0 ); //ocolor.xyz = float3( 0.0, unifcoord.y, 0.0 ); //ocolor.xyz = float3( g, g, g ); //ocolor.xyz = visibility.xyz; //ocolor.w = 1.0; } return ocolor; }