Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 仅渲染大于一个深度缓冲但小于另一个深度缓冲的顶点_Opengl - Fatal编程技术网

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

Opengl 仅渲染大于一个深度缓冲但小于另一个深度缓冲的顶点,opengl,Opengl,我希望产生这样一种效果,即某些对象仅在落在某个空间内时才进行渲染。想象一下一个“魔法解码卷”,当秘密物体在里面时,它会显示出来 让我们假设秘密物体和暴露体积都是球体。我首先渲染非机密对象。然后,我将显示卷的背面渲染到深度和模具缓冲区中。如果我只渲染通过深度和模板测试的秘密对象,它们也将在显示卷的前面绘制。我希望能够创建第二个深度缓冲区,容纳显示卷的前端。有没有标准的方法可以做到这一点 我想我可能可以设置近剪裁平面,使其穿过显示球体的中心。然后,我可以将近剪裁平面拉回更靠近眼睛的位置,渲染显示体积

我希望产生这样一种效果,即某些对象仅在落在某个空间内时才进行渲染。想象一下一个“魔法解码卷”,当秘密物体在里面时,它会显示出来

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

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


这种两次通过的方法感觉有点难看,如果卷中有一个非机密对象应该在机密对象前面,它可能会因为反向深度测试而被压扁。我对着色器没有太多的经验,但我猜这是一个不错的选择?

文森特删除的关于着色器的答案并不是一个坏主意-每个片段计算出你的暴露球体中心的距离;如果距离太远,则
放弃

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

  • 禁用对颜色缓冲区的写入,以便只影响深度
  • 使用标准
    GL_LESS
    深度测试渲染场景,以建立深度值
  • 使用相同的深度测试渲染剪裁球体的背面部分
  • 使用启用的
    GL_grear
    渲染剪裁球体的前向部分,因此仅当前面有物体时才会绘制这些面的部分
  • 启用颜色缓冲区,切换到深度功能
    GL_EQUAL
  • 再次渲染场景几何体
最终的效果应该是,在前四步之后,深度缓冲区的值仅在与剪裁几何体相交的位置等于真值。因此,当您切换到
GL_EQUAL
时,颜色将仅适用于该几何体


具体地说,第3步清除剪裁几何体后面的任何内容,第4步清除前面的任何内容。隐式假设是剪裁几何体完全符合视锥体。

听起来像是您正在考虑的操作类似于渲染。我认为双关法是最好的,也是最通用的。它看起来很笨重,因为光栅化管道中的大多数渲染技巧都是黑客的。