[自學記錄06|*百人計劃]Gamma矯正與線性工作流

一、前言

Gamma矯正其實也屬于我前面落下的一塊內容,打算把它補上,其它的沒補是因為我之前寫的GAMES101筆記里已經涵蓋了,而Gamma矯正在101里面確實沒提到,于是打算把它補上,這塊內容并不難,但是想通透的理解我覺的還是有難度的,尤其是關于Gamma矯正,它的原理其實很簡單,就是1-1=0,但是想要完全解釋的明白我覺得還是有一定困難,而且網上的絕大部分的資料講解的有一定誤導性,也可能是我理解的有問題,并不是說他們說錯了,而是他們講解的很容易讓人產生困惑和疑問以及誤區,包括我自己也是,所以結合我自己所理解的,打算把這塊跟大家說明白。(本篇不全是百人的內容)


二、線性空間與Gamma空間

相信大家都看過這張圖,我也就不賣關子了,上面那一條是人眼覺得均勻的變化的亮度(Gamma空間),下面那一條是實際上真實世界物理上的均勻變化的亮度(線性空間)。

簡單點說人眼感知的均勻物理上的均勻是不一樣的,人眼對暗部變化感受明顯,對亮部變化感受不明顯。我們把它們兩個均勻之間做一個映射就會得到這么一條曲線如下圖。


三、Gamma矯正

上圖就是Gamma矯正的過程,之間用一個傳遞函數來作為線性空間和Gamma空間之間的映射轉換,V_{out}=V{_{in}}^{^{1/gamma}}V_{out}=V{_{in}}^{^{gamma}}

你可能會問,我們要的不就是人眼看著均勻變化嗎?為什么不直接把第一張圖的結果拿出來顯示在屏幕上呢?

這里是一個思維誤區,雖然圖像顯示在屏幕上了,但是屏幕上的圖像還要經過你的眼睛然后變成視覺信號進入你的大腦皮層,你的眼睛自帶非線性映射功能,所以你才會覺得第一張圖“異常的亮”,因為它被“提亮”了兩次。也就是說雖然我們以我們的眼睛為標準,但是我們更希望看到的是線性空間,因為眼睛自帶轉換功能,也正是因為這樣,我們往往覺得白天的時候非常的亮,而較黑的地方很少。


四、為什么要進行Gamma矯正

我們現在常用的為sRGB顏色空間,也就是傳遞函數gamma=2.2的顏色空間。而常用的存儲格式RGBA32格式,每個通道只有8位存儲,也就是0~255這個范圍,這顯然不能表現出所有的線性空間的亮度值,于是我們打算為我們的眼睛著想,存儲Gamma空間也就是我們人眼認為均勻的值。我們前面說了人眼對暗部感受明顯,對亮部感受不明顯,所以我們打算犧牲亮部而多存儲暗部的值,這也就是我們前面提到的映射曲線的原理。

關于另一個早期CRT陰極顯像管顯示器的電壓和屏幕亮度承次冪關系的原因我并不想提,因為現在的顯示器已經沒有這個問題了,而且說完這個會有很多誤解和問題,混亂和迷惑,因為你很難將這個與前面的原因聯系起來,所以既然CRT顯示器已經被淘汰了,咱們也就不用管了,感興趣的朋友可以自己看看,這里就不具體說了。


五、線性工作流

線性工作流存在的意義就是確保我們在屏幕上看到的亮度永遠是正確的符合物理真實世界的。因此當涉及到渲染和光照計算,我們都會在線性空間完成,這樣才能確保計算結果正確。我舉兩個例子:

1.假設我弄了一張在Gamma空間下亮度為0.5的圖,那么當它在顯示器上顯示時,它的實際亮度應該是0.218,這個時候如果我想對它做亮度乘以2的這么一個操作,如果在Gamma空間下的話,它的亮度就變成了1,然后經過顯示器的矯正變為線性空間時它仍然是1,但是這是錯誤的,我們應該在線性空間下進行計算,也就是說在對這張圖進行亮度翻倍的操作時應該先把它映射到線性空間,這樣0.218*2=0.436,然后變換會Gamma空間,經顯示器再變換回線性空間,這樣得到的結果是0.436,才是正確的亮度。

2.再舉一個渲染器的例子,渲染器它是物理模擬渲染的,也就是說再渲染器里,光線是線性空間的,但如果我們的貼圖沒有經過處理,直接丟進渲染器進行計算,實際上貼圖是在Gamma空間中的,這顯然是錯誤的,我們應該先對貼圖處理把它映射到線性空間然后再丟進渲染器和光線運算,這樣得出的結果才是正確的。使用Shader時也是一樣。


六、Unity中的顏色空間?

當選擇Gamma Space時,Unity不會做任何處理。當選擇Linear Space時,引擎的渲染流程則會在線性空間計算?。

理想情況下項目使用線性空間的貼圖顏色,不需要勾選貼圖上的sRGB選項,如果在貼圖選項上勾選了sRGB的選項,Unity則會通過硬件特性在采樣時進行線性轉換。

?

