ETH官方钱包

創(chuàng)作內(nèi)容

6 GP

【程式&繪圖】RGB≠螢?zāi)簧系牧炼龋簊RGB與linear RGB

作者:Shark│2017-11-03 22:04:14│巴幣:60│人氣:2508
這個(gè)話題跟畫圖和程式都有關(guān),因?yàn)镚IMP 2.9新增一個(gè)選項(xiàng)而想弄清楚這是什麼,結(jié)果發(fā)現(xiàn)了當(dāng)今螢?zāi)坏拿孛堋?br>
GIMP 2.9新增了sRGB和linear RGB的選項(xiàng),出現(xiàn)在圖片數(shù)值精度和圖層屬性兩個(gè)地方。


試一下它的作用,如果背景是黑色(RGB=0,0,0),疊上綠色(0,255,0)且alpha=0.5,按照alpha blend的公式G值應(yīng)該是127或128,但把圖層設(shè)成linear RGB的話結(jié)果是188,設(shè)成sRGB結(jié)果才是128。

為了解開這個(gè)謎,去找資料看這個(gè)設(shè)定做什麼用的?怎麼調(diào)?

參考資料:
 關(guān)於遊戲繪圖引擎
一篇Naughty Dog的投影片
CRYENGINE的說明文件
 關(guān)於繪圖軟體
在繪圖軟體裡測(cè)試模糊化和混色

可惜筆者手上沒有測(cè)量螢?zāi)涣炼鹊膬x器,不然可以做更精確的驗(yàn)證。



RGB是電腦儲(chǔ)存影像資料的標(biāo)準(zhǔn),記憶體裡儲(chǔ)存RGB數(shù)值,顯示影像時(shí)要把數(shù)值傳送給顯示設(shè)備,讓裡面的發(fā)光元件發(fā)光。
不過這裡藏了一個(gè)秘密:RGB值≠發(fā)光元件的亮度,即兩者不是線性關(guān)係,如果將R值設(shè)成0.5,螢?zāi)簧现挥?.21的亮度,把R設(shè)成0.74才能得到0.5的亮度。
(本篇把RGB的範(fàn)圍定為0.0~1.0,因?yàn)檫@樣公式比較容易推導(dǎo),且shader裡也是用0.0~1.0計(jì)算)

先定義0是發(fā)光元件能發(fā)出的最小亮度,1是最大亮度,用這個(gè)算式換算成實(shí)際亮度。
把RGB分量都套用算式。
Cs<=0.04045 → Cl = Cs/12.92
Cs>0.04045 → Cl = pow((Cs+0.055)/1.055, 2.4)

pow(a,b)是a的b次方,巴哈姆特不能打上標(biāo)故用這個(gè)代替。
轉(zhuǎn)換前的色彩空間稱為sRGB(standard RGB),轉(zhuǎn)換後稱為linear RGB,分別用Cs、Cl代表。
如果把同一個(gè)顏色用兩種色彩空間表示,linear RGB的數(shù)字會(huì)比sRGB小。
例:
RGB值 0 0.2 0.4 0.6 0.8 1
亮度 0 0.0331 0.1329 0.3185 0.6038 1

反向轉(zhuǎn)換如下
Cl<=0.0031308 → Cs = 12.92 * Cl
Cl>0.0031308 → Cs = 1.055 * pow(Cl,0.41666) - 0.055

查資料看到這樣做的原因有二,一是跟以前的CRT顯示器有關(guān),CRT電壓-發(fā)光強(qiáng)度的關(guān)係是接近Cs轉(zhuǎn)Cl的式子。後來的液晶顯示器就沒有這個(gè)物理特性了,不過為了相容以前的資料,仍然製造成發(fā)光強(qiáng)度遵循這個(gè)算式。
二是人眼對(duì)暗色的分辨力比較高,分量是8 bit精度時(shí)如果把亮度分成255等分,暗色部分精度有點(diǎn)不能滿足需求,所以讓0~255的數(shù)值不是等分,暗的部分比較密集。(上面CRYENGINE的文件裡有張灰階圖可參考)
16 bit以上的精度超過人眼的分辨力,就不一定要用非等分了。

至於繪圖軟體和遊戲裡顯示影像要怎麼做?繪圖軟體和相機(jī)都是設(shè)計(jì)成產(chǎn)生sRGB的圖,可以假設(shè)所有圖檔都是sRGB色彩空間,顯示器也設(shè)計(jì)成要給它sRGB的資料,如果只是原封不動(dòng)顯示圖那只要把RGB值丟給顯示器,不用轉(zhuǎn)換。

不過如果有用shader或blend做影像處理,像是用multiply或screen改變亮度、半透明的部分用alpha blend重疊、或3D計(jì)算打光,就要做轉(zhuǎn)換了,因?yàn)檫@些公式都是以linear RGB為前提。
也就是過程要如下,理論上才會(huì)正確。

