如何操作深度值以在体积渲染中纠正它?

时间:2017-08-03 05:29:50

标签: c++ opengl glsl shader fragment-shader

我有一个2阶段的体积渲染器,我使用DVR方法渲染体积,但深度缓冲区不适合该体积,因为我在盒子中用于光线投射。

实际上我有一个盒子,我应该根据体积数据计算正确的深度值。

我在顶点着色器中有这个:

gl_FragDepth = (1.0 - 0.0) * 0.5 * DEPTH + (1.0 + 0.0) * 0.5;

并在片段中:

(distanceToAdd/100 + DEPTH)

他们是正确的盒子,我的主要问题是我如何为DEPTH添加一点来制作正确的深度值?

我也使用{{1}},但这是错误的 任何想法?

1 个答案:

答案 0 :(得分:3)

经过一些澄清之后,主要问题似乎是如何组合实体网格和体积,以便在相交时,体积仅渲染到实体对象的表面

要回答这个问题,我们需要在两遍中渲染场景

  1. 将所有实体对象渲染到具有附加深度缓冲区的帧缓冲区对象(FBO)
  2. 使用修改的步数和初始颜色渲染所有卷。
  3. 我将在以下各节中详细解释

    修改步数

    通常,您为光线行进算法计算两个点:光线与立方体的近和远交点。这可以通过将光线x = o + t*d转换为立方体空间并为t_min取最小t_max和最大值t来实现。如果希望实体对象与体积相交,则需要确保正确调整这些点。

    • 近点通常不需要调整,因为如果立方体的正面位于实体对象的表面后面,则不会渲染像素。
    • 远点需要根据当前像素的深度值进行调整:
      • 计算当前像素(by applying the inverse projection and view transform
      • 对象表面的世界空间坐标
      • 通过应用立方体的逆世界变换计算对象表面的立方体空间坐标p
      • 计算t_surf使得p = o + t_surf * d,即计算光线到达固体表面的距离
      • t_maxt_surf之间取最小值,并将其作为射线原点的新最大距离t_max。这样,您可以忽略体积背后的体积的所有部分。

    修改后的初始颜色

    通过当前的修改,体积在固体表面上被正确剔除,但我们仍然只能看到黑色背景,而不是固体表面的颜色。

    要解决此问题,只需坚持从后到前的构图并将初始值设置为曲面的颜色(而不是像通常情况那样将其保持黑色)。这样,如果体积在某一点完全透明,您会看到实体表面,如果它有些不透明,它会与表面前面的体积混合。