I tried to get AVG luminance today, but something seems to be wrong, it’s changing values quite dramaticaly even with small scene changes.
Currrently I am trying to get it this way:
Gen FBO and attach float16 texture of size (1,1);
Set viewport to (0,0,1,1)
Render fullscreen quad in ortho with scene texture applied while FBO is bound;
Render fullscreen quad with my scene tex bound and pass (1,1) luminance tex to HDR shader.
HDR Shader:
uniform sampler2D col_tex;
uniform sampler2D avg_lum;
uniform float e;
void main ()
{
vec3 pixcol = texture2D(col_tex, gl_TexCoord[0].xy);
vec3 lum_t = texture2D(avg_lum, vec2(0.f, 0.f));
float lum = lum_t.r*0.2125f+lum_t.g*0.7154f+lum_t.b*0.0721f;
gl_FragColor.rgb = e/lum*pixcol;
gl_FragColor.a = 1.0;
}
FBO creation routine:
glGenTextures(1, &avg_lum_tex);
glBindTexture(GL_TEXTURE_2D, avg_lum_tex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, RGB16F_ARB, 1, 1, 0, GL_RGB, GL_FLOAT, NULL);
glGenFramebuffers(1, &fb_lum);
glBindFramebuffer(GL_FRAMEBUFFER_EXT, fb_lum);
glFramebufferTexture2D(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, avg_lum_tex, 0);
glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
Part of render code (color_tex is 2D float texture with scene rendered to it)
glBindFramebuffer(GL_FRAMEBUFFER_EXT, fb_lum);
glViewport(0, 0, 1, 1);
SetOrtho();
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glActiveTexture(GL_TEXTURE0_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, color_tex);
glBegin(GL_QUADS);
glMultiTexCoord2f(GL_TEXTURE0, 0.0f, 0.0f);
glVertex2f(-1.0f, -1.0f);
glMultiTexCoord2f(GL_TEXTURE0, 1.0f, 0.0f);
glVertex2f( 1.0f, -1.0f);
glMultiTexCoord2f(GL_TEXTURE0, 1.0f, 1.0f);
glVertex2f( 1.0f, 1.0f);
glMultiTexCoord2f(GL_TEXTURE0, 0.0f, 1.0f);
glVertex2f(-1.0f, 1.0f);
glEnd();
glDisable(GL_TEXTURE_2D);
glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
glViewport(0, 0, scr.x, scr.y);
SetOrtho();
glActiveTexture(GL_TEXTURE0_ARB);
glBindTexture(GL_TEXTURE_2D, color_tex);
glActiveTexture(GL_TEXTURE1_ARB);
glBindTexture(GL_TEXTURE_2D, avg_lum_tex);
glUseProgramObject(ShaderHDR);
glUniform1i(glGetUniformLocation(ShaderHDR, "base"), 0);
glUniform1i(glGetUniformLocation(ShaderHDR, "avg_lum"), 1);
glUniform1f(glGetUniformLocation(ShaderHDR, "e"), HDR_alpha);
glBegin(GL_QUADS);
glMultiTexCoord2f(GL_TEXTURE0, 0.0f, 0.0f);
glVertex2f(-1.0f, -1.0f);
glMultiTexCoord2f(GL_TEXTURE0, 1.0f, 0.0f);
glVertex2f( 1.0f, -1.0f);
glMultiTexCoord2f(GL_TEXTURE0, 1.0f, 1.0f);
glVertex2f( 1.0f, 1.0f);
glMultiTexCoord2f(GL_TEXTURE0, 0.0f, 1.0f);
glVertex2f(-1.0f, 1.0f);
glEnd();
glUseProgramObject(0);
glActiveTexture(GL_TEXTURE0_ARB);