【发布时间】:2017-02-26 03:03:47
【问题描述】:
这是我的问题:我想在屏幕外渲染 2 张图像(来自之前的渲染),然后使用特殊算法将它们混合在一起。我的第一个图像/纹理是 RGB,第二个是灰度,所以我只得到了亮度。
我认为实现我的目标的最佳方法是使用帧缓冲区对象。所以我为第一个图像创建了一个 FBO,然后我将一个新纹理关联到该 FBO,它将接收渲染输出。纹理的格式是 GL_RGB 并且工作正常,我的第一个 FBO 包含其纹理中的渲染。 然后我对格式为 GL_LUMINANCE 的第二张图像执行相同的操作。但是在绘图函数中,当我绑定到这个 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
然后在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);
感谢您的宝贵时间。
【问题讨论】:
标签: c++ opengl-es framebuffer