@pxt wrote:
hello! im trying to do a multipass shader and i need to get the texture of the previus buffer.
doing this, i get only a red color:gBuffer
glGenFramebuffers(1, &gBuffer); glBindFramebuffer(GL_FRAMEBUFFER, gBuffer); glGenTextures(1, &gColor); glBindTexture(GL_TEXTURE_2D, gColor); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, width, height, 0, GL_RGBA, GL_FLOAT, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, gColor, 0); // glGenTextures(1, &gPosition); glBindTexture(GL_TEXTURE_2D, gPosition); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_FLOAT, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, gPosition, 0); glGenTextures(1, &gAlbedo); glBindTexture(GL_TEXTURE_2D, gAlbedo); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_FLOAT, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D, gAlbedo, 0); glGenTextures(1, &gDepth); glBindTexture(GL_TEXTURE_2D, gDepth); glTexImage2D(GL_TEXTURE_2D, 0, GL_R16F, width, height, 0, GL_RGB, GL_FLOAT, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT3, GL_TEXTURE_2D, gDepth, 0); GLuint attachments[4] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3 }; glDrawBuffers(4, attachments); GLuint rboDepth; glGenRenderbuffers(1, &rboDepth); glBindRenderbuffer(GL_RENDERBUFFER, rboDepth); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rboDepth); if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) std::cout << "Framebuffer not complete!" << std::endl; glBindFramebuffer(GL_FRAMEBUFFER, 0);
firstBuffer (until here everything is ok, i can get the texture from the gBuffer)
glGenFramebuffers(1, &buffer_firstPass); glBindFramebuffer(GL_FRAMEBUFFER, buffer_firstPass); glGenTextures(1, &buffer_firstPassTexture); glBindTexture(GL_TEXTURE_2D, buffer_firstPassTexture); glTexImage2D(GL_TEXTURE_2D, 0, GL_R16F, width, height, 0, GL_RGB, GL_FLOAT, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, buffer_firstPassTexture, 0); GLuint attachments[1] = { GL_COLOR_ATTACHMENT0}; glDrawBuffers(1, attachments); GLuint rboDepth; glGenRenderbuffers(1, &rboDepth); glBindRenderbuffer(GL_RENDERBUFFER, rboDepth); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rboDepth); if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) std::cout << "Framebuffer not complete!" << std::endl; glBindFramebuffer(GL_FRAMEBUFFER, 0);
second pass
glGenFramebuffers(1, &buffer_secondPass); glBindFramebuffer(GL_FRAMEBUFFER, buffer_secondPass); glGenTextures(1, &buffer_secondPass); glBindTexture(GL_TEXTURE_2D, buffer_secondPass); glTexImage2D(GL_TEXTURE_2D, 0, GL_R16F, width, height, 0, GL_RGB, GL_FLOAT, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, buffer_secondPass, 0); if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) std::cout << "SSAO Framebuffer not complete!" << std::endl; glBindFramebuffer(GL_FRAMEBUFFER, 0);
here is the problem. i need to use in the second pass the first pass, using shaders:
glBindFramebuffer(GL_FRAMEBUFFER, buffer_firstPass); glClear(GL_COLOR_BUFFER_BIT); firstPassShader.shader.begin(); firstPassShader.shader.setUniformTexture("gColor", GL_TEXTURE_2D, gColor,0); firstPassShader.shader.setUniformTexture("gPosition", GL_TEXTURE_2D, gPosition, 1); firstPassShader.shader.setUniformTexture("gDepth", GL_TEXTURE_2D, gDepth, 2); firstPassShader.shader.setUniformTexture("gAlbedo", GL_TEXTURE_2D, gAlbedo, 3); quad.draw(OF_MESH_FILL); firstPassShader.shader.end(); glBindFramebuffer(GL_FRAMEBUFFER, 0); //////////////////////////////////////////////////////// // glBindFramebuffer(GL_FRAMEBUFFER, buffer_secondPass); glClear(GL_COLOR_BUFFER_BIT); secondPassShader.shader.begin(); secondPassShader.shader.setUniformTexture("gColor", GL_TEXTURE_2D, gColor,0); secondPassShader.shader.setUniformTexture("gPrev", GL_TEXTURE_2D, buffer_firstPassTexture, 1); quad.draw(); // secondPassShader.shader.end(); glBindFramebuffer(GL_FRAMEBUFFER, 0);
Posts: 1
Participants: 1