OpenGL - 遮挡查询深度缓冲区?

时间:2014-12-09 17:41:46

标签: c++ opengl depth-buffer occlusion occlusion-culling

我刚开始涉及OpenGL中的遮挡查询主题,但我对它们的实际工作方式感到有些困惑。

在我发现的大多数示例中,在使用遮挡查询绘制之前,深度和颜色蒙版已停用(因为我们不需要实际绘制任何东西),实质上有点像这样:

glDepthMask(GL_FALSE);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);

glBeginQuery(GL_ANY_SAMPLES_PASSED,query1);
    // Draw Object 1
glEndQuery(GL_ANY_SAMPLES_PASSED);

glBeginQuery(GL_ANY_SAMPLES_PASSED,query2);
    // Draw Object 2
glEndQuery(GL_ANY_SAMPLES_PASSED);
// etc

glDepthMask(GL_TRUE);
glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE);

(假设对象是从前到后绘制的,因此对象1位于对象2的前面。为了解决这个问题,上面的代码只是伪代码。将检索查询的结果在以后的时间。)

现在,要知道对象2是否实际上被对象1遮挡了,它需要以某种方式保留来自查询1的片段信息(我假设在某种深度缓冲区中)。但我们已经禁止绘制到深度和颜色缓冲区,这意味着什么都没有绘制,这意味着它不应该存储在任何地方?

是否有特殊的查询'缓冲?如果是这样,有没有办法访问它?它是否以任何方式连接到当前绑定的纹理或帧缓冲区?我需要清除它吗?我误解了遮挡查询实际上是如何工作的吗?

1 个答案:

答案 0 :(得分:1)

  

现在,要知道对象2是否实际上被对象1遮挡了,它需要以某种方式保留查询1中的片段信息

为什么会这样?遮挡查询存储通过深度测试的样本数的计数器,该测试是一个整数。

由于您已禁止写入颜色和深度缓冲区,因此绘制对象的唯一方法是增加遮挡查询计数器*。对象2不能遮挡对象1,因为绘图对象1不会改变深度缓冲区。

*除非您有模板缓冲区或正在进行着色器中的图像加载/存储