Hi,
I’m writing a rendering engine using OpenGL in LWJGL(I’m writing in Java). I render my scene using multipass rendering, one pass for each light.
Recently I’ve implemented rendering to texture using FBO. I firstly render the scene to texture and then render a quad with this texture on it. When I use only one light for example ambient light, everything works well, but when there are more than one light and I use blending to join results of multiple passes, rendered texture looks strangely, while the scene I see on screen still looks well.
Here are the fragments of code:
RenderToTextureCamera class
public void init()
{
...
framebuffer = glGenFramebuffers();
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
renderTexture.bind();
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, getWidth(), getHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
depthRenderbuffer = glGenRenderbuffers();
glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, getWidth(), getHeight());
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer);
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, renderTexture.getTextureId(), 0);
glDrawBuffers(new int[] { GL_COLOR_ATTACHMENT0 });
if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
throw new RuntimeException("Cannot initialize framebuffer for camera.");
}
...
public void render()
{
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glViewport(getScreenOffsetX(), getScreenOffsetY(), getWidth(), getHeight());
ForwardRendering.renderCamera(this);
}
ForwardRendering class
public static void renderCamera(Camera camera)
{
...
else
{
renderShader(ambientShader, ambientLight, camera);
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE);
glDepthMask(false);
glDepthFunc(GL_EQUAL);
directionalLights.forEach(light -> { if(light.isEnabled()) renderShader(directionalShader, light, camera); });
pointLights.forEach(light -> { if(light.isEnabled()) renderShader(pointShader, light, camera); });
spotLights.forEach(light -> { if(light.isEnabled()) renderShader(spotShader, light, camera); });
glDepthFunc(GL_LESS);
glDepthMask(true);
glDisable(GL_BLEND);
}
}
public static void renderShader(Shader shader, Light light, Camera camera)
{
meshRenderers.forEach(meshRenderer -> meshRenderer.render(shader, light, camera));
}