gamma校正 伽馬校正的GLSL實現

2021-10-11 08:42:17 字數 1532 閱讀 7258

本文是opengl 4.0 shading language cookbook的學習筆記。

在本文我們將介紹使用伽馬校正來提高渲染的影象質量。

許多關於opengl和3d圖形學的書會把伽馬校正忽略掉。光照和著色計算的結果沒有修改直接被輸出到螢幕上。這樣產生的影象可能並不是我們期望的。實際上,計算機顯示器(crt和現在的lcd顯示器)對於畫素亮度的反應是非線性的。比如,不使用伽馬校正的情況下,乙個0.5的灰度值並不是1.0的亮度的一半,它的亮度要比1.0的一半暗一些。

下圖中下方的曲線對應現在的計算機顯示器(伽馬值為2.2)。下圖中的x值對應亮度,y軸對應我們感知到的亮度。虛線代表亮度的線性關係。圖中上方的曲線表示對線性值使用伽馬校正後的結果。圖中下方的曲線是乙個標準的計算機顯示器的亮度表示關係。灰度值0.5在螢幕上實際只有0.218的亮度。

顯示器亮度的非線性關係通常可以使用乙個指數函式進行擬合。感知亮度(p)和畫素亮度(l)的指數成比例關係,這個指數被叫做伽馬。

對於顯示裝置,通常

的值在2.0到2.4之間。可以通過顯示器校準來精確確定這個值。

我們可以通過伽馬校正來修正這一問題。伽馬校正通過對畫素的亮度值進行指數運算來彌補顯示器對亮度值的非線性反應,來使顯示結果看上去是線性的。使用1/

作為指數可以完成這一工作。

進行渲染時,我們先忽略掉顯示器的亮度反應是非線性的這一問題,在結果寫入幀緩衝物件前,我們使用伽馬校正來糾正這一問題,從而提公升影象質量。

考慮下面的影象。左邊的影象渲染時不使用伽馬校正。右邊的影象使用了伽馬校正。

我們可以發現左邊的影象比右邊的影象暗些。影象中臉部從亮到暗的過渡部分的差別尤為明顯。右邊影象陰影處的變化看起來更明顯了,但亮處的明暗變換已經沒有之前那麼極端了。

伽馬校正可以很大程度提高光照著色的質量。

我們採取下面的步驟來對影象進行伽馬校正:

1. 新增uniform變數gamma,並設定它為顯示器對應的伽馬值。

2. 在片段著色器使用下面的**:

vec3
如果著色器使用的紋理資料已經經過伽馬校正,我們就不需要再次進行伽馬校正。

我們先不考慮顯示器對亮度的反應是否是線性的,將光照著色模型的計算結果儲存在變數color中。

著色計算後,我們在片段著色器,對於每乙個畫素進行伽馬校正,將校正結果賦值給fragcolor。為了避免除法操作,我們可以在opengl程式中計算1/

,然後它傳遞給片段著色器。

這裡,我們不對alpha成分進行伽馬校正。

使用伽馬校正需要注意使用的紋理資料是否已經經過伽馬校正,如果紋理資料已經進行過伽馬校正,我們就不需要再次進行伽馬校正。

gpu gems 3, edited by hubert nguyen (addison-wesley professional 2007),第24章詳細討論了有關伽馬校正的問題。

gamma校正 OpenCV Gamma校正

gamma校正是一種非常重要的線性變換。對輸入影象的灰度值進行指數變換,進而校正亮度偏差,通常應用於擴充套件暗調的細節。gamma校正可使得影象看起來更符合人眼的特性。當gamma校正的值大於1時,影象的高光部分被壓縮而暗調部分被擴充套件 當gamma校正的值小於1時,影象的高光部分被壓縮而暗調部分...

gamma校正 VASPKIT校正吸附分子自由能

寫在前面 在文章中用vaspkit做自由能校正,建議引用參考 v.wang,n.xu,vaspkit a pre and post processing program for the vasp code.昨天介紹了用vaspkit做氣體分子自由能校正的方法,其中有一點沒有說明白 忽略最小的5個 線...

Gamma校正及其OpenCV實現

一 什麼是gamma校正?gamma校正是對輸入影象灰度值進行的非線性操作,使輸出影象灰度值與輸入影象灰度值呈指數關係 這個指數即為gamma.經過gamma校正後的輸入和輸出影象灰度值關係如圖1所示 橫座標是輸入灰度值,縱座標是輸出灰度值,藍色曲線是gamma值小於1時的輸入輸出關係,紅色曲線是g...