Hi
I have two framebuffers that I use to render two different objects. Now I want to merge them together before I display at the default framebuffer.
I am sending the color and depth buffers as uniform 2D samplers and depth compare them in a fragment shader to get the winning pixel.
I am able to properly sample the color values but depth values are '0' throught out. I am not sure what might be causing this, but I have enabled depth testing before rendering.
Here's snippets of my code:
Code :glGenFramebuffers(1, &_fbo); glBindFramebuffer(GL_FRAMEBUFFER, _fbo); glGenTextures(1, &_cbo); glGenTextures(1, &_dbo); { glBindTexture(GL_TEXTURE_2D, _cbo); 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_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, dim.x, dim.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); } { glBindTexture(GL_TEXTURE_2D, _dbo); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, dim.x, dim.y, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, nullptr); } glBindFramebuffer(GL_FRAMEBUFFER, _fbo); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, _cbo, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, _dbo, 0);
This is how I send uniform samplers to the shader.
Code :glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D,cbo1); glUniform1i(glGetUniformLocation(QuadShader.Program, "color1"),0); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, cbo2); glUniform1i(glGetUniformLocation(QuadShader.Program, "color2"), 1); glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_2D, dbo1); glUniform1i(glGetUniformLocation(QuadShader.Program, "depth1"), 2); glActiveTexture(GL_TEXTURE3); glBindTexture(GL_TEXTURE_2D, dbo2); glUniform1i(glGetUniformLocation(QuadShader.Program, "depth2"), 3); glBindVertexArray(BgVao); glDrawArrays(GL_TRIANGLES, 0, 6);
This is how my shader looks:
Code :uniform sampler2D color1; uniform sampler2D color2; uniform sampler2D depth1; uniform sampler2D depth2; out vec4 FragColor; void main() { ivec2 texcoord = ivec2(floor(gl_FragCoord.xy)); vec4 depth1 = texelFetch(depth1, texcoord,0); vec4 depth2 = texelFetch(depth2, texcoord,0); if(depth1.z > depth2.z) { FragColor = texelFetch(color1, texcoord, 0); } else { FragColor = texelFetch(color2, texcoord, 0); } }