Opengl HDR

HDR是为了解决颜色被限制在0-1之间  让亮的更亮 暗的更暗

需要浮点帧缓冲 

glBindTexture(GL_TEXTURE_2D, colorBuffer);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, SCR_WIDTH, SCR_HEIGHT, 0, GL_RGB, GL_FLOAT, NULL);

GL_RGB16F这个需要注意

但是 这样子还是不能解决很多1.0的地方就全白 细节不见了 就需要toneMapping操作

先在颜色公式计算允许暂时大于1 最后映射到0-1  final/(final+vec3(1.0));

然后gamma矫正

void main()
{             
    const float gamma = 2.2;
    vec3 hdrColor = texture(hdrBuffer, TexCoords).rgb;

    // Reinhard toneMapping
    vec3 mapped = hdrColor / (hdrColor + vec3(1.0));
    // Gamma
    mapped = pow(mapped, vec3(1.0 / gamma));

    color = vec4(mapped, 1.0);
}   

总体操作 就是先使用FBO把场景绘制到纹理中 对纹理进行这一系列处理之后贴在quad上 显示出来

具体可以自己看看learnOpenGL

你可能感兴趣的:(opengl)