gamma correction&being linear

http://http.developer.nvidia.com/GPUGems3/gpugems3_ch24.html

http://en.wikipedia.org/wiki/Gamma_correction

http://cmpmedia.vo.llnwd.net/o1/vault/gdc10/slides/Hable_John_Uncharted2_HDRLighting.pptx

HdrTheBungieWay


讲gamma的。


wikipedia上讲的很棒:

http://en.wikipedia.org/wiki/Gamma_correction

首先看一下wikipedia上关于gamma的定义:

Gamma correctiongamma nonlinearitygamma encoding, or often simply gamma, is the name of a nonlinear operation used to code and decode luminance or tristimulus values in video or still imagesystems.


为什么会有gamma?

人的眼睛对亮度的识别并不是线性的,而是呈现一个gamma function,简而言之如果不做gamma correction的话,0到255的亮度值,人眼会对某些部分不敏感(造成一些bit的浪费)对某些部分过于敏感(bit不足,给人以画质低的感觉)

按照bungie给出的数据:

Linear stores information you can’tsee!
  • 5 vs. 6       :     DIFFERENT
  • 205 vs. 206   :     SAME!

所以根据人眼睛的特性,把bit重新分配,把无法分辨的部分捏合,可以分辨的部分加细节,来达到有限bit,最高画质,这就是gamma correction的目的。


这有什么问题么?

问题就是texture在输出的时候也会有gamma correct,这就导致我们实在gamma空间去做光照操作。

而不是linear空间,这个简而言之就会造成数学上的不正确,数学上的不正确倒也不一定意味着不好看,有些时候这种可能是更让人喜欢。

但问题就是数学上不正确,就会失真。

失真的问题很隐晦,就会造成像uncharted2这样的游戏看起来更”电影“,而有些游戏就不是,并且难以调到那个程度:

  • 可能某些场景可以,但是换一个场景又不行了
  • 就是因为数学上不正确的
gamma问题在cg电影(e.g.avatar)里是很小心处理的问题,一定要保证正确的,所以如果游戏要走向”电影感,写实“的话,需要保证在linear空间里去计算光照。


怎么去做到linear空间去做计算:

  • 使用srgb texture sample:这样就保证sample出的texel是linear space的
  • 在中间render target输出的时候这个选择比较自由,关键是清晰的认识自己是在哪一空间,比如一直在linear 空间里,那就一直保持就好,
    • 关键是空间一致
  • 最终frame buffer输出的时候使用D3DRS_SRGBWRITEENABLE,保证回到gamma空间







你可能感兴趣的:(游戏,function,buffer,encoding)