主要由兩個硬件特性來支持

sRGB Frame Buffer

  • 將Shader的計算結果輸出到顯示器前做Gamma校正
  • 作為紋理被讀取時會自動把存儲的顏色從sRGB空間轉換到線性空間
  • 調用ReadPixels()、ReadBackImage()時,會直接返回sRGB空間下的顏色
  • sRGB Frame Buffer只支持每通道為8bit的格式,不支持浮點格式
  • HDR開啟后會先把渲染結果繪制到浮點格式的Frame Buffer中,最后繪制到sRGB Frame Buffer上輸出。

sRGB Sampler

  • 將sRGB的貼圖進行線性采樣的轉換。

使用硬件特性完成sRGB貼圖的線性采樣和shader計算結果的gamma校正,比起在shader里對貼圖采樣和計算結果的校正要快。


七、資源導出問題

1.Substace Painter

Substace Painter貼圖導出時是Gamma空間,顏色偏亮,所以導入到Unity時要把貼圖的sRGB選項勾選上,把它返回線性空間。

2.PhotoShop

如果使用線性空間,一般來說Photoshop可以什么都不改,導出的貼圖只要勾上sRGB就可以了。你也可以調整PhotoShop的伽瑪值為1,導出的貼圖在Unity中也不需要勾選sRGB了。

PhotoShop對顏色管理特別精確,Unity里看到的顏色要經過顯示器的伽瑪變換,而PhotoShop不會,PhotoShop會讀取顯示器的Color Profile,反向補償回去。

PhotoShop有第二個Color Profile,叫做Document Color Profile。通常它的默認值就是sRGB Color Profile,和顯示器的Color Profile一致,顏色是被這個Color Profile壓暗了,所以PhotoShop中看到的結果才和Unity中一樣。

線性空間中的半透明圖片制作

Photoshop的圖層和圖層之間做混合的時候,每個上層圖層都經過了伽馬變換,然后才做了混合,這個方式是設置中的默認值。你需要在設置中更改它,選擇“用灰度系數混合RGB顏色”,參數設置為1,這樣圖層直接就是直接混合的結果。(sRGB編碼是為了增加8位顏色的精度,如果你是用了32位浮點數的貼圖格式,PhotoShop自動使用的是線性空間,沒有做任何伽瑪變換的)


參考

2600_伽馬校正1_嗶哩嗶哩_bilibili

2600_伽馬矯正 (qq.com)

Gamma校正與線性工作流入門講解_嗶哩嗶哩_bilibili

對 Gamma 校正的個人理解 - 知乎 (zhihu.com)

Unite 2018 | 淺談伽瑪和線性顏色空間 - GameRes游資網?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/39527.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/39527.shtml
英文地址,請注明出處:http://en.pswp.cn/news/39527.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

我的創作紀念日(256天)

前言 結緣 我與csdn的結緣,之前在創作紀念日(128天)便已提到,今在此便不再多言 收獲 很慚愧,自六月底至八月中旬,因為忙于找工作,奔赴面試求職之際,寫博客沒有像之前那么勤&#x…

qt QPalette的原理與使用

QPalette類用于控制控件的風格,即任意一個地方的繪制方式。每個控件或者說qwidget對象內部都有一個QPalette對象。 在paintEvent(QPaintEvent *event)函數中,其實就是調用該控件的QPalette內容來進行繪制的了。 例如: QStyleOptionTab opt…

《論文閱讀12》RandLA-Net: Ef?cient Semantic Segmentation of Large-Scale Point Clouds

一、論文 研究領域:全監督3D語義分割(室內,室外RGB,kitti)論文:RandLA-Net: Ef?cient Semantic Segmentation of Large-Scale Point Clouds CVPR 2020 牛津大學、中山大學、國防科技大學 論文鏈接論文gi…

Kafka-eagle監控平臺

Kafka-Eagle簡介 在開發工作中,當業務不復雜時,可以使用Kafka命令來進行一些集群的管理工作。但如果業務變得復雜,例如:需要增加group、topic分區,此時,再使用命令行就感覺很不方便,此時&#x…

Vim學習(二)—— 編譯C程序

打開終端,這里以MobaXterm為例, 郵件創建新的空文件并命名, 然后cd到對應路徑下,用 vim hello.cvim打開創建的文件,進入編輯模式,編輯完程序后按Esc退出編輯模式,輸入 :wq保存并退出&#xf…

linux安裝wkhtmltopdf(清晰明了)

概述 在公司項目中使用到 wkhtmltopdf 轉換PDF,由于 wkhtmltox-0.12.5 版本 echarts 圖形虛線樣式,需要升級 wkhtmltox-0.12.6 版本來解決。 官網地址 wkhtmltopdf :https://wkhtmltopdf.org/ windows 安裝 下載流程及安裝流程 進入官…

C++ 關鍵字override,final的作用

文章目錄 一、為什么要引入這兩個關鍵字?1.虛函數復寫2. 類繼承 二、override三、final C11引入這兩個關鍵字 一、為什么要引入這兩個關鍵字? 1.虛函數復寫 不能阻止某個虛函數進一步重寫 本意寫一個新函數,錯誤重寫基類虛函數(子類中 virtual 關鍵字可省略) 本…

