I have created three depth buffers. First buffer, I have drawn using GL_LESS. How can I pass this information to second buffer and third buffer and draw the second buffer and third buffer such that secondbuffer.z <= thirdBuffer.z?
Below is the code I have written. I am newbie to OpenGL. Can someone please suggest other efficient algorithm if any
I have initialised three framebuffers, one for each depth buffers. First buffer i have drawn using GL_LESS. How can I pass this drawn buffer to subsequent buffers?
GLuint FramebufferName = 0;
glGenFramebuffers(1, &FramebufferName);
glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);
GLuint depthrenderbuffer1;
glGenRenderbuffers(1, &depthrenderbuffer1);
glBindRenderbuffer(GL_RENDERBUFFER, depthrenderbuffer1);
glClear(GL_DEPTH_BUFFER_BIT);
glClearDepth(1.);
glDepthFunc(GL_LESS);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthrenderbuffer1);
GLuint DepthTex1Location = glGetUniformLocation(programID_normalmap, "DepthTex1");
glUniform1i(DepthTex1Location, 0);
GLenum DrawBuffers[1] = {GL_DEPTH_ATTACHMENT};
glDrawBuffers(1, DrawBuffers);
GLuint FramebufferName2 = 0;
glGenFramebuffers(1, &FramebufferName);
glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);
GLuint depthrenderbuffer2;
glGenRenderbuffers(1, &depthrenderbuffer2);
glBindRenderbuffer(GL_RENDERBUFFER, depthrenderbuffer2);
glClear(GL_DEPTH_BUFFER_BIT);
glClearDepth(1.);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthrenderbuffer2);
GLuint DepthTex2Location = glGetUniformLocation(programID_normalmap, "DepthTex2");
glUniform1i(DepthTex2Location, 1);
//GLenum DrawBuffers2[1] = {GL_DEPTH_ATTACHMENT};
//glDrawBuffers(1, DrawBuffers2);
GLuint FramebufferName3 = 0;
glGenFramebuffers(1, &FramebufferName3);
glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName3);
GLuint depthrenderbuffer3;
glGenRenderbuffers(1, &depthrenderbuffer3);
glBindRenderbuffer(GL_RENDERBUFFER, depthrenderbuffer3);
glClear(GL_DEPTH_BUFFER_BIT);
glClearDepth(1.);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthrenderbuffer3);
GLuint DepthTex3Location =
glGetUniformLocation(programID_normalmap, "DepthTex3");
glUniform1i(DepthTex3Location, 2);
//GLenum DrawBuffers3[1] = {GL_DEPTH_ATTACHMENT};
//glDrawBuffers(1, DrawBuffers3);
Below is the fragment Shader:
version 330
uniform samplerRect DepthTex1;
uniform samplerRect DepthTex2;
uniform samplerRect DepthTex3;
out vec4 outputColor;
in vec3 fragmentColor;
void main(void)
{
// Bit-exact comparison between FP32 z-buffer and fragment depth
float frontDepth1 = texture(DepthTex1, gl_FragCoord.xy).r;
float frontDepth2 = texture(DepthTex2, gl_FragCoord.xy).r;
float frontDepth3 = texture(DepthTex3, gl_FragCoord.xy).r;
if (frontDepth2 <= frontDepth1) {
discard;
}
if (frontDepth3 <= frontDepth2) {
discard;
}
// Shade all the fragments behind the z-buffer
vec4 outputColor = fragmentColor;
}
Thanks for any help.
GL_MIN. Then, in the fragment shader, set the output "color" for each buffer to infinity, except for the buffer, into whose range the fragment falls. For this buffer, set the actual depth. You will need a separate render pass for the actual colors. You might also want to take a look at other ways to achieve oder-independent transparency - Nico Schertler