#include "pixel_utils.cg" //#define half float //#define CLIP_LIGHTING #define CLIP_SPOT_LIGHTING #ifdef FB_PS3 #pragma texformat default RGBA8 #endif //#define USE_3D //#define MORE_ACCURATE // Inaccurate hack //#define FAKE_GAMME_CORRECTION // Combatibility #define INCORRECT_VIEW_VECTOR // Utils .. half3 unapplyTextureGamma(half3 color) { return sqrt(color); } half3 applyTextureGamma(half3 color) { return color * color; } half3 getAmbientSample( sampler2D DEFERRED_TEXTURE1, sampler2D DEFERRED_TEXTURE2, sampler2D DEFERRED_TEXTURE3, half2 texCoord, half3 GLOBAL_AMBIENT_COLOR1, half3 GLOBAL_AMBIENT_COLOR2, half3 HEMI_DIR, half3 FOG_COLOR #ifdef MORE_ACCURATE ,sampler2D DEFERRED_TEXTURE4 #endif ) { half4 deferredSample1 = tex2D(DEFERRED_TEXTURE1, texCoord); half4 deferredSample2 = tex2D(DEFERRED_TEXTURE2, texCoord); half4 deferredSample3 = tex2D(DEFERRED_TEXTURE3, texCoord); half3 diffuseColor = deferredSample1.xyz; #ifdef FAKE_GAMME_CORRECTION diffuseColor = unapplyTextureGamma(diffuseColor); #endif #ifdef MORE_ACCURATE half3 normal; normal.x = decodeFloat(deferredSample2.xy); normal.y = decodeFloat(deferredSample2.zw); normal.z = deferredSample1.w; normal = (normal * half(2.0)) - half(1.0); normal.z = sqrt(1.0 - normal.x*normal.x - normal.y*normal.y) * normal.z; #else half3 normal = (deferredSample2.xyz * half(2.0)) - half(1.0); #endif half3 upColor = GLOBAL_AMBIENT_COLOR1.xyz + deferredSample3.w; half3 downColor = GLOBAL_AMBIENT_COLOR2.xyz + deferredSample3.w; half lerpValue = (dot(normal, HEMI_DIR) * half(0.5)) + half(0.5); half3 lightValue = lerp(downColor, upColor, lerpValue); half3 result = diffuseColor * lightValue; #ifdef FAKE_GAMME_CORRECTION result = applyTextureGamma(result); #endif return lerp(half3(FOG_COLOR.xyz), result, deferredSample3.z); } void ambient ( float2 inTexCoord : TEXCOORD0, float3 hemiDir : TEXCOORD1, uniform float4 GLOBAL_AMBIENT_COLOR1, uniform float4 GLOBAL_AMBIENT_COLOR2, uniform sampler2D DEFERRED_TEXTURE1, uniform sampler2D DEFERRED_TEXTURE2, uniform sampler2D DEFERRED_TEXTURE3, uniform float4 FOG_COLOR, #if DEFERRED_SAMPLE_AMOUNT >= 2 uniform float4 DEFERRED_TEXTURE_OFFSET, #endif #ifdef MORE_ACCURATE uniform sampler2D DEFERRED_TEXTURE4, #endif #ifdef FB_PS3 out half4 oColor : COLOR) #else out float4 oColor : COLOR) #endif { half2 texCoord = inTexCoord; half3 finalColor = getAmbientSample(DEFERRED_TEXTURE1, DEFERRED_TEXTURE2, DEFERRED_TEXTURE3, texCoord.xy, GLOBAL_AMBIENT_COLOR1.xyz, GLOBAL_AMBIENT_COLOR2.xyz, hemiDir, FOG_COLOR.xyz #ifdef MORE_ACCURATE ,DEFERRED_TEXTURE4 #endif ); #if DEFERRED_SAMPLE_AMOUNT >= 2 finalColor += getAmbientSample(DEFERRED_TEXTURE1, DEFERRED_TEXTURE2, DEFERRED_TEXTURE3, texCoord.xy + half2(DEFERRED_TEXTURE_OFFSET.x, 0),GLOBAL_AMBIENT_COLOR1.xyz, GLOBAL_AMBIENT_COLOR2.xyz, hemiDir, FOG_COLOR.xyz #ifdef MORE_ACCURATE ,DEFERRED_TEXTURE4 #endif ); #endif #if DEFERRED_SAMPLE_AMOUNT >= 3 finalColor += getAmbientSample(DEFERRED_TEXTURE1, DEFERRED_TEXTURE2, DEFERRED_TEXTURE3, texCoord.xy + half2(0, DEFERRED_TEXTURE_OFFSET.y), GLOBAL_AMBIENT_COLOR1.xyz, GLOBAL_AMBIENT_COLOR2.xyz, hemiDir, FOG_COLOR.xyz #ifdef MORE_ACCURATE ,DEFERRED_TEXTURE4 #endif ); #endif #if DEFERRED_SAMPLE_AMOUNT >= 4 finalColor += getAmbientSample(DEFERRED_TEXTURE1, DEFERRED_TEXTURE2, DEFERRED_TEXTURE3, texCoord.xy + half2(DEFERRED_TEXTURE_OFFSET.x, DEFERRED_TEXTURE_OFFSET.y), GLOBAL_AMBIENT_COLOR1.xyz, GLOBAL_AMBIENT_COLOR2.xyz, hemiDir, FOG_COLOR.xyz #ifdef MORE_ACCURATE ,DEFERRED_TEXTURE4 #endif ); #endif #if DEFERRED_SAMPLE_AMOUNT == 2 finalColor *= 0.5; #elif DEFERRED_SAMPLE_AMOUNT == 3 finalColor *= 0.33333; #elif DEFERRED_SAMPLE_AMOUNT == 4 finalColor *= 0.25; #endif oColor.xyz = finalColor; #ifndef FB_PS3 oColor.w = 1.0; #endif } void ao ( float2 texCoord : TEXCOORD0, uniform sampler2D AO_SOURCE_TEXTURE, uniform sampler2D DEFERRED_TEXTURE3, #ifdef FB_PS3 out half4 oColor : COLOR) #else out float4 oColor : COLOR) #endif { half4 deferredSample3 = tex2D(DEFERRED_TEXTURE3, texCoord); //half4 aoSample = tex2D(AO_SOURCE_TEXTURE, texCoord * half(0.5)); half aoSample = tex2D(AO_SOURCE_TEXTURE, texCoord * half(0.5)).r; //aoSample *= aoSample; //oColor.xyz = aoSample.xyz; oColor.xyz = saturate(aoSample + (half(1.0) - deferredSample3.z)); half3 cullColor = half(0.95) - oColor.xyz; clip(cullColor.x + cullColor.y + cullColor.z); #ifndef FB_PS3 oColor.w = 1.0; #endif } half3 getSpotlightSample( sampler2D DEFERRED_TEXTURE1, sampler2D DEFERRED_TEXTURE2, sampler2D DEFERRED_TEXTURE3, half4 texCoord, float4 clipPosition, half3 lightPosition, half3 lightDirection, sampler2D SPOT_PROJECTION_TEXTURE, sampler2D SPOT_FADE_TEXTURE, float4x4 SPOT_PROJECTION_TEXTURE_TM, half4 CAMERA_CLIP_PLANES, half4 SPOT_COLOR #ifdef USE_3D ,float4x4 INVERSE_PROJECTION #endif #ifdef MORE_ACCURATE ,sampler2D DEFERRED_TEXTURE4 #endif ) { half2 tc = texCoord.xy / texCoord.w; half4 deferredSample1 = tex2D(DEFERRED_TEXTURE1, tc); half4 deferredSample2 = tex2D(DEFERRED_TEXTURE2, tc); half4 deferredSample3 = tex2D(DEFERRED_TEXTURE3, tc); /* half4 deferredSample1 = tex2Dproj(DEFERRED_TEXTURE1, texCoord.xyw); half4 deferredSample2 = tex2Dproj(DEFERRED_TEXTURE2, texCoord.xyw); half4 deferredSample3 = tex2Dproj(DEFERRED_TEXTURE3, texCoord.xyw); */ half3 diffuseColor = deferredSample1.xyz; #ifdef FAKE_GAMME_CORRECTION diffuseColor = unapplyTextureGamma(diffuseColor); #endif #ifdef MORE_ACCURATE half3 normal; normal.x = decodeFloat(deferredSample2.xy); normal.y = decodeFloat(deferredSample2.zw); normal.z = deferredSample1.w; normal = (normal * half(2.0)) - half(1.0); normal.z = sqrt(1.0 - normal.x*normal.x - normal.y*normal.y) * normal.z; float4 deferredSample4 = tex2Dproj(DEFERRED_TEXTURE4, texCoord.xyw); float depth = decodeFloat3(deferredSample4.xyz); #else half3 normal = (deferredSample2.xyz * half(2.0)) - half(1.0); float depth = decodeFloat(float2(deferredSample1.w, deferredSample2.w)); #endif #ifdef USE_3D float4 texView; texView.xy = clipPosition.xy; texView.z = depth; texView.w = 1.0; texView.xy /= clipPosition.w; texView.xy *= depth; texView = mul(INVERSE_PROJECTION, texView); float3 viewPosition = texView.xyz / texView.w; half3 viewVector = normalize(viewPosition); #else clipPosition /= clipPosition.w; half3 viewPosition = half3(clipPosition); viewPosition.z = 1.0; viewPosition *= depth * CAMERA_CLIP_PLANES.y; half3 viewVector = normalize(clipPosition.xyz); #endif half3 lightVector = lightPosition - viewPosition; half lightFade = saturate(dot(lightVector, -lightDirection) * half(SPOT_COLOR.w)); lightFade = tex2D(SPOT_FADE_TEXTURE, half2(lightFade, lightFade)).x; half lightDot = saturate(dot(normal, -lightDirection)); half lightAmount = lightDot; #ifdef USE_SPECULAR half3 specVector = reflect(normalize(viewVector), normal); half spec = dot(specVector, -lightDirection); if(spec > 0.001) { spec = pow(spec, deferredSample3.y * half(96)) * deferredSample3.x * half(64); lightAmount += spec; } #endif float4 spotCoordinate = mul(SPOT_PROJECTION_TEXTURE_TM, float4(viewPosition, 1.0)); float4 spotTex = tex2Dproj(SPOT_PROJECTION_TEXTURE, spotCoordinate.xyw); //return frac(viewPosition.x * 10.0); //return frac(spotCoordinate.xyz * 1.0 / spotCoordinate.w); //half4 spotTex = tex2D(SPOT_PROJECTION_TEXTURE, viewPosition.xy); //return spotTex.xyz; lightAmount *= lightFade * deferredSample3.z; half3 result = lightAmount * diffuseColor * half3(SPOT_COLOR.xyz) * spotTex.xyz; #ifdef FAKE_GAMME_CORRECTION result = applyTextureGamma(result); #endif return result; } void spotLight ( float4 inTexCoord : TEXCOORD0, float4 clipPosition : TEXCOORD1, float3 lightPosition : TEXCOORD2, float3 lightDirection : TEXCOORD3, #ifdef USE_3D uniform float4x4 INVERSE_PROJECTION, #endif #ifdef MORE_ACCURATE uniform sampler2D DEFERRED_TEXTURE4, #endif uniform sampler2D DEFERRED_TEXTURE1, uniform sampler2D DEFERRED_TEXTURE2, uniform sampler2D DEFERRED_TEXTURE3, uniform sampler2D SPOT_PROJECTION_TEXTURE, uniform sampler2D SPOT_FADE_TEXTURE, uniform float4x4 SPOT_PROJECTION_TEXTURE_TM, uniform float4 CAMERA_CLIP_PLANES, uniform float4 SPOT_COLOR, #if DEFERRED_SAMPLE_AMOUNT >= 2 uniform float4 DEFERRED_TEXTURE_OFFSET, #endif #ifdef FB_PS3 out half4 oColor : COLOR) #else out float4 oColor : COLOR) #endif { half4 texCoord = inTexCoord; half3 finalColor = getSpotlightSample(DEFERRED_TEXTURE1, DEFERRED_TEXTURE2, DEFERRED_TEXTURE3, texCoord, clipPosition, lightPosition, lightDirection, SPOT_PROJECTION_TEXTURE, SPOT_FADE_TEXTURE, SPOT_PROJECTION_TEXTURE_TM, CAMERA_CLIP_PLANES, SPOT_COLOR #ifdef USE_3D ,INVERSE_PROJECTION #endif #ifdef MORE_ACCURATE ,DEFERRED_TEXTURE4 #endif ); #if DEFERRED_SAMPLE_AMOUNT >= 2 finalColor += getSpotlightSample(DEFERRED_TEXTURE1, DEFERRED_TEXTURE2, DEFERRED_TEXTURE3, texCoord + half4(DEFERRED_TEXTURE_OFFSET.x,0,0,0) * texCoord.w, clipPosition, lightPosition, lightDirection, SPOT_PROJECTION_TEXTURE, SPOT_FADE_TEXTURE, SPOT_PROJECTION_TEXTURE_TM, CAMERA_CLIP_PLANES, SPOT_COLOR #ifdef USE_3D ,INVERSE_PROJECTION #endif #ifdef MORE_ACCURATE ,DEFERRED_TEXTURE4 #endif ); #endif #if DEFERRED_SAMPLE_AMOUNT >= 3 finalColor += getSpotlightSample(DEFERRED_TEXTURE1, DEFERRED_TEXTURE2, DEFERRED_TEXTURE3, texCoord + half4(0, DEFERRED_TEXTURE_OFFSET.y, 0, 0) * texCoord.w, clipPosition, lightPosition, lightDirection, SPOT_PROJECTION_TEXTURE, SPOT_FADE_TEXTURE, SPOT_PROJECTION_TEXTURE_TM, CAMERA_CLIP_PLANES, SPOT_COLOR #ifdef USE_3D ,INVERSE_PROJECTION #endif #ifdef MORE_ACCURATE ,DEFERRED_TEXTURE4 #endif ); #endif #if DEFERRED_SAMPLE_AMOUNT >= 4 finalColor += getSpotlightSample(DEFERRED_TEXTURE1, DEFERRED_TEXTURE2, DEFERRED_TEXTURE3, texCoord + half4(DEFERRED_TEXTURE_OFFSET.x, DEFERRED_TEXTURE_OFFSET.y, 0, 0) * texCoord.w, clipPosition, lightPosition, lightDirection, SPOT_PROJECTION_TEXTURE, SPOT_FADE_TEXTURE, SPOT_PROJECTION_TEXTURE_TM, CAMERA_CLIP_PLANES, SPOT_COLOR #ifdef USE_3D ,INVERSE_PROJECTION #endif #ifdef MORE_ACCURATE ,DEFERRED_TEXTURE4 #endif ); #endif #if DEFERRED_SAMPLE_AMOUNT == 2 finalColor *= 0.5; #elif DEFERRED_SAMPLE_AMOUNT == 3 finalColor *= 0.33333; #elif DEFERRED_SAMPLE_AMOUNT == 4 finalColor *= 0.25; #endif #ifdef CLIP_SPOT_LIGHTING clip(finalColor.x + finalColor.y + finalColor.z - 0.01); #endif oColor.xyz = finalColor; #ifndef FB_PS3 oColor.w = 1.0; #endif } half3 getPointlightSample( sampler2D DEFERRED_TEXTURE1, sampler2D DEFERRED_TEXTURE2, sampler2D DEFERRED_TEXTURE3, half4 texCoord, float4 clipPosition, half3 lightPosition, half4 CAMERA_CLIP_PLANES, half4 LIGHT_COLOR1 #ifdef USE_3D ,float4x4 INVERSE_PROJECTION #endif #ifdef MORE_ACCURATE ,sampler2D DEFERRED_TEXTURE4 #endif ) { half2 tc = texCoord.xy / texCoord.w; half4 deferredSample1 = tex2D(DEFERRED_TEXTURE1, tc); half4 deferredSample2 = tex2D(DEFERRED_TEXTURE2, tc); half4 deferredSample3 = tex2D(DEFERRED_TEXTURE3, tc); /* half4 deferredSample1 = tex2Dproj(DEFERRED_TEXTURE1, texCoord.xyw); half4 deferredSample2 = tex2Dproj(DEFERRED_TEXTURE2, texCoord.xyw); half4 deferredSample3 = tex2Dproj(DEFERRED_TEXTURE3, texCoord.xyw); */ half3 diffuseColor = deferredSample1.xyz; #ifdef FAKE_GAMME_CORRECTION diffuseColor = unapplyTextureGamma(diffuseColor); #endif #ifdef MORE_ACCURATE half3 normal; normal.x = decodeFloat(deferredSample2.xy); normal.y = decodeFloat(deferredSample2.zw); normal.z = deferredSample1.w; normal = (normal * half(2.0)) - half(1.0); normal.z = sqrt(1.0 - normal.x*normal.x - normal.y*normal.y) * normal.z; float4 deferredSample4 = tex2Dproj(DEFERRED_TEXTURE4, texCoord.xyw); float depth = decodeFloat3(deferredSample4.xyz); #else half3 normal = (deferredSample2.xyz * half(2.0)) - half(1.0); float depth = decodeFloat(float2(deferredSample1.w, deferredSample2.w)); #endif #ifdef USE_3D float4 texView; texView.xy = clipPosition.xy; texView.z = depth; texView.w = 1.0; texView.xy /= clipPosition.w; texView.xy *= depth; texView = mul(INVERSE_PROJECTION, texView); float3 viewPosition = texView.xyz / texView.w; half3 viewVector = normalize(viewPosition); #else clipPosition /= clipPosition.w; half3 viewPosition = clipPosition; viewPosition.z = 1.0; viewPosition *= depth * CAMERA_CLIP_PLANES.y; half3 viewVector = normalize(clipPosition.xyz); #endif half3 lightVector = lightPosition - viewPosition; half iLength = rsqrt(dot(lightVector, lightVector)); half lightDist = half(1.0) / iLength; lightVector *= iLength; half lightDot = saturate(dot(normal, lightVector)); half lightAmount = lightDot; #ifdef USE_SPECULAR half3 specVector = reflect(normalize(viewVector), normal); half spec = dot(specVector, lightVector); if(spec > 0.001) { spec = pow(spec, deferredSample3.y * half(96)) * deferredSample3.x * half(64); lightAmount += spec; } #endif lightAmount *= half(1.0) - saturate(lightDist * half(LIGHT_COLOR1.w)); lightAmount *= deferredSample3.z; half3 result = lightAmount * diffuseColor * half3(LIGHT_COLOR1.xyz); #ifdef FAKE_GAMME_CORRECTION result = applyTextureGamma(result); #endif return result; } void pointLight ( float4 inTexCoord : TEXCOORD0, float4 clipPosition : TEXCOORD1, float3 lightPosition : TEXCOORD2, uniform sampler2D DEFERRED_TEXTURE1, uniform sampler2D DEFERRED_TEXTURE2, uniform sampler2D DEFERRED_TEXTURE3, uniform float4 CAMERA_CLIP_PLANES, uniform float4 LIGHT_COLOR1, #if DEFERRED_SAMPLE_AMOUNT >= 2 uniform float4 DEFERRED_TEXTURE_OFFSET, #endif #ifdef USE_3D uniform float4x4 INVERSE_PROJECTION, #endif #ifdef MORE_ACCURATE uniform sampler2D DEFERRED_TEXTURE4, #endif #ifdef FB_PS3 out half4 oColor : COLOR) #else out float4 oColor : COLOR) #endif { half4 texCoord = inTexCoord; half3 finalColor = getPointlightSample(DEFERRED_TEXTURE1, DEFERRED_TEXTURE2, DEFERRED_TEXTURE3, texCoord, clipPosition, lightPosition, CAMERA_CLIP_PLANES, LIGHT_COLOR1 #ifdef USE_3D ,INVERSE_PROJECTION #endif #ifdef MORE_ACCURATE ,DEFERRED_TEXTURE4 #endif ); #if DEFERRED_SAMPLE_AMOUNT >= 2 finalColor += getPointlightSample(DEFERRED_TEXTURE1, DEFERRED_TEXTURE2, DEFERRED_TEXTURE3, texCoord + half4(DEFERRED_TEXTURE_OFFSET.x, 0, 0, 0) * texCoord.w, clipPosition, lightPosition, CAMERA_CLIP_PLANES, LIGHT_COLOR1 #ifdef USE_3D ,INVERSE_PROJECTION #endif #ifdef MORE_ACCURATE ,DEFERRED_TEXTURE4 #endif ); #endif #if DEFERRED_SAMPLE_AMOUNT >= 3 finalColor += getPointlightSample(DEFERRED_TEXTURE1, DEFERRED_TEXTURE2, DEFERRED_TEXTURE3, texCoord + half4(0, DEFERRED_TEXTURE_OFFSET.y, 0, 0) * texCoord.w, clipPosition, lightPosition, CAMERA_CLIP_PLANES, LIGHT_COLOR1 #ifdef USE_3D ,INVERSE_PROJECTION #endif #ifdef MORE_ACCURATE ,DEFERRED_TEXTURE4 #endif ); #endif #if DEFERRED_SAMPLE_AMOUNT >= 4 finalColor += getPointlightSample(DEFERRED_TEXTURE1, DEFERRED_TEXTURE2, DEFERRED_TEXTURE3, texCoord + half4(DEFERRED_TEXTURE_OFFSET.x, DEFERRED_TEXTURE_OFFSET.y, 0, 0) * texCoord.w, clipPosition, lightPosition, CAMERA_CLIP_PLANES, LIGHT_COLOR1 #ifdef USE_3D ,INVERSE_PROJECTION #endif #ifdef MORE_ACCURATE ,DEFERRED_TEXTURE4 #endif ); #endif #if DEFERRED_SAMPLE_AMOUNT == 2 finalColor *= 0.5; #elif DEFERRED_SAMPLE_AMOUNT == 3 finalColor *= 0.33333; #elif DEFERRED_SAMPLE_AMOUNT == 4 finalColor *= 0.25; #endif #ifdef CLIP_LIGHTING clip(finalColor.x + finalColor.y + finalColor.z - 0.01); #endif oColor.xyz = finalColor; #ifndef FB_PS3 oColor.w = 1.0; #endif } void negative ( float4 inTexCoord : TEXCOORD0, float4 clipPosition : TEXCOORD1, float3 lightPosition : TEXCOORD2, uniform sampler2D DEFERRED_TEXTURE1, uniform sampler2D DEFERRED_TEXTURE2, uniform sampler2D DEFERRED_TEXTURE3, uniform float4 CAMERA_CLIP_PLANES, uniform float4 LIGHT_POSITION1, #if DEFERRED_SAMPLE_AMOUNT >= 2 uniform float4 DEFERRED_TEXTURE_OFFSET, #endif #ifdef USE_3D uniform float4x4 INVERSE_PROJECTION, #endif #ifdef MORE_ACCURATE uniform sampler2D DEFERRED_TEXTURE4, #endif #ifdef FB_PS3 out half4 oColor : COLOR) #else out float4 oColor : COLOR) #endif { half4 texCoord = inTexCoord; half2 tc = texCoord.xy / texCoord.w; half4 deferredSample1 = tex2D(DEFERRED_TEXTURE1, tc); half4 deferredSample2 = tex2D(DEFERRED_TEXTURE2, tc); half4 deferredSample3 = tex2D(DEFERRED_TEXTURE3, tc); /* half4 deferredSample1 = tex2Dproj(DEFERRED_TEXTURE1, texCoord.xyw); half4 deferredSample2 = tex2Dproj(DEFERRED_TEXTURE2, texCoord.xyw); half4 deferredSample3 = tex2Dproj(DEFERRED_TEXTURE3, texCoord.xyw); */ //half3 normal = (deferredSample2.xyz * half(2.0)) - half(1.0); //half depth = decodeFloat(float2(deferredSample1.w, deferredSample2.w)) * CAMERA_CLIP_PLANES.y; #ifdef MORE_ACCURATE half3 normal; normal.x = decodeFloat(deferredSample2.xy); normal.y = decodeFloat(deferredSample2.zw); normal.z = deferredSample1.w; normal = (normal * half(2.0)) - half(1.0); normal.z = sqrt(1.0 - normal.x*normal.x - normal.y*normal.y) * normal.z; float4 deferredSample4 = tex2Dproj(DEFERRED_TEXTURE4, texCoord.xyw); float depth = decodeFloat3(deferredSample4.xyz); #else half3 normal = (deferredSample2.xyz * half(2.0)) - half(1.0); float depth = decodeFloat(float2(deferredSample1.w, deferredSample2.w)); #endif //half3 viewPosition = (viewVector * depth); #ifdef USE_3D float4 texView; texView.xy = clipPosition.xy; texView.z = depth; texView.w = 1.0; texView.xy /= clipPosition.w; texView.xy *= depth; texView = mul(INVERSE_PROJECTION, texView); float3 viewPosition = texView.xyz / texView.w; #else clipPosition /= clipPosition.w; half3 viewPosition = clipPosition; viewPosition.z = 1.0; viewPosition *= depth * CAMERA_CLIP_PLANES.y; #endif half3 lightVector = lightPosition - viewPosition; half iLength = rsqrt(dot(lightVector, lightVector)); half lightDist = half(1.0) / iLength; lightVector *= iLength; half lightDot = saturate(dot(normal, lightVector)); //half lightDot = saturate(normal.y); half lightAmount = lightDot; //lightAmount *= half(1.0) - lightDist; lightAmount *= half(1.0) - saturate(lightDist * half(LIGHT_POSITION1.w)); lightAmount *= deferredSample3.z; lightAmount = pow(half(1.0) - lightAmount, half(2.0)); lightAmount += half(0.25); oColor.xyz = lightAmount; //oColor.xyz = deferredSample1; //oColor.xyz *= 2.0; #ifndef FB_PS3 oColor.w = half(1.0); #endif }