最近,我正在使用OpenGL框架中的glsl和fbo。以下是详细信息:
Glfw和glew用于构建OpenGL环境。
我渲染到OpenGL窗口,也渲染到fbo(Framebuffer对象)。
多个渲染缓冲区绑定到fbo,用于差异渲染数据,像素颜色,像素三角形和顶点id等。
通过“投影纹理”方法为球体指定其纹理。
我在渲染循环之前设置了glEnable(GL_DEPTH_TEST);
。
在每个帧之前,我运行glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
创建FBO:
glGenRenderbuffers(1,&m_color_buffer);
glBindRenderbuffer(GL_RENDERBUFFER,m_color_buffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, WindowWidth, WindowHeight);
//////generate other render buffers////////////
glGenFramebuffers(1, &m_fbo);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER,m_fbo);
glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER,
GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_color_buffer);
//////bind other render buffers////////////
//set the render buffers
GLenum drawBuffers[] = { GL_NONE, GL_COLOR_ATTACHMENT0,
GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3 };
glDrawBuffers(5, drawBuffers);
在片段着色器中:
layout( location = 1 ) out vec4 FragColor;
//////////other output variables ///////////////////
void main() {
vec4 projTexColor = vec4(0.0);
if( frag.ProjTexCoord.z > 0.0 )
{
projTexColor = textureProj( ProjectorTex, frag.ProjTexCoord );
}
FragColor = projTexColor;
/////////write other data/////////////
}
RenderBuffer to file:
glBindFramebuffer(GL_READ_FRAMEBUFFER, m_fbo);
glReadBuffer(GL_COLOR_ATTACHMENT0);
GLubyte *m_data = (GLubyte*)malloc(4 * m_width * m_height);
glReadPixels(0, 0, m_width, m_height, GL_RGBA, GL_UNSIGNED_BYTE, m_data);
TGAIO::write(m_data,m_width,m_height,"e:/1.tga");
结果如下:
似乎球体的后部出现了。前部也变得支离破碎。
那么,发生了什么?我没有在片段着色器中声明GL_NONE(OpenGL默认渲染缓冲区)的输出,它是如何获得正确的数据的?看来OpenGL比我聪明,至少。 LOL。