在shadowmap之外进行采样会导致异常行为

时间:2014-03-19 22:32:10

标签: opengl opengl-4 shadow-mapping

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

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

1 个答案:

答案 0 :(得分:6)

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

enter image description here

如果你夹到边框并将边框颜色设置为(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); 

但是这样你在阴影贴图上的分辨率会降低,必须使用一些常用技术进行过滤,请参阅“软阴影过滤”#39;喜欢pcf。

向前迈出的步伐不仅仅是使用像“级联阴影”这样的技术。根据场景距离处理多个阴影贴图分辨率...