////////////////////////////////////////////// // CASTER PASS // // HEAT // ////////////////////////////////////////////// // vs_1_1 void HeatCaster_vp( // in float4 vPos: POSITION, float4 vNormal: NORMAL, // out out float4 oPos: POSITION, out float2 oNDotV: TEXCOORD0, // parameters uniform float4x4 worldViewProj, uniform float3 eyePosition // object space ) { float4 eyeDir = float4(eyePosition - vPos.xyz, 0); eyeDir = normalize(eyeDir); oPos = mul( worldViewProj, vPos ); oNDotV = clamp( dot( vNormal, eyeDir ), 0, 1 ); } // ps_2_0 float4 HeatCaster_fp( // input from vp float2 iNDotV: TEXCOORD0 ) : COLOR0 { return iNDotV.x; } ////////////////////////////////////////////// // CASTER PASS // // COLD // ////////////////////////////////////////////// // vs_1_1 void ColdCaster_vp( // in float4 vPos: POSITION, float4 vNormal: NORMAL, // out out float4 oPos: POSITION, out float2 oNDotV: TEXCOORD0, // parameters uniform float4x4 worldViewProj, uniform float3 eyePosition // object space ) { float4 eyeDir = float4(eyePosition - vPos.xyz, 0); eyeDir = normalize(eyeDir); oPos = mul( worldViewProj, vPos ); oNDotV = clamp( dot( vNormal, eyeDir ), 0, 1 ); } // ps_2_0 float4 ColdCaster_fp( // input from vp float2 iNDotV: TEXCOORD0 ) : COLOR0 { return iNDotV.x / 2; } ////////////////////////////////////////////// // PASS 1 - Light to heat conversion // ////////////////////////////////////////////// // ps_2_0 void LightToHeat_fp( // input from vp float4 inDiffuse: COLOR0, float2 inUV0: TEXCOORD0, // out out float4 outColor: COLOR0, // params uniform float4 random_fractions, uniform float4 heatBiasScale, uniform float4 depth_modulator, uniform sampler2D Input, // output of HeatVisionCaster_fp (NdotV) uniform sampler2D NoiseMap, uniform sampler2D HeatLookup ) { float depth, heat, interference; // Output constant color: depth = tex2D( Input, inUV0 ); depth *= (depth * depth_modulator); heat = (depth * heatBiasScale.y); // if (depth > 0) { interference = -0.5 + tex2D( NoiseMap, inUV0 + float2( random_fractions.x, random_fractions.y ) ); interference *= interference; interference *= 1 - heat; heat += interference;//+ heatBiasScale.x; } /* heatBias isn't used for now if (heat > 0) heat += heatBiasScale.x; */ // Clamp UVs heat = max( 0.005, min( 0.995, heat ) ); outColor = tex2D( HeatLookup, float2( heat, 0.f ) ); } ////////////////////////////////////////////// // PASS 2 - add simple blur (final pass) // ////////////////////////////////////////////// // ps_2_0 void Blur_fp( // input from vp float4 inDiffuse: COLOR0, float2 inUV0: TEXCOORD0, // out out float4 outColor: COLOR0, // parameters uniform sampler2D Input, // output of HeatVision_fp1 (HeatRenderTexture) uniform float4 blurAmount ) { int i; float4 tmpOutColor; float diffuseGlowFactor; const float2 offsets[4] = { /* // hazy blur -1.8, -1.8, -1.8, 1.8, 1.8, -1.8, 1.8, 1.8 */ /* // less-hazy blur -1.0, 2.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0 */ /* -0.326212, -0.405805, -0.840144, -0.073580, -0.695914, 0.457137, -0.203345, 0.620716 */ -0.3, 0.4, -0.3, -0.4, 0.3, -0.4, 0.3, 0.4 }; tmpOutColor = tex2D( Input, inUV0 ); // UV coords are in image space // calculate glow amount diffuseGlowFactor = 0.0113f * (2.0 - max( tmpOutColor.r, tmpOutColor.g )); // basic blur filter for (i = 0; i < 4; i++) { tmpOutColor += tex2D( Input, inUV0 + blurAmount.x * diffuseGlowFactor * offsets[i] ); } tmpOutColor *= 0.25; // TIPS (old-skool strikes again!) // Pay attention here! If you use the "out float4 outColor" directly // in your steps while creating the output color (like you remove // the "tmpOutColor" var and just use the "outColor" directly) // your pixel-color output IS CHANGING EACH TIME YOU DO AN ASSIGNMENT TOO! // A temporary variable, instead, acts like a per-pixel double buffer, and // best of all, lead to better performance. outColor = tmpOutColor; }