http://cmpmedia.vo.llnwd.net/o1/vault/gdc10/slides/Hable_John_Uncharted2_HDRLighting.pptx
讲gamma的。
wikipedia上讲的很棒:
首先看一下wikipedia上关于gamma的定义:
Gamma correction, gamma nonlinearity, gamma encoding, or often simply gamma, is the name of a nonlinear operation used to code and decode or in or systems.
为什么会有gamma?
人的眼睛对亮度的识别并不是线性的,而是呈现一个gamma function,简而言之如果不做gamma correction的话,0到255的亮度值,人眼会对某些部分不敏感(造成一些bit的浪费)对某些部分过于敏感(bit不足,给人以画质低的感觉)
按照bungie给出的数据:
- 5 vs. 6 : DIFFERENT
- 205 vs. 206 : SAME!
所以根据人眼睛的特性,把bit重新分配,把无法分辨的部分捏合,可以分辨的部分加细节,来达到有限bit,最高画质,这就是gamma correction的目的。
这有什么问题么?
问题就是texture在输出的时候也会有gamma correct,这就导致我们实在gamma空间去做光照操作。
而不是linear空间,这个简而言之就会造成数学上的不正确,数学上的不正确倒也不一定意味着不好看,有些时候这种可能是更让人喜欢。
但问题就是数学上不正确,就会失真。
失真的问题很隐晦,就会造成像uncharted2这样的游戏看起来更”电影“,而有些游戏就不是,并且难以调到那个程度:
- 可能某些场景可以,但是换一个场景又不行了
- 就是因为数学上不正确的
怎么去做到linear空间去做计算:
- 使用srgb texture sample:这样就保证sample出的texel是linear space的
- 在中间render target输出的时候这个选择比较自由,关键是清晰的认识自己是在哪一空间,比如一直在linear 空间里,那就一直保持就好,
- 关键是空间一致
- 最终frame buffer输出的时候使用D3DRS_SRGBWRITEENABLE,保证回到gamma空间
原文链接: