opengl - 聚光灯阴影贴图的计算偏差

标签 opengl glsl shadow

在为聚光灯实现阴影后,当我的聚光灯离物体太远时,偏差计算似乎会使阴影消失。

两天来我一直在尝试解决这个问题,我使用 Renderdoc 调试我的渲染器,以便着色器内的所有数据都是正确的。

我的案例:

我使用 32 位深度缓冲区 我有两个立方体,一个在另一个后面(更大可以看到它邻居的影子),还有一个朝向立方体的光,它们沿 z 轴对齐。

我使用在教程中找到的以下公式来计算偏差:

float bias = max(max_bias * (1.0 - dot(normal, lightDir)), min_bias);

然后我执行以下比较:

return (fragment_depth - shadow_texture_depth - bias > 0.0) ? 0.0 : 1.0;

然而,我的聚光灯离物体越远,最近立方体的深度值就越接近最远立方体的深度(差异为 10-3,并且随着与光的距离而减小)。 一切正常,透视发挥了作用。 但是偏差计算没有考虑从片段到光的距离,那么如果我的物体和我的光对齐,normallightDir 不会改变,因此偏差也没有改变:我最远的立方体上不再有阴影,因为偏差不再适合

我搜索了很多网站和书籍(都是游戏编程精华),但没有找到有用的公式。

这里我给大家展示两个案例:

这里有两张截图,分别是相机视角的颜色结果和光线视角的阴影贴图。

灯光位置(0, 0, 0),一切正常 enter image description here enter image description here

灯光位置 (0, 0, 1.5),不起作用 enter image description here enter image description here

有没有人有公式或想法来帮助我? 我是不是误会了什么?

感谢阅读。

最佳答案

您偏向后投影空间中的差异。 后投影空间是非线性的,因为深度缓冲区是对数的。所以你不能仅仅用“世界单位”中的这种偏差来抵消这种差异。 如果你想让它工作,你必须用这个正常的偏移量重建你的采样位置。 或者使用倒投影转换您在世界空间中的深度。

希望对您有所帮助!

关于opengl - 聚光灯阴影贴图的计算偏差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37877510/

相关文章:

opengl - 具有不同版本的多个上下文

opengl - "immediate mode"在OpenGL中是什么意思?

c++ - 调整窗口大小时移动了灯光着色器

opengl - 使用 LibGDX 的法线映射 GLSL

javascript - 在体素地形上点亮/转换阴影的有效方法

objective-c - 苹果机,OpenGL 4 : drawing on FrameBuffer does not work

opengl - glGenerateMipmap 是否在线性空间中为 sRGB 纹理执行平均?

glsl - 平滑低倍频程柏林噪声

swiftui - 如何在 SwiftUI 上为 PageTabViewStyle 添加阴影?

ios - 检测 UIView 在动画期间何时更改大小以使阴影移动