C++ OpenGL ES3帧缓冲区对象错误
这是我的问题:我想在屏幕外渲染2幅图像(来自之前的渲染),然后用一种特殊算法将它们混合在一起。我的第一个图像/纹理是RGB,第二个是灰度,所以我只得到了亮度 我认为实现我的目标的最好方法是使用帧缓冲区对象。因此,我为第一个图像创建了一个FBO,然后将一个新纹理与该FBO关联,该纹理将接收渲染输出。纹理的格式是GL_RGB,效果很好,我的第一个FBO在其纹理中包含渲染。 然后我对第二幅图像做了同样的处理,它的格式是GL_亮度。但是在draw函数中,当我绑定到这个帧缓冲区并检查状态时,我得到了错误GL\u FrameBuffer\u complete\u ATTACHMENT。如果我将纹理更改为RGB,它就会工作 但是对于混合,我需要访问亮度,而不是图像的rgb分量 你有什么解决办法吗 我正在imx6q飞思卡尔的SOC上使用OpenGL ES 3.0 这是我的密码: 1-创建帧缓冲区对象和纹理C++ OpenGL ES3帧缓冲区对象错误,c++,opengl-es,framebuffer,C++,Opengl Es,Framebuffer,这是我的问题:我想在屏幕外渲染2幅图像(来自之前的渲染),然后用一种特殊算法将它们混合在一起。我的第一个图像/纹理是RGB,第二个是灰度,所以我只得到了亮度 我认为实现我的目标的最好方法是使用帧缓冲区对象。因此,我为第一个图像创建了一个FBO,然后将一个新纹理与该FBO关联,该纹理将接收渲染输出。纹理的格式是GL_RGB,效果很好,我的第一个FBO在其纹理中包含渲染。 然后我对第二幅图像做了同样的处理,它的格式是GL_亮度。但是在draw函数中,当我绑定到这个帧缓冲区并检查状态时,我得到了错误G
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
然后在draw函数中:
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);
谢谢您的时间。在OpenGL ES 3.0中,GL\U亮度不是一种颜色可渲染格式。第4.4.4节(帧缓冲区完整性)中的状态: 如果内部格式是表中的格式之一,则它是可颜色渲染的 3.12标注为颜色可渲染,或者如果是非尺寸格式RGBA或RGB。不 其他格式(包括压缩的内部格式)是可渲染颜色的
由于此列表中不包括
glu亮度
,因此无法渲染到此类纹理。例如,根据您的需要,您可以使用GL\u R8
。GL\u亮度
在OpenGL ES 3.0中不是颜色可渲染格式。第4.4.4节(帧缓冲区完整性)中的状态:
如果内部格式是表中的格式之一,则它是可颜色渲染的
3.12标注为颜色可渲染,或者如果是非尺寸格式RGBA或RGB。不
其他格式(包括压缩的内部格式)是可渲染颜色的
由于此列表中不包括
glu亮度
,因此无法渲染到此类纹理。例如,根据您的需要,您可以使用GL\u R8
。谢谢您的回答。我在说明书中找到了这个,但我不确定它的意思。我用GL_R8代替。谢谢你的回答。我在说明书中找到了这个,但我不确定它的意思。我用GL_R8代替。