零基礎學習OpenGL(十一) Gamma校正

2021-09-02 12:51:47 字數 1290 閱讀 6422

人眼對光的敏感度在不同亮度上是不一樣的,人眼會對暗的區域變化更加敏感。如果用8位空間來儲存畫素,0-1區間可以表示256種亮度,但是我們不會一半表示暗的,一半表示亮的(即暗和亮都是128種顏色)。因為我們應該花更多的空間去儲存暗的區域,換句話說,暗的需要被區分成更多種。

編碼:當攝影裝置儲存**時對畫素進行編碼,如果使用0.45的編碼伽馬對輸入的亮度進行編碼,那麼0.5畫素對應的亮度不是0.5,可能是0.22,因為 0.5 約等於 0.22的 0.45次方。  伽馬曲線:輸出 = 輸入的gamma次方。

解碼:放在顯示器裡顯示的時候,我們需要解碼,使得輸出的亮度和捕捉到的亮度一樣,是線性的。每種顯示裝置都有自己的gamma值。裝置輸出亮度 = 電壓的gamma次冪。gamma等於1是一種理想的線性狀態。過去,多數監視器是陰極射線管顯示器(crt)。這些監視器有乙個物理特性就是兩倍的輸入電壓產生的不是兩倍的亮度。產生約為輸入電壓的2.2次冪的亮度,這叫做監視器gamma。非常巧合,不需要任何調整,crt顯示器補償了影象捕捉裝置的伽馬曲線。

unity預設的空間是伽馬空間,伽馬空間下渲染會導致很多非線性空間下的計算,如果要把伽馬空間轉換到線性空間,就需要伽馬校正。如果直接輸出渲染而不進行任何處理,在經過顯示器的顯示伽馬處理後,會導致影象整體偏暗。gamma校正(gamma correction)的思路是在最終的顏色輸出上應用監視器gamma的倒數。回頭看前面的gamma曲線圖,你會有乙個短劃線,它是監視器gamma曲線的翻轉曲線。我們在顏色顯示到監視器的時候把每個顏色輸出都加上這個翻轉的gamma曲線,這樣應用了監視器gamma以後最終的顏色將會變為線性的。

有兩種在你的場景中應用gamma校正的方式:

一、使用opengl內建的srgb幀緩衝。 自己在畫素著色器中進行gamma校正。 第乙個選項也許是最簡單的方式,但是我們也會喪失一些控制權。開啟gl_framebuffer_srgb,可以告訴opengl每個後續的繪製命令裡,在顏色儲存到顏色緩衝之前先校正srgb顏色。srgb這個顏色空間大致對應於gamma2.2,它也是家用裝置的乙個標準。開啟gl_framebuffer_srgb以後,每次畫素著色器執行後續幀緩衝,opengl將自動執行gamma校正,包括預設幀緩衝。gamma校正將把線性顏色空間轉變為非線性空間,所以在最後一步進行gamma校正是極其重要的。

二、我們在每個相關畫素著色器執行的最後應用gamma校正,所以在傳送到幀緩衝前,顏色就被校正了。

fragcolor.rgb = pow(fragcolor.rgb, vec3(1.0/gamma));

參考自

零基礎學習OpenGL(五) 混合

opengl中,混合用來實現物體透明度。透明就是說乙個物體的顏色是物體本身的顏色和它背後其它物體的顏色的不同強度結合。乙個物體的透明度是通過它顏色的aplha值來決定的。想載入有alpha值的紋理時,要在紋理生成過程中告訴opengl,我們的紋理現在使用alpha通道了 glteximage2d g...

零基礎學習OpenGL(三) 深度測試

深度緩衝 在每個片段中儲存了資訊,以16 24 32位float的形式儲存它的深度值。片段著色器執行之後,在螢幕空間中執行。當深度測試啟用,opengl會將乙個片段的深度值和深度緩衝的內容相比,如果測試通過,深度緩衝將更新為新的深度值 如果測試失敗,片段丟棄。啟用深度測試 glenable gl d...

salesforce零基礎學習(九十一)Facet

說facet以前,我們先說一下瀏覽器載入解析以及渲染的過程。瀏覽器獲取乙個html的檔案時,會按照自上向下的順序進行解析,並在載入過程中進行渲染。對html解析成dom樹,對css 解析成css rule樹,然後通過dom數以及css rule樹構造rendering樹。接下來轉回facet,fac...