如何检测阴影贴图纹理GLSL的边缘

How to detect edge of shadow map texture GLSL

我想知道如何在片段着色器中检测阴影贴图纹理的边缘。

我在youtube上看了下面的教程: https://www.youtube.com/watch?v=9sEHkT7N7RM 但在那个人的例子中,解决方案取决于摄像机的位置。我宁愿不依赖于相机位置。

问题: 如果对象移出阴影贴图渲染通道采样的区域,则对象的阴影会被剪裁(正常行为)。 所以,如果我知道当前片段的位置靠近阴影贴图边界,我可以添加某种淡出机制。

提前致谢!

好吧,我真的不敢相信,但我自己解决了这个问题,这是一件很简单的事情:

在我的顶点着色器中,我从光的角度计算顶点位置,然后计算它与纹理边缘的接近程度:

vShadowCoord = vec4(uShadowModelViewProjectionMatrix * vec4(vertexPos.xyz, 1.0));
float borderFactorX = abs(0.5 - vShadowCoord.x);
float borderFactorY = abs(0.5 - vShadowCoord.y);
vShadowBorderFactor = max(borderFactorX, borderFactorY) * 2;

现在,vShadowBorderFactor 存储一个介于 0 和 1 之间的值。

我将 vShadowBorderFactor 传递给片段着色器,然后计算变暗量(通过投射阴影):

darkening = textureProj(uShadowTexture, vec4(vShadowCoord.xy, vShadowCoord.z - bias, 1.0)) + (vShadowBorderFactor * vShadowBorderFactor);

然后我将变暗应用于场景的整体颜色矢量。瞧!