From 8dad81e494bcf4c6c64da204ba6322eb3a201a40 Mon Sep 17 00:00:00 2001 From: Tim Barnes Date: Wed, 28 Nov 2018 20:01:35 +1000 Subject: [PATCH] lighting shader fixes --- .../shaders/common/lighting/advanced/pointLightP.hlsl | 4 +++- .../shaders/common/lighting/advanced/spotLightP.hlsl | 9 ++++++++- .../shaders/common/lighting/advanced/vectorLightP.hlsl | 5 +++-- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/Templates/Full/game/shaders/common/lighting/advanced/pointLightP.hlsl b/Templates/Full/game/shaders/common/lighting/advanced/pointLightP.hlsl index 2173309cc..eeb96d674 100644 --- a/Templates/Full/game/shaders/common/lighting/advanced/pointLightP.hlsl +++ b/Templates/Full/game/shaders/common/lighting/advanced/pointLightP.hlsl @@ -134,6 +134,7 @@ uniform float lightInvSqrRange; uniform float shadowSoftness; uniform float4x4 worldToCamera; uniform float3x3 worldToLightProj; +uniform float3x3 dynamicWorldToLightProj; uniform float3 eyePosWorld; uniform float4x4 cameraToWorld; @@ -182,8 +183,9 @@ float4 main( ConvexConnectP IN ) : SV_TARGET #else float2 shadowCoord = decodeShadowCoord( mul( worldToLightProj, -surfaceToLight.L ) ).xy; + float2 dynShadowCoord = decodeShadowCoord( mul( dynamicWorldToLightProj, -surfaceToLight.L ) ).xy; float static_shadowed = softShadow_filter(TORQUE_SAMPLER2D_MAKEARG(shadowMap), ssPos.xy, shadowCoord, shadowSoftness, distToLight, surfaceToLight.NdotL, lightParams.y); - float dynamic_shadowed = softShadow_filter(TORQUE_SAMPLER2D_MAKEARG(dynamicShadowMap), ssPos.xy, shadowCoord, shadowSoftness, distToLight, surfaceToLight.NdotL, lightParams.y); + float dynamic_shadowed = softShadow_filter(TORQUE_SAMPLER2D_MAKEARG(dynamicShadowMap), ssPos.xy, dynShadowCoord, shadowSoftness, distToLight, surfaceToLight.NdotL, lightParams.y); float shadowed = min(static_shadowed, dynamic_shadowed); #endif diff --git a/Templates/Full/game/shaders/common/lighting/advanced/spotLightP.hlsl b/Templates/Full/game/shaders/common/lighting/advanced/spotLightP.hlsl index b4f4b1b43..8cdc8630e 100644 --- a/Templates/Full/game/shaders/common/lighting/advanced/spotLightP.hlsl +++ b/Templates/Full/game/shaders/common/lighting/advanced/spotLightP.hlsl @@ -65,6 +65,7 @@ uniform float2 lightSpotParams; uniform float4 lightMapParams; uniform float4 vsFarPlane; uniform float4x4 worldToLightProj; +uniform float4x4 dynamicWorldToLightProj; uniform float4 lightParams; uniform float shadowSoftness; @@ -110,10 +111,16 @@ float4 main( ConvexConnectP IN ) : SV_TARGET float4 pxlPosLightProj = mul( worldToLightProj, float4( surface.P, 1 ) ); float2 shadowCoord = ( ( pxlPosLightProj.xy / pxlPosLightProj.w ) * 0.5 ) + float2( 0.5, 0.5 ); shadowCoord.y = 1.0f - shadowCoord.y; + + float4 dynPxlPosLightProj = mul( dynamicWorldToLightProj, float4( surface.P, 1 ) ); + float2 dynShadowCoord = ( ( dynPxlPosLightProj.xy / dynPxlPosLightProj.w ) * 0.5 ) + float2( 0.5, 0.5 ); + dynShadowCoord.y = 1.0f - dynShadowCoord.y; + //distance to light in shadow map space float distToLight = pxlPosLightProj.z / lightRange; + float dynDistToLight = dynPxlPosLightProj.z / lightRange; float static_shadowed = softShadow_filter(TORQUE_SAMPLER2D_MAKEARG(shadowMap), ssPos.xy, shadowCoord, shadowSoftness, distToLight, surfaceToLight.NdotL, lightParams.y); - float dynamic_shadowed = softShadow_filter(TORQUE_SAMPLER2D_MAKEARG(dynamicShadowMap), ssPos.xy, shadowCoord, shadowSoftness, distToLight, surfaceToLight.NdotL, lightParams.y); + float dynamic_shadowed = softShadow_filter(TORQUE_SAMPLER2D_MAKEARG(dynamicShadowMap), ssPos.xy, dynShadowCoord, shadowSoftness, dynDistToLight, surfaceToLight.NdotL, lightParams.y); float shadowed = min(static_shadowed, dynamic_shadowed); #endif diff --git a/Templates/Full/game/shaders/common/lighting/advanced/vectorLightP.hlsl b/Templates/Full/game/shaders/common/lighting/advanced/vectorLightP.hlsl index 8c15470f5..c141f9d5d 100644 --- a/Templates/Full/game/shaders/common/lighting/advanced/vectorLightP.hlsl +++ b/Templates/Full/game/shaders/common/lighting/advanced/vectorLightP.hlsl @@ -79,6 +79,7 @@ uniform float4 dynamicFarPlaneScalePSSM; float4 AL_VectorLightShadowCast( TORQUE_SAMPLER2D(sourceShadowMap), float2 texCoord, + float4x4 worldToLightProj, float3 worldPos, float4 scaleX, float4 scaleY, @@ -209,10 +210,10 @@ float4 main(FarFrustumQuadConnectP IN) : SV_TARGET float4 zDist = (zNearFarInvNearFar.x + zNearFarInvNearFar.y * surface.depth); float fadeOutAmt = ( zDist.x - fadeStartLength.x ) * fadeStartLength.y; - float4 static_shadowed_colors = AL_VectorLightShadowCast( TORQUE_SAMPLER2D_MAKEARG(shadowMap), IN.uv0.xy, surface.P, scaleX, scaleY, offsetX, offsetY, + float4 static_shadowed_colors = AL_VectorLightShadowCast( TORQUE_SAMPLER2D_MAKEARG(shadowMap), IN.uv0.xy, worldToLightProj, surface.P, scaleX, scaleY, offsetX, offsetY, farPlaneScalePSSM, surfaceToLight.NdotL); - float4 dynamic_shadowed_colors = AL_VectorLightShadowCast( TORQUE_SAMPLER2D_MAKEARG(dynamicShadowMap), IN.uv0.xy, surface.P, dynamicScaleX, + float4 dynamic_shadowed_colors = AL_VectorLightShadowCast( TORQUE_SAMPLER2D_MAKEARG(dynamicShadowMap), IN.uv0.xy, dynamicWorldToLightProj, surface.P, dynamicScaleX, dynamicScaleY, dynamicOffsetX, dynamicOffsetY, dynamicFarPlaneScalePSSM, surfaceToLight.NdotL); float static_shadowed = static_shadowed_colors.a;