OpenGL 帧缓冲区 - 渲染到纹理创建带有主帧缓冲区内容的纹理
Posted
技术标签:
【中文标题】OpenGL 帧缓冲区 - 渲染到纹理创建带有主帧缓冲区内容的纹理【英文标题】:OpenGL Framebuffer - rendering to texture creates texture with main framebufer content 【发布时间】:2016-08-02 19:40:52 【问题描述】:这基本上是更大项目的一部分,我正在通过以下方式创建具有颜色、深度和模板缓冲区的帧缓冲区:
// Create texture
glGenTextures(1, &m_textureInput);
glBindTexture(GL_TEXTURE_2D, m_textureInput);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, getWidth(), getHeight(), 0, GL_BGRA, GL_UNSIGNED_BYTE, 0);
// Create FBOs
glGenFramebuffers(1, &m_fboInput);
glBindFramebuffer(GL_FRAMEBUFFER, m_fboInput);
// Attach texture to it
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_textureInput, 0);
// Render buffer, depth with stencil
glGenRenderbuffers(1, &m_rbDepthStencilInput);
glBindRenderbuffer(GL_RENDERBUFFER, m_rbDepthStencilInput);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, getWidth(), getHeight());
//Attach depth buffer to FBO
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_rbDepthStencilInput);
//Also attach as a stencil
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, m_rbDepthStencilInput);
status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if(status != GL_FRAMEBUFFER_COMPLETE)
// Restore current framebuffer
glBindFramebuffer(GL_FRAMEBUFFER, 0);
return false;
glBindFramebuffer(GL_FRAMEBUFFER, 0);
我绑定它以渲染它:
glBindFramebuffer(GL_FRAMEBUFFER, m_fboInput);
// render
glBindFramebuffer(GL_FRAMEBUFFER, 0);
当我转储附加纹理时:
glBindTexture(GL_TEXTURE_2D, m_textureInput);
long imageSize = x * y * 4;
unsigned char *data = new unsigned char[imageSize];
glReadPixels(0,0,x,y, GL_BGRA,GL_UNSIGNED_BYTE,data);
我收到主帧缓冲区 (0) 的内容。
知道我做错了什么吗? 提前致谢。
【问题讨论】:
【参考方案1】:glReadPixels docs 说它从帧缓冲区读取数据。由于您之前将零绑定到它,我猜它是从默认帧缓冲区读取的。
您可以绑定帧缓冲区对象,然后使用GL_COLOR_ATTACHMENT0
调用glReadBuffer,然后执行glReadPixels,或者更直接地,使用glGetTexImage 直接从您的纹理中读取。
【讨论】:
这完全是我的错误。是的,你是对的。我认为 glReadPixels 将从绑定纹理而不是 fbo 读取。接受这个作为答案。以上是关于OpenGL 帧缓冲区 - 渲染到纹理创建带有主帧缓冲区内容的纹理的主要内容,如果未能解决你的问题,请参考以下文章
Opengl 和 Webgl:从附加到当前帧缓冲区的纹理中采样
OpenGL ES 学习教程(十四) 帧缓冲区对象(FBO) 实现渲染到纹理(Render To Texture/RTT)