Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 在阴影贴图之外采样会导致异常行为_Opengl_Opengl 4_Shadow Mapping - Fatal编程技术网

Opengl 在阴影贴图之外采样会导致异常行为

Opengl 在阴影贴图之外采样会导致异常行为,opengl,opengl-4,shadow-mapping,Opengl,Opengl 4,Shadow Mapping,我在对灯光视图之外的点进行采样时遇到了问题,因此我的阴影贴图也遇到了问题。这是每当使用“GL_纹理_包裹”的纹理参数设置为“GL_钳制”或“GL_钳制_到_边”创建阴影贴图时得到的结果: 我所确定的是在这里发生的是,在有阴影的地图一侧的阴影地图外的每个点都被认为是阴影,在没有阴影的地图一侧的地图外的每个点也被认为是未阴影。我认为这是GL_CLAMP和GL_CLAMP_TO_EDGE的预期行为,但我在网上找到的各种阴影映射示例中没有看到这个问题。通过使用GL_CLAMP_TO_BORDER并设置

我在对灯光视图之外的点进行采样时遇到了问题,因此我的阴影贴图也遇到了问题。这是每当使用“GL_纹理_包裹”的纹理参数设置为“GL_钳制”或“GL_钳制_到_边”创建阴影贴图时得到的结果:


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

使用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是相关大小):

但这样做会降低阴影贴图的分辨率,必须使用一些常用技术进行过滤,请参见“软阴影过滤”,如pcf


前进的一步是使用像“层叠阴影”这样的技术根据场景距离处理多个阴影贴图分辨率…

使用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是相关大小):

但这样做会降低阴影贴图的分辨率,必须使用一些常用技术进行过滤,请参见“软阴影过滤”,如pcf


前进的一步是使用“层叠阴影”等技术根据场景距离处理多个阴影贴图分辨率…

好的,这是有意义的,而且该解决方案几乎解决了所有问题。我还有一个在灯光后面的影子。这个问题的解决方案是某种z检查吗?你能再解释一下吗,也许会发布一个新的屏幕截图OK,下面是一个应用了你的解决方案的屏幕截图:。灯丝后面的一切都被置于阴影中。是否会使用某种z检查来修复此问题?投影底部是穿过平面的直线。因此,你必须居中你的平截头体目标,并相应地移动你的灯光位置。谢谢你的投票:-)好吧,也许我用错词了;聚光灯后面的所有东西(灯光视图空间中的z<0)都放置在阴影中。我可以用z检查来解决这个问题吗?如果不是,那么通常的解决方案是什么?好的,这是有意义的,并且该解决方案解决了几乎所有的问题。我还有一个在灯光后面的影子。这个问题的解决方案是某种z检查吗?你能再解释一下吗,也许会发布一个新的屏幕截图OK,下面是一个应用了你的解决方案的屏幕截图:。灯丝后面的一切都被置于阴影中。是否会使用某种z检查来修复此问题?投影底部是穿过平面的直线。因此,你必须居中你的平截头体目标,并相应地移动你的灯光位置。谢谢你的投票:-)好吧,也许我用错词了;聚光灯后面的所有东西(灯光视图空间中的z<0)都放置在阴影中。我可以用z检查来解决这个问题吗?如果不是,通常的解决方案是什么?