PCF和放牧光也称为投射混叠

时间:2014-06-19 09:58:08

标签: opengl glsl shadow-mapping

我目前正在实施和修改阴影贴图的一些替代偏置解决方案。我当然将它们与软阴影的不同技术结合起来。

我在使用PCF时遇到了一些问题。 我通过测试光方向的点积和片段的法线是否大于0来遮蔽曲面的背面,因此它只能是任何背面。绝对适用于硬阴影。

基本上,我的片段着色器中的这行代码会遮挡任何对象的背面:

 isLit= dot(lsFragNormal.xyz, lightViewPos.xyz) > 0.0f ? 0.0 : isLit;

并按照硬阴影的说法正常工作。 说到PCF,我的第一个意图是如上所述使用它来检查过滤器内核中的当前纹素是否在阴影中。 这是用于对PCF过滤器内核的当前纹素进行阴影测试的声明:

if((currentDepth < shadowMapDepth) && !(dot(lsFragNormal.xyz, lightViewPos.xyz) > 0.0f ))

但是从物体前面到物体背面的“阴影边缘”仍然是一个坚硬的“阴影边缘”。这当然是有道理的,因为对于PCF滤波器内核的任何纹素,总是测试当前片段的法线,因此如果片段位于对象的背面,则该片段将完全被遮蔽。 但是当我删除“点积测试”时,在物体从正面到背面的褪色处,由于放牧光线,我出现了人工制品的问题。

使用“点积测试”: 正如您所看到的,实际投射的阴影看起来很好,但是对象背面的阴影是一个硬阴影: enter image description here

没有“点积测试”: “背面阴影”的边缘开始向光线前方软化,但仍然在硬边缘结束。你还可以看到一些工件,我猜这些工件来自该区域的欠采样: enter image description here

我可以做些什么来在“背面阴影”的边缘获得一个好的(或至少更好的)柔和阴影? 没有引入非常复杂的算法,如“查询的虚拟阴影贴图”,这当然是这种情况的完美解决方案,但这适用于交互式应用程序,因此不可能使用这样的过程。

或者,对于交互式应用程序,我根本没有机会对抗这样的别名。

如果您认为“背面阴影”的硬边可以接受,我感兴趣吗?

0 个答案:

没有答案