首页 > 解决方案 > 在opengl中通过多个渲染目标从自己的帧缓冲区读取输出值不起作用

问题描述

我只想稍后通过 glReadPixels() 从单独的帧缓冲区对象读取 RGBA 'depthColor' 输出。不幸的是,我只能读取“fragColor”输出(GL_COLOR_ATTACHMENT0)。我在这里做错了什么?

.fs

layout(location = 0) out highp vec4 fragColor;
layout(location = 1) out highp vec4 depthColor;

void main(void)
{
    fragColor = vec4(0.2, 0.2, 0.2, 1.0);
    depthColor = vec4(0.8, 0.8, 0.8, 1.0);
}

.cpp

GLuint tex;
GLint texWidth = m_pFbo->width(), texHeight = m_pFbo->height();

m_func->glGenTextures (1, &tex);
m_func->glBindTexture (GL_TEXTURE_2D, tex);
m_func->glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
m_func->glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
m_func->glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
m_func->glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
m_func->glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, texWidth, texHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);

GLint maxAttach = 0;
m_func->glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS, &maxAttach);
qDebug() << "maxAttach" << maxAttach;

GLint dfb = 0;
m_func->glGetIntegerv (GL_FRAMEBUFFER_BINDING, &dfb);

GLuint fb;
m_func->glGenFramebuffers (1, &fb);
m_func->glBindFramebuffer (GL_FRAMEBUFFER, fb);

GLenum DrawBuffers[2] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1};
m_func->glDrawBuffers(2, DrawBuffers);

m_func->glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, tex, 0);

GLenum status = m_func->glCheckFramebufferStatus(GL_FRAMEBUFFER);
qDebug() << "status" << status;

m_func->glBindFramebuffer (GL_FRAMEBUFFER, dfb);

m_func->glClearColor(0, 0, 0, 0);
m_func->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
m_pGeom->draw(&m_shaderProgram);

m_shaderProgram.release();
m_pWindow->resetOpenGLState();

.cpp

m_func->glReadBuffer(GL_COLOR_ATTACHMENT1);
GLubyte z[4];
m_func->glReadPixels(xy.x(), hght - xy.y(), 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, z);

标签: c++qtopenglopengl-esframebuffer

解决方案


推荐阅读