浏览代码

Add last shadow cascade fade

Panagiotis Christopoulos Charitos 5 年之前
父节点
当前提交
9d74110267
共有 2 个文件被更改,包括 13 次插入3 次删除
  1. 6 0
      shaders/LightShading.ankiprog
  2. 7 3
      shaders/ShadowmapsResolve.ankiprog

+ 6 - 0
shaders/LightShading.ankiprog

@@ -73,6 +73,12 @@ void main()
 	const F32 depth = textureLod(u_msDepthRt, u_nearestAnyClampSampler, in_uv, 0.0).r;
 	const Vec2 ndc = UV_TO_NDC(in_uv);
 
+	if(depth == 1.0)
+	{
+		out_color = Vec3(0.0);
+		return;
+	}
+
 	// Get world position
 	const Vec4 worldPos4 = u_invViewProjMat * Vec4(ndc, depth, 1.0);
 	const Vec3 worldPos = worldPos4.xyz / worldPos4.w;

+ 7 - 3
shaders/ShadowmapsResolve.ankiprog

@@ -45,17 +45,21 @@ void main()
 	if(u_dirLight.m_active != 0u && u_dirLight.m_cascadeCount > 0)
 	{
 		const Vec4 viewPos4 = u_invProjMat * Vec4(ndc, depth, 1.0);
-		const F32 zViewSpace = viewPos4.z / viewPos4.w;
+		const F32 positiveZViewSpace = -(viewPos4.z / viewPos4.w);
 
 		F32 shadowFactor;
-		if(-zViewSpace < u_dirLight.m_effectiveShadowDistance)
+		if(positiveZViewSpace < u_dirLight.m_effectiveShadowDistance)
 		{
 			const U32 cascadeIdx =
-				computeShadowCascadeIndex(-zViewSpace, u_dirLight.m_shadowCascadesDistancePower,
+				computeShadowCascadeIndex(positiveZViewSpace, u_dirLight.m_shadowCascadesDistancePower,
 										  u_dirLight.m_effectiveShadowDistance, u_dirLight.m_cascadeCount);
 
 			shadowFactor =
 				computeShadowFactorDirLight(u_dirLight, cascadeIdx, worldPos, u_shadowTex, u_linearAnyClampSampler);
+
+			F32 distanceFadeFactor = saturate(positiveZViewSpace / u_dirLight.m_effectiveShadowDistance);
+			distanceFadeFactor = pow(distanceFadeFactor, 8.0);
+			shadowFactor += distanceFadeFactor;
 		}
 		else
 		{