如何检测阴影贴图纹理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);
然后我将变暗应用于场景的整体颜色矢量。瞧!
我想知道如何在片段着色器中检测阴影贴图纹理的边缘。
我在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);
然后我将变暗应用于场景的整体颜色矢量。瞧!