Saturday, March 13, 2010

Gamma Correction

前一陣子有人問我Gamma Correction的做法, 我才想到在我拜訪過的亞洲遊戲公司中, 很多公司都沒有對貼圖做Gamma Correction, 原因可能是沒有真正去比較過有無Gamma Correction的畫質間的差異. 所謂有圖有真相, 所以我先貼上兩張圖來做一下比較.

有Gamma Correction

無Gamma Correction

差異相當明顯對吧. 這是因為美術人員給的貼圖事實上都是gamma修正過的(因為透過螢幕來繪製)而非線性的, 所以未經過修正的貼圖資料, 直接下去運算lighting, 結果自然是不正確的. 而目前新的顯卡都有支援硬體的gamma修正讀取及寫入, 只要兩三行程式碼就可以完成, 非常容易, 所以如果你的繪圖引擎還沒有支援gamma修正的話, 是時候考慮看看加入gamma修正了 :)

何謂Gamma Correction

6 comments:

张骋 ChengZhang said...

是不是

tex = tex2D(Simpler,Texture);
tex = Pow(tex,1/2.2);

然后 Lighting
最后 return Power(out,2.2);

这样就可以呢?

由于 GFW 的存在, Blogspot 上的东西就更难被中国的开发者发现了呢

fallingCAT said...

顛倒了, 應該是

tex = tex2D(Simpler,Texture);
tex = Pow(tex,2.2);

然后 Lighting
最后 return Power(out,1/2.2);

這是硬體不支援SRGB讀取/寫入時在PS中的做法, 但如果硬體有支援SRGB格式時, 建議還是使用SRGB讀取/寫入,可以省下PS的轉換時間.

真路人 said...

So cool! I like it. Will this effect kill performance?

fallingCAT said...

如果在PS中來做的話, 多少會影響一些效能, 但是不會影響很大.

Gary Codeman said...

其实先要跟你报告 亚洲的游戏公司 我之前那家台湾公司是有做这个修正的 只是一直苦恼的是 结果跟你的是完全相反, 做了反而比没有做还灰。 自己试算也类似这种结果,非线性空间里头做光线运算. 结果黑的更黑,对比较强。 所差的是线性空间里不容易过曝。 这个问题还一直到现在, 看到你的文章,让我觉得很讶异, 你的结果似乎才是我要的。 但我反覆推导做测试, 都是相反地...

fallingCAT said...

首先要注意的是, normal map這ㄧ類數值性的貼圖是不需要做gamma correction的, 只有diffuse map, specular map這ㄧ類貼圖才需要修正.

而你說到正好相反的問題, 很有可能是你們美術人員在輸出貼圖時就已經做了gamma correction了, 所以你再做一次的結果就會不正確了.