GL_DEPTH_TEST在glsl着色器

时间:2015-11-27 10:40:55

标签: opengl glsl shader

最近,我正在使用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");

结果如下:

渲染到OpenGL窗口: enter image description here

渲染到fbo时: enter image description here

似乎球体的后部出现了。前部也变得支离破碎。

那么,发生了什么?我没有在片段着色器中声明GL_NONE(OpenGL默认渲染缓冲区)的输出,它是如何获得正确的数据的?看来OpenGL比我聪明,至少。 LOL。

0 个答案:

没有答案