Чтение выходного значения через несколько целей рендеринга из собственного кадрового буфера в OpenGL не работает - PullRequest
0 голосов
/ 04 июня 2018

Я просто хочу прочитать вывод RGBA 'deepColor' позже через glReadPixels () из отдельного объекта кадрового буфера.К сожалению, я могу только прочитать вывод «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);
...