Demo
HDR色调映射
- 问题:有多个亮光源使这些数值总和超过了1.0,颜色值会被约束在1.0,从而导致场景混成一片,难以分辨:
- 色调映射:用更大范围的颜色值渲染从而获取大范围的黑暗与明亮的场景细节,最后将所有HDR(High Dynamic Range, 高动态范围)值转换成在[0.0, 1.0]范围的LDR(Low Dynamic Range,低动态范围)。
- 帧缓冲使用了(像
GL_RGB
)为其颜色缓冲的内部格式,OpenGL会在将这些值存入帧缓冲前自动将其约束到0.0到1.0之间。 - 当一个帧缓冲的颜色缓冲的内部格式被设定成了
GL_RGB16F
,GL_RGBA16F
,GL_RGB32F
或者GL_RGBA32F
时,这些帧缓冲被叫做浮点帧缓冲(Floating Point Framebuffer)浮点帧缓冲可以存储超过0.0到1.0范围的浮点值,所以非常适合HDR渲染。 - 但是如果直接转换HDR值到LDR值,这就像我们根本就没有应用HDR一样
- Reinhard色调映射(非线性):hdrColor / (hdrColor + vec3(1.0));对于亮部,映射到小的LDR范围中,会有更多的细节变化
- 利用曝光参数模拟人眼调节方式:vec3(1.0) - exp(-hdrColor * exposure);白天使用低曝光(exp后底e的函数曲线,亮部映射范围更小),在夜间使用高曝光(人眼会自动适应黑暗),
- 分数次方:这个数的分子次乘方后开分母次方
- 负数次方:一个数的负次方即为这个数的正次方的倒数