《系統架構設計師教程》重點章節思維導圖

內容來自《系統架構設計師教程》,篩選系統架構設計師考試中分值重點分布的章節,根據章節的內容整理出相關思維導圖。 重點章節 第2章:計算機系統知識第5章:軟件工程基礎知識第7章:系統架構設計基礎知識第8章&#xff1…

接口自動化框架httprunner 是如何生成動態類

HttpRunner 是一個用于接口自動化測試的工具,它使用了 Python 中的 type 函數來生成動態類。 在 HttpRunner 中,通過使用 type 函數和 GenericTestCaseMeta 元類,動態地生成測試用例類。 下面是一個示例代碼展示了如何使用 type 函數來生成…

Kotlin反射訪問androidx.collection.LruCache類私有變量

Kotlin反射訪問androidx.collection.LruCache類私有變量 androidx.collection.LruCache類中定義了一個名為map的LinkedHashMap,map存儲了所有LruCache的數據,有時候需要遍歷訪問該LinkedHashMap,取出里面的值,但是LruCache代碼實…

GPU Dissolve(GPU 消散)學習GPU Instancing

一:摘要 通過制作一個模型GPU消散效果來學習GPU Instancing 也就是實例化。 目標效果是楊超大佬文章《GPU shatter》里面的消散效果如圖: Tags:模型頂點分裂(Mesh Vertex Splitting), 實例化繪制(GPU Instancing Drawing)&#x…

開源可商業運營的ChatGpt網頁源碼v1.2.2

🤖 主要功能 后臺管理系統,可對用戶,Token,商品,卡密等進行管理 精心設計的 UI,響應式設計 極快的首屏加載速度(~100kb) 支持Midjourney繪畫和DALLE模型繪畫,GPT4等應用 海量的內置 prompt 列表,來自中文和英文 一鍵導…

【猿灰灰贈書活動 - 02期】- 【Java從入門到精通2023年7月最新(第7版)】

說明:博文為大家爭取福利,與清華大學出版社合作進行送書活動 圖書:《Java從入門到精通》 一、好書推薦 圖書介紹 Java入門經典,95萬Java程序員的入行選擇。配備升級版Java開發資源庫,在線大咖課在線答疑,學…

C語言 棱形圖案

目錄 一、問題分析 上部分: 下部分: 二、代碼演示 一、問題分析 如上圖所示,我們可以將棱形進行拆解,分為上下兩個部分。 上部分: 通過觀察,我們得到 單邊空格數 上半部分總行數 - 行數 - 1 …

Nginx詳解

1、高并發時代 單臺tomcat在理想情況下可支持的最大并發數量在200~500之間,如果大于這個數量可能會造成響應緩慢甚至宕機。 解決方案是通過多臺服務器分攤并發壓力,這不僅需要有多臺tomcat服務器,還需要一臺服務器專門用來分配請求。這既是…

Mysql - 配置Mysql主從復制-keepalived高可用-讀寫分離集群

目錄 高可用: 為什么需要高可用呢? 高可用的主要作用: keepalived是什么?它用在哪里? 什么是VRRP協議,它的作用是什么? 搭建一個基于keepalived的高可用Mysql主從復制讀寫分離集群 一、項…

MongoDB-yum安裝修改數據目錄后啟動失敗

# 問題 mongodb 進程權限默認會被 SELinux 管理,修改配置中默認 storage.dbPath 、systemLog.path 造成啟動失敗。 # 解決方案 ① 修改為默認路徑或重新安裝 /var/lib/mongo /var/log/mongodb/mongod.log② 臨時關閉 SELINUX 權限控制 setenforce 0③ 永久關閉 SE…

Vue Baidu Map--自定義點圖標bm-marker

自定義點圖標 將準備好的圖標放到項目中 使用import引入&#xff0c; 并在data中進行聲明 <script> import mapIconRed from ./vue-baidu-map/img/marker_red_sprite.png export default {data() {return {mapIconRed,}}, } </script>在<bm-marker>中加入參…

【Linux】進程的基本屬性|父子進程關系

個人主頁&#xff1a;&#x1f35d;在肯德基吃麻辣燙 我的gitee&#xff1a;Linux倉庫 個人專欄&#xff1a;Linux專欄 分享一句喜歡的話&#xff1a;熱烈的火焰&#xff0c;冰封在最沉默的火山深處 文章目錄 前言進程屬性1.進程PID和PPID2.fork函數創建子進程1&#xff09;為什…

C語言學習筆記---數據的存儲詳解

C語言程序設計筆記---015 C語言數據的存儲1、數據類型的意義1.1、unsigned與signed數據類型例程11.2、補碼與原碼相互轉換例程2 2、大小端的介紹2.1、大小端的例程12.2、大小端的例程2 --- 判斷當前編譯器環境屬于大端或小端 3、綜合練習題探究數據的存儲3.1、練習題13.2、練習…