一、顏色空間基本概念疑問
1、什么是顏色空間?
? ? 顏色空間是一個數學模型或系統,它定義了一套規則和方法,用來精確地描述、表示和組織顏色。?
? ? 可以把它想象成一個三維坐標系?(或者有時更多維)
? ? 每個維度代表一個構成顏色的基本分量
? ? 每個維度都有一個取值范圍(例如 RGB 通常是 0-255 或 0.0-1.0),這個范圍定義了該顏色空間所能表示的所有可能顏色的集合,稱為色域。
? ? 簡單來說:
? ? 顏色空間就像一本關于顏色的“字典”和“語法規則”。它提供了一套標準化的方法來:
? ? ①、?定義一個顏色(給它一個數值坐標)。
? ? ②、?組織所有可能的顏色(形成一個色域)。
? ? ③、?溝通顏色信息(在不同設備、軟件或人之間傳遞顏色數據)。
? ? 常見顏色空間:
? ? ?RGB? 顏色空間,維度:?紅色、綠色、藍色。任何顏色都可以看作是這三種光以不同強度混合的結果。
? ? CMYK? 顏色空間(用于印刷),維度:?青色、品紅色、黃色、黑色。數值代表的是油墨的濃度。
? ? ?HSV/HSL? 顏色空間,維度:?色調、飽和度、明度/亮度。這更接近人眼感知顏色的方式(什么顏色?有多鮮艷?有多亮?)。
? ? ?Lab/L*a*b?* 顏色空間,維度:?明度、紅綠軸、黃藍軸。它試圖模擬人眼感知顏色的均勻性,并且是設備無關的。
2、什么是線性空間(線性顏色空間)?
? ? 線性顏色空間?(Linear Color Space)是指顏色值與物理光強呈線性關系的色彩表示系統。
? ? 在這種空間中,數值的增減直接對應于光強的線性變化,沒有經過任何非線性變換(如伽馬校正)。
? ? 線性關系?:顏色通道(如RGB)的數值與實際光強成正比。
? ? 即:基于“顏色空間”的定義來看,坐標軸上均勻的數值變化,能夠正比映射到均勻的物理光強變化。
? ? 例如,RGB值 (0.5, 0.5, 0.5) 表示的光強是 (1.0, 1.0, 1.0) 的一半。
3、什么是伽馬空間(伽馬顏色空間)?
? ? 伽馬顏色空間(Gamma Color Space)是指顏色值經過非線性編碼(伽馬校正)?處理的色彩表示系統。
? ? 在這種空間中,顏色數值與實際顯示的光強之間呈非線性關系。
? ? 注意,廣義Gamma空間的概念?:泛指所有通過冪律函數(V_out = V_in ^ γ)進行非線性映射的色彩空間。無論是否 γ = 1/2.2
4、執行伽馬校正的原因(將線性空間轉到伽馬空間的原因)是什么?
? ? ①、匹配人眼感知?:對顏色值進行非線性變換,使數值分布更符合人眼對亮度的感知(暗部更敏感,亮部較遲鈍)。
?? ?②、高效數據利用?:自然場景中,大量的信息(像素數量)集中在較低亮度區域(暗部)。伽馬編碼通過壓縮亮部數據,可在8位/通道下保留更多視覺有效信息。
?? ?③、兼容顯示設備?:傳統CRT顯示器的陰極射線管(CRT)的輸入電壓與亮度輸出呈 ?γ≈2.5? 的冪律關系(即 亮度 ∝ 電壓 ^ 2.5)。為了抵消CRT的非線性,需對輸入信號預補償(即 電壓 ∝ 數值 ^ 1/2.2),最終使顯示亮度與原始數據線性對應。
5、為什么要叫 “伽馬” 空間/ “伽馬” 校正?
? ? 伽馬校正的核心是冪律變換?(Power Law)其公式為:V_out = V_in ^ γ
? ? 其中,γ(希臘字母Gamma)是冪律的指數,用于描述輸入與輸出的非線性關系。
6、【易混淆點】物理世界是什么顏色空間?
? ? 注意顏色空間的定義!它是一個人為定義的數學模型,物理世界不是模型,所有沒有顏色空間的概念。
? ? 因此,物理世界本身沒有顏色空間的概念。
? ? 但,光的疊加遵循線性規則,人類用線性顏色空間模擬其光的線性混合行為,因此光的物理行為等價于線性空間。
7、顏色在計算機中存儲時是什么顏色空間?
? ? 在計算機中存儲顏色時,最常用的顏色空間是 ?sRGB(Gamma空間)
? ? 為什么是sRGB??
? ? ①、歷史與普及性?:由微軟和惠普于1996年制定,成為互聯網、操作系統和消費級顯示器的默認標準。
? ? ②、?兼容性?:幾乎所有設備(顯示器、手機、相機)默認支持sRGB,確保顏色顯示一致。
? ? ③、存儲效率?:通過伽馬編碼(≈γ2.2)優化8位/通道的數據分布,保留更多暗部細節。
8、顏色在交給顯示器時是什么顏色空間?
? ? 當顏色數據最終交給顯示器顯示時,通常需要轉換為顯示器原生支持的色彩空間,而現代顯示器主要遵循 ?sRGB標準。
? ? 為什么是sRGB??
? ? ①、歷史兼容性?:CRT時代遺留的伽馬特性(γ≈2.2)與sRGB一致,現代LCD/OLED仍沿用此標準。
? ? ②、內容適配?:互聯網、操作系統、大部分內容(JPEG、視頻)默認以sRGB編碼。
? ? ③、硬件校準?:消費級顯示器出廠默認以sRGB為色彩目標(即使面板色域更廣)。
9、從物理世界的顏色到顯示器的整個過程是怎樣的?
? ? “物理世界的線性數值” 通常是在圖像捕獲(如相機)或渲染(如3D圖形)階段生成的線性數據。
? ? 然后,為了存儲或傳輸(如第7條所述),數據會經過伽馬編碼(γ=1/2.2)轉換為sRGB等伽馬空間(非線性)。
? ? 當你在計算機上查看一張JPEG圖片(sRGB編碼)時,數據以伽馬空間形式發送到顯示器。
? ? 顯示器內部的電子系統(或顯示驅動)再應用γ≈2.2的曲線,最終輸出線性光強。
? ? V_out = V_in ^ ?1/2.2 ^ 2.2 = V_in
? ? 最終顯示器輸出的光強完美還原了原始線性光強。
10、sRGB 是什么? sRGB 的 s 指什么?
? ? sRGB?(Standard Red Green Blue)是由 ?微軟(Microsoft)?? 和 ?惠普(Hewlett-Packard)?? 于1996年聯合制定的國際標準色彩空間?(IEC 61966-2-1),
? ? 旨在統一顯示設備、互聯網和操作系統的顏色表現。
? ? 其名稱中的 ??“s”?? 代表 ??“Standard”(標準)?,強調其作為通用默認色彩空間的定位。
11、sRGB 和 Gamma空間 的關系是什么?
? ? sRGB 是一種特定的?Gamma 編碼色彩空間(one of)。
? ? 其核心是通過 ?標準化的 Gamma 曲線(≈2.2)?? 將線性光強轉換為非線性存儲值,以適配人眼感知和顯示設備特性。
------------------------------------------------- NRatel割 -----------------------------------------------------
二、Unity 中的顏色空間
https://docs.unity3d.com/cn/current/Manual/class-PlayerSettingsAndroid.html#Renderinghttp://顏色空間選擇
https://docs.unity3d.com/2021.3/Documentation/Manual/class-TextureImporter.htmlhttp://Texture 導入選項(TextureImporter)(紋理的 Inspector 窗口)(重點關注 sRGB 選項)
https://docs.unity3d.com/2021.3/Documentation/Manual/LinearLighting.htmlhttp://顏色空間
https://docs.unity3d.com/2021.3/Documentation/Manual/LinearRendering-LinearOrGammaWorkflow.html??????http://線性或伽馬工作流程
https://docs.unity3d.com/2021.3/Documentation/Manual/LinearRendering-GammaTextures.htmlhttp://采用線性渲染的伽馬紋理
https://docs.unity3d.com/2021.3/Documentation/Manual/LinearRendering-LinearTextures.htmlhttp://使用線性紋理
1、基本
? ? 光照計算應該在線性空間中進行,以便確保數學上的正確性,但結果應該在伽馬空間中呈現以便讓人眼看起來正確。
? ? 紋理傾向于保存在伽馬顏色空間中,而著色器期望使用線性顏色空間。
2、在 Unity 的 PlayerSettings/OtherSettings/ColorSpace 中,可選顏色空間 Gamma / Linear
? ? 選擇 Gamma:
? ? ? ? 伽馬空間的著色器程序 在使用紋理時,不會從紋理中移除伽馬校正。
? ? ? ? 在紋理的 Inspector 窗口中取消勾選 sRGB,即可在 Gamma 模式下繞過 sRGB 采樣。
? ? 選擇 Linear:
? ? ? ? 應總是向 線性顏色空間的著色器程序 輸入 線性空間的紋理。
? ? ? ? 若紋理是在伽馬空間創建的,應在紋理的 Inspector 窗口中勾選 sRGB。
? ? ? ? 若紋理本身就是在線性空間創建的,則應在紋理的 Inspector 窗口中取消勾選 sRGB。
? ? ? ? 當完成著色工作后,GPU會在Shader寫入顏色緩沖區前自動進行伽馬校正或保持線性在后續進行伽馬校正。
如何選擇?
在Unity項目中選擇顏色空間(Color Space)時,主要取決于項目的視覺風格、目標平臺以及光照需求。
適合 Linear 空間的情況:
????????寫實風格項目?:需要物理準確的光照(如PBR材質、HDRP/URP)。
????????復雜光照效果?:動態光影、陰影、反射等。
????????目標平臺為中高端設備?(PC、主機、高端移動設備)。
????????使用HDR或后期處理?。
適合 Gamma 空間的情況:
?????????風格化或低多邊形(Low Poly)項目?:對物理光照無硬性需求。
????????目標為低端移動設備?(性能敏感,硬件不支持線性空間)。
????????2D項目或UI為主?:顏色混合需求簡單,無需物理光照。
特殊情況:
? ? ? ? 如抖音小游戲 開啟WEBGL2.0時,要求必須使用?Linear 空間。
3、若在Texture 導入選項(TextureImporter)上勾選 sRGB,意味著:
? ??此設置僅在項目使用線性顏色空間時相關。? ?
? ??指示紋理將數據存儲于 sRGB(也稱為伽馬)顏色空間中。
? ??如果啟用,它會指示 GPU 在著色器中對紋理進行采樣時將數據從 sRGB 顏色空間轉換為線性顏色空間。
? ? 對于存儲常規顏色數據的非 HDR 紋理啟用此功能。
? ? 對于包含非顏色數據(例如平滑度或金屬度)的紋理禁用此功能。
? ? 對于 HDR 紋理,Unity 默認禁用此值并隱藏復選框。
? ? 對于非 HDR 紋理,Unity 默認啟用此功能。
4、不同顏色空間下混合
? ? 伽馬空間下混合:在數學上是不正確的,并可能得出不符合期望的結果,但這種方法是在某些圖形硬件上進行混合的唯一方法。
? ? 線性空間下混合:在數學上是正確的,并提供精確的結果。
5、注意,更改顏色空間后,需重新烘焙光照貼圖
6、注意,舊版GUI系統(IMGUI)中的元素渲染始終在伽馬空間中完成
7、查找紋理(lookup Texture)、遮罩、Noarmal貼圖、Metalic貼圖 和 其他具有特定含義的在線性空間性下制作的紋理應取消勾選 sRGB。
三、游戲UI在線性空間下的混合 與 美術效果圖不一致的問題
原因:
sRGB編碼的半透明圖片,在Unity中,勾選sRGB,在進行混合前,著色器會在對紋理進行采樣時,會先將數據從 sRGB 顏色空間轉換為線性顏色空間。然后使用 混合公式 進行混合。
而絕大多數繪圖軟件 (Photoshop, Krita, Illustrator 等) 默認在 sRGB 色彩空間下工作、混合、顯示和保存圖片。
在這些軟件中,用半透明畫筆、圖層疊加模式 (如 "正常"、"正片疊底"、"疊加"、"濾色"、"疊加"、"柔光" 等) 繪制或疊加 UI 元素時,?混合操作是基于 sRGB 空間中存儲的值直接進行的。
簡單說,在繪圖軟件中,直接使用Gamma空間下的色值套用線性空間下才應該使用的 混合公式,產生了實際上錯誤的混合結果。
PS 圖層混合模式https://helpx.adobe.com/hk_zh/photoshop/using/blending-modes.html例如,圖層混合模式為 Normal 的混合公式為:
(該公式為線性空間下的混合公式,輸入應為線性色值)
color = A.rgb * A.alpha + B.rgb * (1 - A.alpha)
在 Unity 線性空間下,sRGB編碼的圖片,勾選了sRGB時,混合時將執行:
color = (A.rgb^2.2 * A.alpha + B.rgb^2.2 * (1 - A.alpha))
交給顯示器前,將會再對其執行一次伽馬校正,轉回 Gamma空間,即:
color1 = (A.rgb^2.2 * A.alpha + B.rgb^2.2 * (1 - A.alpha)) ^ (1/2.2)
而在 PS 伽馬空間下,sRGB編碼的圖片的色值,將直接帶入Normal混合公式:
color2 = A.rgb * A.alpha + B.rgb * (1 - A.alpha)
很明顯,color1 ≠ color2 (這者最終都是 伽馬空間下 的值)。
------------------------------------------------- NRatel割 -----------------------------------------------------
實例:
游戲中(color1)(Unity 線性空間下,sRGB圖片勾選sRGB)
?效果圖中(color2)(PS在伽馬空間下)
------------------------------------------------- NRatel割 -----------------------------------------------------
為使 游戲UI在線性空間下的混合 與 美術效果圖一致,解決的思路無非以下兩種(盲調除外):
方式1、保持游戲UI在線性空間下混合,并讓美術也在線性空間下混合。
? ? 修改 PS 中的設置(編輯> 顏色設定>高級選項):勾選 Blend RGB Colors Using Gamma
?參考 photoshop官方文檔的說明:
Photoshop 顏色設定https://helpx.adobe.com/hk_zh/photoshop/using/color-settings.htmlGamma空間下,但 γ=1.00,即相當于處于線性空間下。
中文版本的 ps 中,此處稱為 “用灰度系數混合RGB顏色”,以下為 PS CS6中文版中截圖。
為什么把 “Gamma(γ)” 要叫做 “灰度系數” 呢?
經查,主要由于 早期翻譯的局限性 和 行業習慣的固化。
20 世紀 80-90 年代,計算機圖形學剛引入中文語境時,術語翻譯尚未標準化。Gamma 作為專業概念,可能被簡單意譯為“灰度系數”,側重其 ?對明暗(灰度)的調節作用,而忽略了它對 ?所有顏色通道(RGB)?? 的普遍影響。
盡管 Gamma 實際影響所有顏色通道,但“灰度系數”一詞在顯示器校準、印刷等領域沿用至今,成為約定俗成的譯法
這種方式的優缺點:
? ? 優點:美術和程序都能得到數學上的正確結果。
? ? 缺點:美術可能會不適應這種感官(差異于之前長久的習慣)。
方式2、保持美術在伽馬空間下混合,并讓游戲UI也在伽馬空間下混合。
? ? (使 場景使用線性空間,而UI使用伽馬空間。)
一些修改方案:
? ? https://github.com/killop/URP-12-GammaUIAndSplitResolution
? ? https://github.com/TakeshiCho/UI_RenderPipelineInLinearSpace
這種方式的優缺點:
? ? 優點:美術保持原習慣。
? ? 缺點:修改渲染方式可能導致一些潛在問題,如性能變差。
------------------------------------------------- NRatel割 -----------------------------------------------------
個人傾向選擇方式1。原因是:
1、簡單,且讓程序和美術都面向一個正確結果。
2、2D 或 2D+3D 的游戲項目也可會在有線性空間下進行混合的需求。SpriteRenderer也是由美術在PS中像UI一樣出的圖。只讓UI在Gamma下混合不能滿足實際需要。