關於 unity 中顏色空間問題的總結

首先官方文檔肯定是我們參考的重點,最重要的就是這幾篇文章了:
https://docs.unity3d.com/Manual/LinearLighting.html
https://docs.unity3d.com/Manual/LinearRendering-LinearOrGammaWorkflow.html
https://docs.unity3d.com/Manual/LinearRendering-GammaTextures.html
https://docs.unity3d.com/Manual/LinearRendering-LinearTextures.html

這4篇文章基本上介紹了unity linearRendering 要怎麼去使用。

這裏還有3篇文章對Linear和Gamma的區別,和選擇進行了很好的說明
https://www.cnblogs.com/guanzz/p/7416821.html
http://blog.csdn.net/ngrandmarch/article/details/46407017
http://blog.csdn.net/radiocat520/article/details/52514961


這裏總結一下用法:

有一個大前提是,顯示器在顯示顏色前,總是會進行一次gamma矯正。


首先是對非線性輸入的紋理資源的處理(這裏主要指的是貼圖,像法線一類的信息紋理理論上只是爲了放數據用的,可以算是線性的),在2017版本中紋理資源上的那個 sRGB 選項很重要。
開了,則紋理在採樣時,會被當成是非線性輸入,會進行gamma矯正。
關了,則紋理在採樣時,會被當成線性輸入的,不會矯正了,直接被拿去計算了。


然後是 Other Settings 中的 Color Space。

linear 空間下的話:
默認採樣,計算都是在linear空間下。
在shader中計算完成後,將顏色轉換到gamma空間,然後寫入顏色緩存,等待顯示器顯示。
然後顯示器會自動經過gamma矯正來顯示顏色。

gamma空間下的話:
默認採樣,計算都是在gamma空間下。
在shader中計算完成後,直接寫入顏色緩存,等待顯示器顯示。
然後顯示器會自動經過gamma矯正來顯示顏色。


綜上所述,gamma矯正這一塊,現在被分割成了輸入和輸出2部分。

輸入時:
要合理區分紋理資源是屬於線性的,還是非線性輸入的,好在輸入的時候決定是不是要給它搞成srgb的,

輸出時:
感覺主要是因爲在unity沒有這個功能前,就已經存在很多種其它的矯正方式。
比如,自己把矯正代碼寫在了材質的shader裏,在攝像機上做了特效後處理式的gamma矯正效果。
你得照顧兼容一下其他人的項目和感受吧,所以你就要決定要不要最終將顏色轉回到gamma空間去,等着給顯示器用。
因爲顯示器也是不講道理的,它最終總會進行一次gamma矯正的,然後才顯示的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章