我刚刚开始研究 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 的片段信息(我假设在某种深度缓冲区中)。但是我们禁用了对深度和颜色缓冲区的绘制,这意味着什么都没有绘制,这意味着它不应该在任何地方存储任何东西?
是否有特殊的“查询”缓冲区?如果是这样,有没有办法访问它?它是否以任何方式连接到当前绑定的纹理或帧缓冲区?我需要清除它吗?我是否误解了遮挡查询的实际工作方式?