gpt4 book ai didi

opengl - 如何有效地从深度纹理中读取像素?

转载 作者:行者123 更新时间:2023-12-04 16:29:52 26 4
gpt4 key购买 nike

我有一个 OpenGL 纹理,希望能够读回单个像素的值,以便在屏幕上显示它。如果纹理是常规的旧 RGB 纹理或类似纹理,这没问题:我拿一个我周围的空帧缓冲区对象,将纹理附加到帧缓冲区上的 COLOR0 并调用:

glReadPixels(x, y, 1, 1, GL_RGBA, GL_FLOAT, &c);

其中 c 本质上是一个 float[4]。

但是,当它是深度纹理时,我必须走不同的代码路径,设置 DEPTH 附件而不是 COLOR0,然后调用:

glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &c);

其中 c 是一个 float 。这在运行 NVIDIA GeForce 580 的 Windows 7 计算机上运行良好,但在我的旧 2008 MacBook pro 上会导致错误。具体来说,在将深度纹理附加到帧缓冲区之后,如果我调用 glCheckFrameBufferStatus(GL_READ_BUFFER),我会得到 GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER。

在搜索 OpenGL 文档后,我找到了这一行,这似乎暗示 OpenGL 不支持在没有颜色附件的情况下从帧缓冲区的深度分量读取:

GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER is returned if GL_READ_BUFFER is not GL_NONE 
and the value of GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE is GL_NONE for the color
attachment point named by GL_READ_BUFFER.

果然,如果我创建一个临时颜色纹理并将其绑定(bind)到 COLOR0,当我从深度纹理读取像素时不会发生错误。

现在通过这段代码每次(编辑:甚至一次并占用 GPU 内存)创建一个临时纹理很烦人而且可能很慢,所以我想知道是否有人知道读取单个像素的替代方法从深度纹理? (当然,如果没有更好的方法,我会保留一个纹理以在需要时调整大小,并仅将其用于临时颜色附件,但这似乎相当迂回)。

最佳答案

答案包含在您的错误消息中:

if GL_READ_BUFFER is not GL_NONE

那么做;将读取缓冲区设置为 GL_NONE。用glReadBuffer .像这样:

glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo); //where fbo is your FBO.
glReadBuffer(GL_NONE);

这样,FBO 就完全完整了,即使它只有深度纹理。

关于opengl - 如何有效地从深度纹理中读取像素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11508276/

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