#define SHADOW_EPSILON 0.3f #define reciproc 1.0f/512.0f #define textureSize 256.0f #define textureSize2 128.0f //Model view matrix uniform float4x4 modelview; //Model view inverse transpose matrix uniform float4x4 modelviewIT; //Model view projection matrix uniform float4x4 modelviewproj; //Shooter colors. uniform float4 Lshoot; //Current number of iterations. uniform float niteration; //The reciproc of resolution. uniform float recres2; //Random number. uniform float RandomNum; //The current search coordinates. uniform float2 searchCoords; //The first sum. uniform float firstsum; //The eye position. uniform float3 eyePos; //Py parameter. uniform float py; //Render full or half screen. uniform bool fullScreen; //The shininess parameter for specular. uniform float shininess; //Texture for the original visibility map. texture visibility_map; sampler VisMapSampler = sampler_state { Texture = ; MinFilter = Point; MagFilter = Point; MipFilter = None; //AddressU = Clamp; //AddressV = Clamp; }; //Texture for radiosity map. texture radiosity_map; sampler RadMapSampler = sampler_state { Texture = ; MinFilter = Point; MagFilter = Point; MipFilter = None; //AddressU = Clamp; //AddressV = Clamp; }; //Texure for actual radiosity map. texture act_radiosity_map; sampler ActRadMapSampler = sampler_state { Texture = ; MinFilter = Point; MagFilter = Point; MipFilter = None; //AddressU = Clamp; //AddressV = Clamp; }; //Texture for luminance. texture luminance_map; sampler LumMapSampler = sampler_state { Texture = ; MinFilter = Point; MagFilter = Point; MipFilter = None; //AddressU = Wrap; //AddressV = Wrap; }; //Texture for emission. texture emission_map; sampler EmissionMapSampler = sampler_state { Texture = ; MinFilter = Point; MagFilter = Point; MipFilter = None; //AddressU = Clamp; //AddressV = Clamp; }; //Texture for the sum of the mipmap levels. texture sum_map; sampler SumSampler = sampler_state { Texture = ; MinFilter = Point; MagFilter = Point; MipFilter = None; AddressU = Clamp; AddressV = Clamp; }; //Mipmap level texture texture mipmap; sampler MipmapSampler = sampler_state { Texture = ; MinFilter = Point; MagFilter = Point; MipFilter = None; AddressU = Clamp; AddressV = Clamp; }; //The BRDF map. texture BRDFMap; sampler BRDFMapSampler = sampler_state { Texture = ; MinFilter = Linear; MagFilter = Linear; MipFilter = None; AddressU = Clamp; AddressV = Clamp; }; //The specular map. texture Specular_Map; sampler SpecularMapSampler = sampler_state { Texture = ; MinFilter = Linear; MagFilter = Linear; MipFilter = None; AddressU = Clamp; AddressV = Clamp; }; //The map for the final rendered image. texture final_map; sampler FinalMapSampler = sampler_state { Texture = ; MinFilter = Point; MagFilter = Point; MipFilter = None; AddressU = Clamp; AddressV = Clamp; }; //Multiple render target PS output for 2 targets. struct MRT_Output_2 { float4 firstcolor : COLOR0; float4 secondcolor : COLOR1; }; //Vertex shader input structure. struct inputs { float4 position : POSITION; float4 patch_index : COLOR0; float2 texcoord : TEXCOORD0; float3 brdf : TEXCOORD1; float4 emission : TEXCOORD2; float4 normal : NORMAL; }; //Complex vertex shader output structure. struct vs_outputs { float4 hposition : POSITION; float2 texcoord : TEXCOORD0; float4 viscoord : TEXCOORD1; float4 emission : TEXCOORD2; float3 x : TEXCOORD3; float3 brdf : TEXCOORD4; float3 normal : TEXCOORD5; }; //Simple vertex shader output for initializing BRDF maps. struct text_vs_output{ float4 hposition:POSITION; float2 texcoord:TEXCOORD0; }; //Renders vertex output to a texture atlas. text_vs_output BRDFMAP_VS(inputs IN){ text_vs_output OUT; OUT.hposition.xy = 2*IN.texcoord.xy-float2(1,1); OUT.hposition.z = 0; OUT.hposition.w = 1; OUT.texcoord.x = IN.texcoord.x+reciproc; OUT.texcoord.y = 1-IN.texcoord.y+reciproc; return(OUT); } //Pixel shader for BRDF atlas rendering. float4 BRDFMAP_PS(float4 texcoord:TEXCOORD0):COLOR{ float4 retval; retval.rgb=tex2D(BRDFMapSampler,texcoord).rgb/3.1415f; retval.a=shininess; return retval; } //Renders visibility map. vs_outputs ORIGVISMAP_VS( inputs IN) { vs_outputs OUT; OUT.hposition=float4(0.0f,0.0f,0.0f,0.0f); OUT.texcoord=float2(0.0f,0.0f); OUT.viscoord=float4(0.0f,0.0f,0.0f,0.0f); OUT.emission=float4(0.0f,0.0f,0.0f,0.0f); OUT.x =float3(0.0f,0.0f,0.0f); OUT.brdf=float3(0.0f,0.0f,0.0f); OUT.normal=float3(0.0f,0.0f,0.0f); OUT.hposition.xy = 2*IN.texcoord.xy-float2(1,1); OUT.hposition.z = 0; OUT.hposition.w = 1; OUT.emission.rgb = IN.patch_index.xyz; OUT.emission.a = 1.0f; OUT.viscoord=IN.emission.rgba; return(OUT); } //Renders emission map. vs_outputs EMISSION_VS( inputs IN) { vs_outputs OUT; OUT.hposition=float4(0.0f,0.0f,0.0f,0.0f); OUT.texcoord=float2(0.0f,0.0f); OUT.viscoord=float4(0.0f,0.0f,0.0f,0.0f); OUT.emission=float4(0.0f,0.0f,0.0f,0.0f); OUT.x =float3(0.0f,0.0f,0.0f); OUT.brdf=float3(0.0f,0.0f,0.0f); OUT.normal=float3(0.0f,0.0f,0.0f); OUT.hposition.xy = 2 * IN.texcoord.xy - float2(1, 1); OUT.hposition.z = 0; OUT.hposition.w = 1; OUT.emission.rgba = IN.emission.rgba; return(OUT); } //Renders iterated visibility map. vs_outputs ITVIS_VS( inputs IN) { vs_outputs OUT; OUT.hposition=float4(0.0f,0.0f,0.0f,0.0f); OUT.texcoord=float2(0.0f,0.0f); OUT.viscoord=float4(0.0f,0.0f,0.0f,0.0f); OUT.emission=float4(0.0f,0.0f,0.0f,0.0f); OUT.x =float3(0.0f,0.0f,0.0f); OUT.brdf=float3(0.0f,0.0f,0.0f); OUT.normal=float3(0.0f,0.0f,0.0f); OUT.hposition = mul(IN.position,modelviewproj); OUT.emission.r = OUT.hposition.z; OUT.emission.g = abs(dot(IN.normal,normalize(IN.position-eyePos))); //cosine return(OUT); } //Vertex shader for rendering one shot from the current shooter. vs_outputs SHOOT_VS( inputs IN) { vs_outputs OUT; OUT.hposition=float4(0.0f,0.0f,0.0f,0.0f); OUT.texcoord=float2(0.0f,0.0f); OUT.viscoord=float4(0.0f,0.0f,0.0f,0.0f); OUT.emission=float4(0.0f,0.0f,0.0f,0.0f); OUT.x =float3(0.0f,0.0f,0.0f); OUT.brdf=float3(0.0f,0.0f,0.0f); OUT.normal=float3(0.0f,0.0f,0.0f); OUT.hposition.xy = 2 * IN.texcoord.xy - float2(1, 1); OUT.hposition.z = 0; OUT.hposition.w = 1; OUT.texcoord.x = IN.texcoord.x+reciproc; OUT.texcoord.y = 1-IN.texcoord.y+reciproc; OUT.x = mul(IN.position, modelview).xyz; OUT.normal = mul(IN.normal, modelviewIT).xyz; OUT.emission.rgba = IN.emission.rgba; OUT.brdf = IN.brdf; OUT.viscoord = mul(IN.position,modelviewproj); return OUT; } //Rendering the final output. vs_outputs FINAL_VS( inputs IN) { vs_outputs OUT; OUT.hposition=float4(0.0f,0.0f,0.0f,0.0f); OUT.texcoord=float2(0.0f,0.0f); OUT.viscoord=float4(0.0f,0.0f,0.0f,0.0f); OUT.emission=float4(0.0f,0.0f,0.0f,0.0f); OUT.x =float3(0.0f,0.0f,0.0f); OUT.brdf=float3(0.0f,0.0f,0.0f); OUT.normal=float3(0.0f,0.0f,0.0f); OUT.hposition.xyzw = mul(IN.position,modelviewproj).xyzw; OUT.texcoord.x = IN.texcoord.x; OUT.texcoord.y = 1.0f-IN.texcoord.y; return OUT; } //Rendering a shot from the current shooter. float4 SHOOT_PS( float2 texcoord : TEXCOORD0, float4 viscoord : TEXCOORD1, float4 emission : TEXCOORD2, float3 x : TEXCOORD3, float3 brdf : TEXCOORD4, float3 xnormal : TEXCOORD5 ) : COLOR { float3 ytox = normalize( x ); // direction from y to x float xydist2 = dot( x, x ); // |x - y|^2 float costhetax = dot(xnormal, -ytox); //cosine(thetax) if(costhetax<0.0f) costhetax=0.0f; float costhetay = (fullScreen) ? ytox.z : ytox.y; //cosine(thetay) is fullscreen side of the visibility hemicube? if(costhetay<0.0f) costhetay=0.0f; if(xydist2<1.0f) xydist2 = 1.0f; float G = costhetax * costhetay / (xydist2+4.0f*Lshoot.w); //Geometry factor. Uniform disc method. float3 Lref = Lshoot.xyz * G; float visible; float2 depthmap; float2 viscoord2=(viscoord.xy/viscoord.w+1)/2; viscoord2.y=1-viscoord2.y+reciproc; viscoord2.x+=reciproc; float depth=viscoord.z; float yLimit= (fullScreen)? 1 :0.5; if((viscoord2.x>=0)&&(viscoord2.x<=1)&&(viscoord2.y>=0)&&(viscoord2.y