OpenGL - Gamma Correction

当我们计算出场景中所有像素的最终颜色以后,我们就必须把它们显示在监视器上。过去,大多数监视器是阴极射线管显示器(CRT)。这些监视器有一个物理特性就是两倍的输入电压产生的不是两倍的亮度。输入电压产生约为输入电压的2.2次幂的亮度,这叫做监视器Gamma
在这里插入图片描述
第一行是人眼所感知到的正常的灰阶,亮度要增加一倍(比如从0.1到0.2)你才会感觉比原来变亮了一倍。然而,当我们谈论光的物理亮度,比如光源发射光子的数量的时候,底部(第二行)的灰阶显示出的才是物理世界真实的亮度。物理亮度和感知亮度的区别在于,物理亮度基于光子数量,感知亮度基于人的感觉,比如第二个灰阶里亮度0.1的光子数量是0.2的二分之一),但是由于这与我们的眼睛感知亮度不完全一致(对比较暗的颜色变化更敏感),所以它看起来有差异。

一个现象就是监视器会对线性颜色作2.2次幂处理,导致实际看到的颜色会比输出的暗。
在这里插入图片描述
Gamma校正的思路是在最终的颜色输出上应用监视器Gamma的倒数,监视器最终会显示出我们在应用中设置的那种线性的颜色。

// 1、每个后续的绘制命令里,在颜色储存到颜色缓冲之前先校正sRGB颜色。
glEnable(GL_FRAMEBUFFER_SRGB);

// 2、
fragColor.rgb = pow(fragColor.rgb, vec3(1.0/gamma));

sRGB textures

当我们基于监视器上看到的情况创建一个图像,我们就已经对颜色值进行了gamma校正,如果在渲染中又进行了一次gamma校正,就会二级校正,导致图片变亮。

OpenGL给我们提供了另一个方案来解决我们的麻烦,这就是GL_SRGBGL_SRGB_ALPHA内部纹理格式。自动把颜色校正到线性空间中,这样我们所使用的所有颜色值都是在线性空间中的了。

diffuse纹理,这种为物体上色的纹理几乎都是在sRGB空间中的。而为了获取光照参数的纹理,像specular贴图和法线贴图几乎都在线性空间中,所以如果你把它们也配置为sRGB纹理的话,光照就坏掉了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值