转自http://www.klayge.org/2011/02/26/gamma%E7%9A%84%E4%BC%A0%E8%AF%B4/

最近我们的引擎也在加入Gamma校正功能,看到龚老大这篇文章,算是把gamma校正的原理讲得比较清楚的了,于是转帖过来。做引擎的可以好好看看KalyGE.

Gamma校正对于图形和图像来说是个常提的概念,但对于gamma的缘由和使用方法,却存在着很多传说。本文将尽可能解析gamma校正来源,破解各种迷思。

Gamma校正从何而来

有一种常见的说法,gamma来源于眼睛对光感受。我也曾经错误地采用了这种说法。在wikipedia上查到了gamma的真正来源:

开发gamma编码是用来抵消阴极射线管(CRT)显示器的输入和输出特性。电子枪的电流,也就是光的亮度,与输入的正极电压的变化是非线性的。通过gamma压缩来改变输入信号抵消了这个非线性,因此输出图像就能有预期的亮度。

所以,gamma校正和人眼特性无关,仅仅和CRT有关。更新的显示方法,比如LCD和等离子之类,为了保证兼容,也都选择了和当年CRT一样的非线性特性。(其实和系统有关,Mac OS X 10.6就用的1.8,其他系统,包括电视,都用的2.2)

Gamma计算很简单,只是个power而已,也就是:

其中的γ就是用来校正的gamma值。

输入和输出

现在让我们来看看一个输入输出的例子。假设相机是线性的,显示器也是线性的,那么输入和输出的关系就是:


也就是通过相机拍照后,在显示器上看到的和真实场景的色彩一样。

可惜,现实是残酷的,显示器的gamma为2.2,所以如果相机仍然是线性的,那么结果就会变成:

这样在显示器上看到的就会有明显的色彩失真。解决方法是把相机的gamma设成1/2.2,这样两次调整之后又能得到真实场景的色彩了:

其实从这个过程也可以看出,gamma校正是为了在输入和输出的环节中保证能和真实场景一致,而眼睛不在这个环节中,所以和眼睛对亮度的感受没有直接关系了。

对渲染的意义

前面讲的输入是对相机拍的照片而言。而对渲染来说,情况又如何呢?渲染中用到的光照都是在线性空间的。因为在设计光照的时候都是认为1的亮度是0.5的2倍。光照如此,texture又如何呢?渲染中用到的 texture一般有两个来源,一个是照片,一个是artist手工画的。前文提到了,照片是gamma = 1/2.2的。一般图象处理软件也都是在gamma空间工作的,所以artist画的图一般也可以认为是gamma = 1/2.2的。所以,我们在pixel shader常可以见到这样的代码:

1 2
float4 diff = tex2D(diffuse_texture, uv); return diff * max(0, dot(light_dir, normal));

这样的代码对吗?不对也对

说其不对,是因为这里没显式地做gamma校正。做校正的话应该是这样的:

1 2
float4 diff = pow(tex2D(diffuse_texture, uv), 2.2f); return pow(diff * max(0, dot(light_dir, normal)), 1 / 2.2f);

也就是说,gamma校正的过程就是把输入的texture都转换到线性空间,并把输出的调整到gamma = 1/2.2的空间。

说其,是因为如果diffuse texture如果是sRGB格式的,那么再读取的时候硬件会把它自动转到线性空间。如果render target的texture也是sRGB格式的,在输出的时候硬件也会把它自动转到线性空间。所以,如果输入和输出纹理都是sRGB,那么原先那段shader就是正确的。对于不支持sRGB的老硬件,就必须自己做pow了。

除了渲染,另一个需要注意gamma的地方就是mipmap。如果原texture是gamma =1/2.2的,那么在建立mipmap chain的时候,每一层都必须和渲染一样,先转到线性空间,计算之后再转到gamma = 1/2.2的。否则,255和0混合得到的是51,而不是128。

总结

总之,计算都要发生在线性空间,所以输入和输出需要进行gamma校正。最佳选择是采用sRGB格式,这样pow是硬件内自动实现,速度更快,代码也简单。鉴于目前很多texture的数据是gamma = 1/2.2的,而纹理格式却被错误地标记成没有sRGB的,所以需要修改它们的格式标记,并重新建立mipmap。



