diff --git a/Templates/Full/game/shaders/common/lighting/advanced/spotLightP.hlsl b/Templates/Full/game/shaders/common/lighting/advanced/spotLightP.hlsl index c667e56b9..9806bd326 100644 --- a/Templates/Full/game/shaders/common/lighting/advanced/spotLightP.hlsl +++ b/Templates/Full/game/shaders/common/lighting/advanced/spotLightP.hlsl @@ -48,10 +48,8 @@ TORQUE_UNIFORM_SAMPLER2D(dynamicShadowMap,2); TORQUE_UNIFORM_SAMPLER2D(cookieMap, 3); #endif - -TORQUE_UNIFORM_SAMPLER2D(lightBuffer, 5); -TORQUE_UNIFORM_SAMPLER2D(colorBuffer, 6); -TORQUE_UNIFORM_SAMPLER2D(matInfoBuffer, 7); +TORQUE_UNIFORM_SAMPLER2D(colorBuffer, 5); +TORQUE_UNIFORM_SAMPLER2D(matInfoBuffer, 6); uniform float4 rtParams0; @@ -73,48 +71,36 @@ uniform float4x4 dynamicViewToLightProj; uniform float2 lightAttenuation; uniform float shadowSoftness; -struct PS_OUTPUT -{ - float4 diffuse: TORQUE_TARGET0; - float4 spec: TORQUE_TARGET1; -}; +uniform float3 eyePosWorld; +uniform float4x4 cameraToWorld; -PS_OUTPUT main( ConvexConnectP IN ) +LightTargetOutput main( ConvexConnectP IN ) { - PS_OUTPUT Output = (PS_OUTPUT)0; + LightTargetOutput Output = (LightTargetOutput)0; // Compute scene UV float3 ssPos = IN.ssPos.xyz / IN.ssPos.w; float2 uvScene = getUVFromSSPos( ssPos, rtParams0 ); - - // Matinfo flags - float4 matInfo = TORQUE_TEX2D( matInfoBuffer, uvScene ); - //early out if emissive - bool emissive = getFlag(matInfo.r, 0); - if (emissive) - { + + //sky and editor background check + float4 normDepth = UnpackDepthNormal(TORQUE_SAMPLER2D_MAKEARG(deferredBuffer), uvScene); + if (normDepth.a>0.9999) return Output; - } - - float4 colorSample = TORQUE_TEX2D( colorBuffer, uvScene ); - float3 subsurface = float3(0.0,0.0,0.0); - if (getFlag( matInfo.r, 1 )) - { - subsurface = colorSample.rgb; - if (colorSample.r>colorSample.g) - subsurface = float3(0.772549, 0.337255, 0.262745); - else - subsurface = float3(0.337255, 0.772549, 0.262745); - } - - // Sample/unpack the normal/z data - float4 deferredSample = TORQUE_DEFERRED_UNCONDITION( deferredBuffer, uvScene ); - float3 normal = deferredSample.rgb; - float depth = deferredSample.a; - + // Eye ray - Eye -> Pixel float3 eyeRay = getDistanceVectorToPlane( -vsFarPlane.w, IN.vsEyeDir.xyz, vsFarPlane ); - float3 viewSpacePos = eyeRay * depth; - + float3 viewSpacePos = eyeRay * normDepth.w; + + //create surface + Surface surface = CreateSurface( normDepth, TORQUE_SAMPLER2D_MAKEARG(colorBuffer),TORQUE_SAMPLER2D_MAKEARG(matInfoBuffer), + uvScene, eyePosWorld, eyeRay, cameraToWorld); + //early out if emissive + if (getFlag(surface.matFlag, 0)) + return Output; + + //create surface to light + float3 wsLightDir = mul(cameraToWorld, float4(lightDirection,0)).xyz; + SurfaceToLight surfaceToLight = CreateSurfaceToLight(surface, -wsLightDir); + // Build light vec, get length, clip pixel if needed float3 lightToPxlVec = viewSpacePos - lightPosition; float lenLightV = length( lightToPxlVec ); @@ -130,7 +116,7 @@ PS_OUTPUT main( ConvexConnectP IN ) clip( atten - 1e-6 ); atten = saturate( atten ); - float nDotL = dot( normal, -lightToPxlVec ); + float nDotL = dot( normDepth.xyz, -lightToPxlVec ); // Get the shadow texture coordinate float4 pxlPosLightProj = mul( viewToLightProj, float4( viewSpacePos, 1 ) ); @@ -185,34 +171,12 @@ PS_OUTPUT main( ConvexConnectP IN ) #endif - // NOTE: Do not clip on fully shadowed pixels as it would - // cause the hardware occlusion query to disable the shadow. - - float3 l = normalize(-lightDirection); - float3 v = eyeRay;// normalize(eyePosWorld - worldPos.xyz); - - float3 h = normalize(v + l); - float dotNLa = clamp(dot(normal, l), 0.0, 1.0); - float dotNVa = clamp(dot(normal, v), 0.0, 1.0); - float dotNHa = clamp(dot(normal, h), 0.0, 1.0); - float dotHVa = clamp(dot(normal, v), 0.0, 1.0); - float dotLHa = clamp(dot(l, h), 0.0, 1.0); - - float roughness = 1.0001-matInfo.b; - float metalness = matInfo.a; - - //diffuse - float disDiff = Fr_DisneyDiffuse(dotNVa, dotNLa, dotLHa, roughness); - float3 diffuse = float3(disDiff, disDiff, disDiff) / M_PI_F; - //specular - float3 specular = directSpecular(normal, v, l, roughness, 1.0) * lightColor.rgb; - - - if (nDotL<0) shadowed = 0; - float Sat_NL_Att = saturate( nDotL * shadowed ) * lightBrightness; + //get directional light contribution + LightResult result = GetDirectionalLight(surface, surfaceToLight, lightColor.rgb, lightBrightness, shadowed); + //output - Output.diffuse = float4(diffuse * lightBrightness*Sat_NL_Att*shadowed,1.0); - Output.spec = float4(specular * lightBrightness*Sat_NL_Att*shadowed,1.0); - + Output.diffuse = float4(result.diffuse, 0); + Output.spec = float4(result.spec, 0); + return Output; }