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

jbi*_*lls 1 opengl opengl-4 shadow-mapping

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

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

j-p*_*j-p 6

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

在此输入图像描述

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

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

lightProjection = Matrix4.CreateOrthographicOffCenter(-lightSize, lightSize, -lightSize, lightSize, lightZNear, lightZFar); 
Run Code Online (Sandbox Code Playgroud)

但是这样做你在阴影贴图上的分辨率会降低,必须使用一些常用技术进行过滤,请参阅像pcf一样的"软阴影过滤".

前进的步骤是使用像"级联阴影"这样的技术来处理多个阴影贴图分辨率,具体取决于场景距离......