OpenGL ES3 FrameBuffer对象错误

时间:2016-10-17 07:55:31

标签: c++ opengl-es framebuffer

这是我的问题:我想在屏幕外渲染2个图像(来自之前的渲染),然后使用特殊算法将它们混合在一起。我的第一个图像/纹理是RGB,第二个是灰度,所以我只得到了亮度。

我认为实现目标的最佳方法是使用帧缓冲对象。所以我为第一个图像创建了一个FBO,然后我将一个新的纹理与FBO关联,它将接收渲染输出。纹理的格式是GL_RGB,它工作正常,我的第一个FBO在其纹理中包含渲染。 然后我对第二个图像执行相同的操作,其格式为GL_LUMINANCE。但是在draw函数中,当我绑定到这个FrameBuffer并检查状态时,我得到了错误GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT。如果我将纹理更改为RGB,则可以正常工作。

但是对于混合,我需要访问亮度而不是图像的rgb组件。

你有解决方案吗?

我在imx6q飞思卡尔的SOC上使用OpenGL ES 3.0。

这是我的代码: 1 - 创建帧缓冲区对象和纹理

glGenFramebuffers(1, &m_uiFrameBufferObject);
glBindFramebuffer(GL_FRAMEBUFFER, m_uiFrameBufferObject);

glGenTextures(1, &m_uiTextureId[1]);
glBindTexture(GL_TEXTURE_2D, m_uiTextureId[1]);

glTexImage2D(   GL_TEXTURE_2D, 0, GL_LUMINANCE, 1280, 960,
                0, GL_LUMINANCE, GL_UNSIGNED_BYTE, nullptr);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_uiTextureId[1], 0);
glDrawBuffers(1, attachments);    //GL_COLOR_ATTACHMENT0

然后在绘图功能中:

glBindFramebuffer(GL_FRAMEBUFFER, m_uiFrameBufferObject);

if( glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT )
{
     // I go there
}

glViewport(0, 0, 1280, 960);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glUseProgram(m_ProgCamera.GetHandle());

glVertexAttribPointer(0, 3, GL_FLOAT, 0, 0, vVertices);
glEnableVertexAttribArray(0);

// Bind the color attributes
glVertexAttribPointer(1, 3, GL_FLOAT, 0, 0, g_vertexColors);
glEnableVertexAttribArray(1);

glVertexAttribPointer(2, 2, GL_FLOAT, 0, 0, g_vertexTexCoords);
glEnableVertexAttribArray(2);
// Select Our Texture
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, m_textureCamera.GetHandle());

glDrawArrays( GL_TRIANGLES, 0, 6 );

// Cleanup
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(2);

感谢您的时间。

1 个答案:

答案 0 :(得分:2)

GL_LUMINANCE不是OpenGL ES 3.0中的颜色可渲染格式。第4.4.4节(帧缓冲区完整性)中的specification个状态:

  

如果内部格式是表格中的格式之一,则可以进行颜色渲染   3.12表示颜色可渲染或未标注格式RGBA或RGB。没有   其他格式(包括压缩内部格式)可以进行颜色渲染。

由于GL_LUMINANCE未包含在此列表中,因此无法渲染到此类纹理。例如,根据您的需要,您可以使用GL_R8