仅渲染大于一个深度缓冲区但小于另一个深度缓冲区的顶点

时间:2012-04-17 16:20:36

标签: opengl

我想产生一种效果,即某些对象只有在特定空间内才会被渲染。想象一下“神奇的解码器卷”,当它们进入内部时会发现它们。

让我们假设秘密物体和暴露体积都是球体。我首先渲染非秘密对象。然后,我将显示体积的背面渲染到深度和模板缓冲区中。如果我只渲染通过深度和模板测试的秘密对象,它们也将被绘制在显露的体积前面。我希望能够创建第二个深度缓冲区,它可以保持显示音量的正面。有没有标准的方法来做到这一点?

我想我可能会设置近剪裁平面穿过显露球体的中心。然后我可以将近剪裁平面拉回到眼睛附近,渲染显露体积的前面并将远剪裁平面设置到其中心,并且仅渲染大于深度测试的秘密对象顶点并通过模板测试。

这种两次通过的方法感觉有点难看,如果卷中的非秘密对象应该在秘密对象的前面,由于反向深度测试,它可能会被压扁。我对着色器没有太多经验,但我猜这是要走的路?

1 个答案:

答案 0 :(得分:1)

文森特关于着色器的删除答案并不是一个坏主意 - 每个片段都会显示距离显示球体中心的距离;如果距离太远,那么discard

否则,阴影卷起作用,因为它们从不显示任何其他几何体。虽然按我打字的方式思考,但我猜你能做的是:

  • 禁止写入颜色缓冲区,以便仅影响深度;
  • 使用标准GL_LESS深度测试渲染场景,以建立深度值;
  • 使用相同的深度测试渲染裁剪球的背面部分;
  • 渲染裁剪球的正面部分并启用GL_GREATER,因此只有当事物位于其前面时才会绘制这些面部分;
  • 启用颜色缓冲区,切换到深度函数GL_EQUAL;
  • 再次渲染场景几何体。

净效应应该是在前四个步骤之后,深度缓冲区的值仅等于与剪切几何体相交的真值。因此,当您切换到GL_EQUAL时,颜色将仅通过该几何体。

具体来说,第3步会消除剪裁几何体后面的任何内容,第4步会消除前面的任何内容。隐含的假设是剪裁几何完全适合视锥体。