2

我想产生一种效果,其中某些对象仅在它们落在某个空间内时才会被渲染。想想一个“神奇的解码器卷”,当它们在里面时,它会揭示秘密物体。

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

我想我可能可以将近剪裁平面设置为穿过显示球体的中心。然后我可以将近剪裁平面拉回更靠近眼睛的位置,渲染显示体积的正面并将远剪裁平面设置为其中心,仅渲染大于深度测试并通过模板测试的秘密对象顶点.

这种两遍方法感觉有点难看,如果体积中有一个非秘密物体应该在一个秘密物体的前面,它可能会因为反向深度测试而被压扁。我对着色器没有太多经验,但我猜这就是要走的路?

4

1 回答 1

1

文森特删除的关于着色器的答案并不是一个坏主意——每个片段计算出与显示球体中心的距离;如果距离太大的话discard

否则,阴影体积会起作用,因为它们从不显示任何额外的几何体。虽然在我打字时思考,但我想你可以做的是:

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

最终效果应该是,在前四个步骤之后,您的深度缓冲区的值仅在与剪裁几何相交的地方才等于真实值。因此,当您切换到GL_EQUAL颜色时,只会通过该几何图形。

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

于 2012-04-17T17:37:58.170 回答