gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:23:43 27 4
gpt4 key购买 nike

我刚刚开始讨论 OpenGL 中的遮挡查询主题,但我对它们的实际工作方式有点困惑。

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

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 的片段信息(我假设在某种深度缓冲区中)。但是我们已经禁用了对深度和颜色缓冲区的绘制,这意味着什么都没有绘制,这意味着它不应该在任何地方存储任何东西?

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

最佳答案

Now, to know if object 2 is actually occluded by object 1, it would need to keep the fragment information from query 1 somehow

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

由于您已禁用写入颜色和深度缓冲区,绘制对象唯一要做的就是增加遮挡查询计数器*。对象 2 不可能遮挡对象 1,因为绘制对象 1 不会更改深度缓冲区。

* 除非你有模板缓冲区或正在着色器中执行类似图像加载/存储的操作

关于c++ - OpenGL - 遮挡查询深度缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27385314/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com