【发布时间】:2013-02-01 06:50:30
【问题描述】:
我最近在 OpenGL 4.3 中使用体素锥体跟踪实现了软阴影,方法是在光的方向上跟踪一个锥体并累积不透明度值。
我试图解决或隐藏的关键是当被遮挡的表面越来越接近遮挡物时非常体素化的阴影效果,以及由于表面体素化而隐藏阴影中的清晰点。我正在使用 64x64x64 的低分辨率体素;但是,即使我使用更高分辨率的体素,跟踪中仍会捕获更高 mip-map 级别的一些低分辨率体素。
所以我的第一个想法是:我希望能够保留最远的阴影最柔和的部分,并用阴影贴图替换更靠近遮挡物的阴影部分。阴影贴图会随着它远离每个遮挡物而逐渐消失,我会以某种方式将它与锥形跟踪阴影混合。
谁能想出一种方法来根据与每个对象的距离为阴影贴图淡化阴影,然后让它平滑地融合到锥形跟踪阴影中?
我的另一个想法是以某种方式在更接近遮挡物的表面上跟踪阴影,但这可能太昂贵了。
或者,我欢迎任何其他想法来帮助改进我的软阴影算法。
我还制作了一段视频来展示它的动态:
https://www.youtube.com/watch?v=SUiUlRojBpM
仍然没有找到解决阴影问题的方法。
【问题讨论】:
-
+1 – 最后又是一个问题,这不是新手级别的问题,让我的大脑发痒:) 让我看看我能想到什么……
-
在圆锥追踪算法中,是否使用体素的alpha值来表示体素是否被占用?如果是这样,opengl 中的默认 mipmapping 算法可能无法为您提供正确的结果。您还使用稀疏体素八叉树表示吗?
-
对于间接漫反射和镜面反射,我通过在所有 6 个方向上偏移 1 个体素来采样 3D 纹理 - 对于每个 mip 级别。如果我正确理解了理论,我想这给了我 2x2x2 的“砖块”。我跟踪圆锥,直到不透明度值变为 1 并达到我定义的最大距离。我注意到默认的 mipmapping 不是很平滑,所以我想如果我使用 3x3x3 砖块,我的结果应该会有所改善 - 性能成本更高?我没有使用八叉树结构,但这在要实现的事情列表中。
-
任何与斯坦福模型有关的问题都是一个好问题。
-
我不知道你是如何应用你的阴影的,但我们假设你有一个着色器并且你做了一个阴影贴图查找。如果对象随后被遮挡,我们可以简单地获得从表面上的点到灯光的距离,并根据一些任意参数进行淡化。不过,这将是阴影贴图和“混合”区域中的软阴影之间的差异。我不知道你是否认为这太昂贵了,但它不需要光线追踪,而且它只会发生在阴影区域。