2016-10-17 69 views
0

这是我的问题:我想渲染2个图像离屏(来自以前的渲染),然后用特殊算法将它们混合在一起。我的第一个图像/纹理是RGB,第二个是灰度,所以我只得到亮度。OpenGL ES3 FrameBuffer对象错误

我认为实现我的目标的最好方法是使用帧缓冲区对象。因此,我为第一张图像创建一个FBO,然后我将该FBO与一个将接收渲染输出的新纹理关联起来。纹理的格式是GL_RGB,它工作正常,我的第一个FBO包含纹理中的渲染。 然后,我对第二张图像的格式是GL_LUMINANCE。但是在draw函数中,当我绑定到这个FrameBuffer并检查Status时,我得到了错误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); 

感谢您的时间。

回答

2

GL_LUMINANCE在OpenGL ES 3.0中不是可渲染的颜色格式。节的specification状态4.4.4(Framebuffer的完整性):

内部格式是色渲染的,如果它是从表 3.12的格式之一标记为颜色渲染,或者如果它是未上浆的格式RGBA或RGB。其他格式,包括压缩的内部格式,都可以通过颜色呈现。

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

+0

感谢您的回答。我在调查中发现这一点,但我不确定其意义。我用GL_R8代替。 – Ango742