1

当在我的灯光视图之外采样点以及因此我的阴影贴图时,我遇到了问题。每当我的阴影贴图创建时,GL_TEXTURE_WRAP 的纹理参数设置为 GL_CLAMP 或 GL_CLAMP_TO_EDGE,这就是我得到的结果:

我已经确定在这里发生的是,地图一侧有阴影的阴影贴图之外的每个点都被认为是阴影,而地图外没有阴影的一侧的每个点也被认为是无阴影的。我认为这是 GL_CLAMP 和 GL_CLAMP_TO_EDGE 的预期行为,但我在网上找到的各种阴影映射示例中没有看到这个问题。通过使用 GL_CLAMP_TO_BORDER 并设置边框颜色可以消除其中的一些问题,但这又不是我在我看过的任何示例中看到的修复。这是遮蔽聚光灯时的预期问题吗?如果是,通常的解决方法是什么?

4

1 回答 1

6

使用 GL_CLAMP_TO_EDGE,您的阴影纹理将在每个方向上重复第一个和最后一个像素,这会导致非常不可预测的结果

在此处输入图像描述

如果您夹到边框并将边框颜色设置为 (1,1,1,1),您将获得干净的边框,但根本没有阴影。

GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToBorder);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.ClampToBorder);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureBorderColor,new float[] {1f,1f,1f,1f});

扩展投影大小是在整个场景上按预期进行阴影的唯一方法(其中 lightSize 是相关大小的正交示例。):

lightProjection = Matrix4.CreateOrthographicOffCenter(-lightSize, lightSize, -lightSize, lightSize, lightZNear, lightZFar); 

但是这样做会降低阴影贴图的分辨率,必须使用一些常用技术对其进行过滤,请参阅 pcf 之类的“软阴影过滤”。

向前迈出的一步不是使用“级联阴影”之类的技术来处理取决于场景距离的多个阴影贴图分辨率......

于 2014-03-19T23:42:22.873 回答