原始sRGB資料 → 轉(zhuǎn)換成linear → 影像處理 → 轉(zhuǎn)換回sRGB → 顯示在螢?zāi)?br>
第三個(gè)參考資料有示範(fàn),在sRGB做模糊化會(huì)出現(xiàn)一條暗的區(qū)域,是因?yàn)闆]有做sRGB→linear→sRGB的轉(zhuǎn)換,交界處有RGB值=0.5的點(diǎn),但實(shí)際亮度是RGB各0.21。



實(shí)驗(yàn)1
在GIMP 2.9做兩個(gè)圖層

上層:純綠(0,255,0),圖層alpha設(shè)為50%
下層:純黑

然後調(diào)整上層的composite space,用拾色器取得重疊後的顏色,第一個(gè)是linear,第二個(gè)是perceptual。


驗(yàn)算一下linear的情況
第一步:sRGB轉(zhuǎn)成linear RGB
  黑色和純綠色各分量都是0和1,轉(zhuǎn)換後也是0或1
第二步:上層用alpha=0.5跟下層重疊,G值變成0.5
第三步:linear RGB轉(zhuǎn)成sRGB
  套Cl轉(zhuǎn)Cs的公式,G=0.7353...
  因?yàn)檐涹w是用0~255表示,乘以255得到187.516...,四捨五入就是188

實(shí)驗(yàn)2
測(cè)試D3D的sRGB格式,用自製遊戲引擎同樣做純黑和半透明綠兩個(gè)物件,半透明綠用貼圖而不用單色矩形物件,然後截圖並用繪圖軟體看RGB值。
將貼圖和framebuffer設(shè)成sRGB格式


似乎無效,想了一下發(fā)現(xiàn)原因是premultiply alpha,不是載入圖檔後立刻做,應(yīng)該先轉(zhuǎn)換成linear RGB再做premultiply alpha




了解了原理,也要考慮自己的畫圖工法,以及遊戲引擎演算法要不要修改了。

做遊戲的話,貼圖和framebuffer D3D、OpenGL可以自動(dòng)做sRGB、linear RGB轉(zhuǎn)換,只要建立時(shí)把格式設(shè)定成sRGB就行了。但我有些地方是把顏色放在uniform buffer裡傳給shader,要自己寫算式轉(zhuǎn)換,另外premultiply alpha也要修改。

畫圖的話,GIMP的說明書有寫圖片數(shù)值精度是8 bit的話必須用sRGB,否則圖裡暗的部分會(huì)異常,16 bit以上的精度才能用linear。圖層重疊的屬性則要設(shè)成linear計(jì)算才會(huì)正確。
如果只是自己一個(gè)人畫,那哪種色彩空間影響不大,因?yàn)榫褪且恢笨粗災(zāi)徊粩嗾{(diào)整,調(diào)到看起來滿意,但跟其他人合作時(shí)可能有問題。

有些事想?yún)⒖家幌聞e人是怎麼做的。

1.畫圖或做遊戲調(diào)整畫面的時(shí)候,是如何處理sRGB和linear的差異?

2.還有很多繪圖軟體沒考慮到sRGB≠真實(shí)亮度,模糊化、混色時(shí)沒轉(zhuǎn)換成linear就計(jì)算(我有在用的Inkscape就沒考慮到),這樣不同繪圖軟體交換資料會(huì)有問題,看別人的教學(xué)或?qū)懡虒W(xué)給別人看也不能重現(xiàn)步驟。
繪師或許也不知道這回事,跟繪師溝通可能也會(huì)有問題。
引用網(wǎng)址:http://www.jamesdambrosio.com/TrackBack.php?sn=3777257
All rights reserved. 版權(quán)所有,保留一切權(quán)利

相關(guān)創(chuàng)作

同標(biāo)籤作品搜尋:繪圖軟體|影像處理|演算法|繪圖心得

留言共 0 篇留言

我要留言提醒:您尚未登入,請(qǐng)先登入再留言

6喜歡★shark0r 可決定是否刪除您的留言,請(qǐng)勿發(fā)表違反站規(guī)文字。

前一篇:無接縫tilemap練習(xí)... 後一篇:21週年站聚遊記...


face基於日前微軟官方表示 Internet Explorer 不再支援新的網(wǎng)路標(biāo)準(zhǔn),可能無法使用新的應(yīng)用程式來呈現(xiàn)網(wǎng)站內(nèi)容,在瀏覽器支援度及網(wǎng)站安全性的雙重考量下,為了讓巴友們有更好的使用體驗(yàn),巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現(xiàn)和功能。
屆時(shí)建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業(yè)系統(tǒng)版本才可使用)

face我們了解您不想看到廣告的心情? 若您願(yuàn)意支持巴哈姆特永續(xù)經(jīng)營(yíng),請(qǐng)將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學(xué)】