Hello everyone.
I was implementing bloom in a texture as below example:
however, bloom is having depth problems:
Texture:
My code is:
Framebuffer (deferred shading):
unsigned int _texturePosition;
unsigned int _textureDiffuse;
unsigned int _textureNormal;
unsigned int _textureLight;
unsigned int _textureBloom;
unsigned int attachments[5] = {
GL_COLOR_ATTACHMENT0, //pos
GL_COLOR_ATTACHMENT1, //diff
GL_COLOR_ATTACHMENT2, //normal
GL_COLOR_ATTACHMENT3, //light
GL_COLOR_ATTACHMENT4 //Bloom
};
glGenFramebuffers(1, &_frameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, _frameBuffer);
glGenTextures(1, &_texturePosition);
glBindTexture(GL_TEXTURE_2D, _texturePosition);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F, SCR_WIDTH, SCR_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_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, _texturePosition, 0);
glGenTextures(1, &_textureDiffuse);
glBindTexture(GL_TEXTURE_2D, _textureDiffuse);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, SCR_WIDTH, SCR_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_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, _textureDiffuse, 0);
glGenTextures(1, &_textureNormal);
glBindTexture(GL_TEXTURE_2D, _textureNormal);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F, SCR_WIDTH, SCR_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_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D, _textureNormal, 0);
glGenTextures(1, &_textureLight);
glBindTexture(GL_TEXTURE_2D, _textureLight);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, SCR_WIDTH, SCR_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_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT3, GL_TEXTURE_2D, _textureLight, 0);
glGenTextures(1, &_textureBloom);
glBindTexture(GL_TEXTURE_2D, _textureBloom);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, SCR_WIDTH, SCR_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_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT4, GL_TEXTURE_2D, _textureBloom, 0);
glDrawBuffers(5, attachments);
My bloom Shader (fragment):
#version 330
in vec2 TexCoord;
in vec3 Nrm;
in vec3 WorldPos;
layout (location = 0) out vec3 WorldPosOut;
layout (location = 1) out vec4 DiffuseOut;
layout (location = 2) out vec3 NormalOut;
layout (location = 3) out vec4 LightOut;
layout (location = 4) out vec4 BloomOut;
uniform sampler2D Texture;
uniform sampler2D TextureBloom;
uniform vec3 AmbientDirection;
uniform vec3 AmbientColor;
uniform float AmbientPower;
uniform float discardAlphaPNGValue;
void main()
{
vec4 diffuseTexture = vec4(texture2D(Texture, TexCoord));
if(diffuseTexture.a < discardAlphaPNGValue){
discard;
}
DiffuseOut = diffuseTexture;
WorldPosOut = WorldPos;
NormalOut = normalize(Nrm);
BloomOut = texture2D(TextureBloom, TexCoord);
float dt = 1.0 - (max(dot(NormalOut, -AmbientDirection),0.0) * 0.5);
LightOut = vec4(AmbientColor * AmbientPower * dt, 1);
}
Using bloom shader:
//.........
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, _frameBuffer);
glDrawBuffers(5, attachments);
//.........
glEnable(GL_DEPTH_TEST);
glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
_bloomShader.use();
_bloomShader.setMat4("View", view);
_bloomShader.setMat4("Proj", projection);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureTree2);
_bloomShader.setInt("Texture", 0);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, textureTreeBloom);
_bloomShader.setInt("TextureBloom", 1);
_bloomShader.setMat4("World", model);
_bloomShader.setVec3Glm("AmbientColor", AMBIENT_COLOR);
_bloomShader.setFloat("AmbientPower", AMBIENT_POWER);
_bloomShader.setVec3Glm("AmbientDirection", glm::vec3(1, 1, 1));
tree->draw(); //glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0);
And final shader to combine:
out vec4 FragColor;
uniform sampler2D ColorBuffer; //0
uniform sampler2D LightBuffer; //1
uniform sampler2D BloomBuffer; //2
in vec2 TexCoord;
void main()
{
vec4 color = texture2D(ColorBuffer, TexCoord);
vec4 bloom = texture2D(BloomBuffer, TexCoord);
FragColor = (color * texture2D(LightBuffer, TexCoord) ) + bloom;
}
And to use:
glClearColor(0.52f, 0.80f, 0.92f, 1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glCullFace(GL_BACK);
_finalCombine.use();
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, _gBuffer._textureDiffuse);
_finalCombine.setInt("ColorBuffer", 0);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, _gBuffer._textureLight);
_finalCombine.setInt("LightBuffer", 1);
glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, _gBuffer._textureBloom);
_finalCombine.setInt("BloomBuffer", 2);
_fsQuad.draw(); //fullscreen quad to deferred shading
can anybody help me ?
Thank you