c++ - OpenGL ES3 FrameBuffer 对象错误

标签 c++ opengl-es framebuffer

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

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

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

你有什么解决办法吗?

我在 imx6q Freescale 的 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);

感谢您的宝贵时间。

最佳答案

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

An internal format is color-renderable if it is one of the formats from table 3.12 noted as color-renderable or if it is unsized format RGBA or RGB. No other formats, including compressed internal formats, are color-renderable.

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

关于c++ - OpenGL ES3 FrameBuffer 对象错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40081141/

相关文章:

ios - OpenGL ES 2.0 立方体贴图不显示纹理

c - 在控制台(帧缓冲区)中绘制字符的最快方法?

c++ - 无法在构造函数中使用大括号括起来的列表 - C++

c++ - SAPI5 语音/使用 32 位语音

c++ - 在 ubuntu 18.04 上找不到 "Findaws-lambda-runtime.cmake"

ubuntu - 是否可以在 Vulkan 中的实例之间共享帧缓冲区对象?

python - python的帧缓冲模块

C++-17 : cast function pointer to function with different argument pointer type

android - GLSL ES 局部变量崩溃?

iphone - OpenGL 立方体旋转