OpenGL3.3_C++_Windows(29HDR色调映射)

Demo

exposure = 0.1f
exposure = 5.0f

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_RGB16FGL_RGBA16FGL_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的函数曲线,亮部映射范围更小),在夜间使用高曝光(人眼会自动适应黑暗)
  • 简单理解exp变化:
  • 把color去掉-----e^-exposure(简称x)
  • 当exposure >1,e^-x (x为正数)~= e^1/x ~= e根号x,1-取反后,暗部映射到LDR的范围更广,亮处LDR范围更少
  • 当exposure <1 , e^-x (x为小数)~= e^x,1-取反后,暗部映射到LDR的范围更少,亮处LDR范围更多
  • 分数次方:这个数的分子次乘方后开分母次方
  • 负数次方:一个数的负次方即为这个数的正次方的倒数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值