gamma的传说(转自KlayGE Engine)相关推荐

  1. 我理解的伽马校正(Gamma Correction)

    [图形学]我理解的伽马校正(Gamma Correction) 2015年05月30日 18:22:52 妈妈说女孩子要自立自强 阅读数:69844 版权声明:本文为博主原创文章,未经博主允许不得转载 ...

  2. Docker、Kubernetes、Apache Mesos 之争 | 一个与传说不同的故事

    本文讲的是Docker.Kubernetes.Apache Mesos 之争 | 一个与传说不同的故事[编者的话]有无数的文章.讨论和社交网络上的交流在比较 Docker.Kubernetes 和 M ...

  3. 【年度开源、工具合集】牛津计划,DMTK,Graph Engine…提高你的工作效率!

    本篇合集包括以下三个部分的内容: 1.微软亚洲研究院过去一年的所有开源合集,如分布式机器学习工具包DMTK等. 2.利用微软研究院的技术提高工作效率的工具合集,如让没有机器学习背景的开发人员也能开发出 ...

  4. KlayGE游戏引擎

    From KlayGE游戏引擎, post address http://www.klayge.org/about/features/转载请注明出处为KlayGE游戏引擎,本文地址为http://ww ...

  5. Unity Gamma Linear Color Space

    转载文章,出自http://www.manew.com/thread-105872-1-1.html,作者 alphatt Gamma & Linear Color Space 一.真实?感觉 ...

  6. ArcGIS Engine环境下VS窗体与Unity虚拟现实地理空间的嵌套和交互

    本文目录 一.前言 1.结果图片 2.相关系统与平台介绍 3.实践思路与基本流程 4.涉及环境与软件 二.前期操作介绍 1.Unity和Winform窗体的连接交互 1.1.Unity和Winform ...

  7. 零基础 · 传说之下同人游戏制作教程

    1.0 废话 可略过 最好看一下 传说之下在很久以前便出现了"AU"这个说法,也正是从那时开始,无数游戏爱好者开始制作属于自己的传说之下同人游戏,随着时间的发展,无数AU游戏的&q ...

  8. Google Earth Engine学习笔记(一)

    基于GEE平台的Landsat8.Sentinel2.MODIS"去云"处理及FUI水色指数运算 文章目录 基于GEE平台的Landsat8.Sentinel2.MODIS&quo ...

  9. UNREAL ENGINE 4.12 正式发布!下载地址

    UNREAL ENGINE 4.12 正式发布! 下载地址:https://www.unrealengine.com/ Alexander Paschall 在 June 1, 2016 |功能新闻社 ...

最新文章

  1. python标准库很丰富支持多种编程范式_计算机考试简答题
  2. Java源码解析:hashCode与相同对象的关系
  3. 基本概念—机器学习ML与深度学习DL
  4. perl大骆驼和小骆驼_骆驼路线的主/从故障转移
  5. oracle数据库有几个服务_oracle数据库可以有几个数据库
  6. Flutter Container 容器以及对齐方式 Alignment
  7. 在Github中创建项目并与本地关联
  8. BestCoder15 1002.Instruction(hdu 5083) 解题报告
  9. SQL Server修改标识列方法 如自增列的批量化修改
  10. sql 基本操作语句笔记
  11. 纯js实现DIV拖拽
  12. Android安全-代码安全4-逆向工具对抗
  13. USB:Type-A、Type-B、Type-C、miniUSB、microUSB接口类型区分
  14. 英语发音规则---K字母
  15. 请总结描述用户和组管理类命令的使用方法并完成以下练习
  16. 如何查看网易云笔记自己曾经使用过的设备
  17. 乌班图利用指令修改桌面分辨率
  18. xml元素 标签 属性
  19. edb的安装以及带参数使用
  20. 华为云云容器引擎CCE踩坑记

热门文章

  1. 0.96寸OLED显示汉字,数字,英文,图片,GIF动画+取模软件使用+代码解析
  2. 电脑四核处理器与双核处理器的区别?
  3. Java、JSP农产品交易平台的设计与实现
  4. 最新基于互联网的智慧教育解决方案
  5. Information Retrieval(信息检索)笔记01:Boolean Retrieval(布尔检索)
  6. javascript:解决两个小数相乘出现无限小数
  7. 张飞笔记2:电机正反转电路图
  8. 100种思维模型之上帝视角思维模型-025
  9. 【SVM分类】基于鲸鱼算法优化支持向量机实现数据分类matlab代码
  10. 再谈基于 Kafka 和 ZooKeeper 的分布式消息队列原理