gpt4 book ai didi

opengl - 无法从附加到 FBO 的深度纹理读取深度值

转载 作者:行者123 更新时间:2023-12-04 18:08:44 54 4
gpt4 key购买 nike

我无法使用 glreadpixels 函数从深度纹理读取正确的深度值。 FBO 状态完成。其他渲染目标在传输到另一个 FBO 后看起来也很好。

代码片段:

    // Create the FBO
glGenFramebuffers(1, &m_fbo);
glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);

// Create the gbuffer textures
glGenTextures(GBUFFER_NUM_TEXTURES, m_textures);
glGenTextures(1, &m_depthTexture);

for (unsigned int i = 0 ; i < GBUFFER_NUM_TEXTURES ; i++) {
glBindTexture(GL_TEXTURE_2D, m_textures[i]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, fboWidth, fboHeight, 0, GL_RGBA, GL_FLOAT, NULL);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, m_textures[i], 0);
}

// depth
glBindTexture(GL_TEXTURE_2D, m_depthTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE);

glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, fboWidth, fboHeight, 0, GL_DEPTH_COMPONENT, GL_FLOAT,
NULL);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, m_depthTexture, 0);

GLenum DrawBuffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 };
glDrawBuffers(GBUFFER_NUM_TEXTURES, DrawBuffers);

GLenum Status = glCheckFramebufferStatus(GL_FRAMEBUFFER);

if (Status != GL_FRAMEBUFFER_COMPLETE) {
printf("FB error, status: 0x%x\n", Status);
return 0;
}


// drawing something with depth test enabled.
// Now i am using glreadpixels functions to read depth values from depth texture.

int w = 4, h = 1;
GLfloat windowDepth[4];
glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
glReadPixels(x, y, w, h, GL_DEPTH_COMPONENT, GL_FLOAT, windowDepth);

最佳答案

您正在绘制深度纹理。调用以将纹理读入客户端内存的适当函数是 glGetTexImage (...)

现在,由于没有 glGetTexSubImage (...),您需要分配足够的客户端存储空间来容纳深度纹理的整个 LOD。像这样的事情可能会成功:

GLuint w = fboWidth, h = fboHeight;
GLfloat windowDepth [w * h];

glBindTexture (GL_TEXTURE_2D, m_depthTexture);
glGetTexImage (GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, GL_FLOAT, windowDepth);

请记住,与 glReadPixels (...) 不同,glGetTexImage (...) 不执行像素传输转换。也就是说,您的格式和数据类型必须与创建纹理时使用的类型完全匹配,GL 不会转换您的数据。


既然如此,我能问一下您为什么首先要将深度缓冲区读入客户端内存吗?您似乎正在使用延迟着色,所以我明白为什么您需要深度纹理,但不太清楚为什么您需要着色器外部的深度缓冲区副本。如果每帧复制深度缓冲区,您将很难实现交互式帧速率。

关于opengl - 无法从附加到 FBO 的深度纹理读取深度值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19891524/

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