OpenGL中失真與采樣(oversampling桶现、supersampling、multisampling)

Note

這是對MIT Foundation of 3D Computer Graphics第16章的翻譯鼎姊,本章講解了圖像的兩種概念表達(dá)以及各種失真產(chǎn)生的原因骡和、場合及基于采樣的解決方案,涵蓋了過采樣相寇、超級采樣以及多采樣的實(shí)現(xiàn)原理慰于。同時也包含alpha混合的基本概念及應(yīng)用。本書內(nèi)容仍在不斷的學(xué)習(xí)中唤衫,因此本文內(nèi)容會不斷的改進(jìn)婆赠。若有任何建議,請不吝賜教ninetymiles@icloud.com佳励。

注:文章中相關(guān)內(nèi)容歸原作者所有休里,翻譯內(nèi)容僅供學(xué)習(xí)參考。
另:Github項目CGLearning中擁有相關(guān)翻譯的完整資料赃承、內(nèi)容整理妙黍、課程項目實(shí)現(xiàn)。


已經(jīng)完成的章節(jié)


采樣(Sampling)

現(xiàn)在是時候讓我們更多聚焦在我們對待圖形的方式上瞧剖。目前為止拭嫁,存在兩種我們已經(jīng)隱含使用的圖像概念,具體(也稱作抓于,數(shù)碼)圖像和連續(xù)圖像做粤。在后面的章節(jié)中,我們會更靠近地調(diào)查這種對立性毡咏,同時討論在具體和連續(xù)模型之間來回切換的合適方式。

本章中逮刨,我們會聚焦在多種計算機(jī)圖形中生成電子圖像時可能出現(xiàn)的視覺失真呕缭。這些失真包括在三角形邊緣令人煩惱的鋸齒形失真堵泽,并且可經(jīng)由其名稱:鋸齒狀失真(aliasing artifacts)來判斷。在某種意義上恢总,鋸齒狀失真可能發(fā)生在大量視覺復(fù)雜性填充在一個單一像素中時迎罗。在這種情形中,當(dāng)我們嘗試通過觀察圖像中一個單一點(diǎn)地址來決定像素的色彩值時片仿,我們可能得到一個不是最優(yōu)的結(jié)果纹安。就如我們會看到的,這些失真可以通過將像素正方形區(qū)域多個采樣地址的色彩平均在一起來減輕砂豌。這種處理被稱作抗鋸齒厢岂。

16.1 兩種模型(Two Models)

連續(xù)圖像,I(x_w,y_w)阳距,為雙變量函數(shù)塔粒。正如在小節(jié)12.3中所討論的,函數(shù)的域筐摘,\Omega = [-.5..W-.5] \times [-.5..H-.5]卒茬,為實(shí)數(shù)值化的2D窗口坐標(biāo)[x_w,y_w]^t。(在本章剩下的內(nèi)容和下一章中咖熟,除非有需要圃酵,否則我們?nèi)サ?_w"下標(biāo)。)函數(shù)的范圍是一個色彩空間馍管,我們使用一種RGB(線性)色彩空間郭赐。

具體圖像I[i][j]是色彩值的兩維數(shù)組。每個這樣的數(shù)組條目被稱為一個像素咽斧。數(shù)組的尺寸為寬W乘以高H堪置,因而i是一個整數(shù),區(qū)間為[0..W-1]张惹,j也是一個整數(shù)舀锨,區(qū)間為[0..H-1]。我們?yōu)槊繉B續(xù)圖像坐標(biāo)x_w=iy_w=j關(guān)聯(lián)一對整數(shù)i,j宛逗,也就是說坎匿,碰巧為整數(shù)值的實(shí)數(shù)坐標(biāo)。每個色彩值為色彩空間中表達(dá)一個色彩的標(biāo)量三元組雷激。再次替蔬,我們借助一個RGB(線性)色彩空間。最終屎暇,每個R承桥,G,B坐標(biāo)被表達(dá)為某種數(shù)值格式根悼。

在OpenGL中凶异,我們借助3D中被著色的三角形描述一個場景蜀撑。根據(jù)投射,這些映射到連續(xù)2D圖像域中被上色的三角形剩彬,因此就定義了一個連續(xù)圖像酷麦。最終我們希望把這個圖像顯示到一臺監(jiān)視器上,或者把它保存到一個圖像文件中喉恋。如此沃饶,我們需要知道如何把連續(xù)圖像轉(zhuǎn)換為具體圖像。

16.2 問題(The Problem)

從連續(xù)圖像到具體圖像轉(zhuǎn)換的最簡單和最直觀的方式為借助點(diǎn)采樣轻黑,也就是說糊肤,要獲得像素i,j的值,我們采樣位于整數(shù)值化的域地址處的連續(xù)圖像函數(shù):
\large{ I[i][j] \leftarrow I(i, j) }

可以證實(shí)存在很多點(diǎn)采樣導(dǎo)致的不想看到的失真情形苔悦。例如轩褐,考慮一個由黑和白三角形組成的場景。當(dāng)點(diǎn)采樣圖像時玖详,在接近黑白三角形邊緣的地方把介,圖像會顯示出某種階梯狀的圖案;這種失真被稱為“鋸齒”蟋座。(參考圖示\text{Figure 16.6})拗踢。在動畫過程中,某些像素值會突然從黑變到白向臀,同時鋸齒狀的邊緣圖案會顯示為爬行的樣子巢墅。這被稱作“爬行的鋸齒(the crawling jaggies)”。

當(dāng)處理非常小的三角形時券膀,我們還會得到另外的糟糕失真情形君纫。假如我們正在渲染一張由一群斑馬組成的圖片(或者是一張正在遠(yuǎn)離觀察者的棋盤上的小的黑白正方形)。假設(shè)一只斑馬在背景中遠(yuǎn)離芹彬,很遠(yuǎn)以至于其只覆蓋一個單一像素蓄髓。那個像素的色彩會是什么?如果這種點(diǎn)采樣碰巧落在一個黑色三角形上舒帮,那么像素會是黑的会喝,如果碰巧落在一個白色三角形上,那么像素會是白的玩郊。(參考圖示\text{Figure 16.1}肢执。)如果我們運(yùn)氣不好,最終的像素色彩會組成某種令人煩惱的“云紋(moire)”圖案译红,就如圖示\text{16.6}中所示预茄。在動畫過程中,如果斑馬移動侦厚,這些像素將會呈現(xiàn)黑白變換的模式耻陕。這種失真被稱為“閃爍(flickering)”昵慌。假如一個細(xì)節(jié)高度清晰的紋理被應(yīng)用在某個屏幕上的小區(qū)域,那么在紋理映射中也會出現(xiàn)這種失真淮蜈。(參考圖示\text{Figure 18.3})。

Figure16.1.png

Figure 16.1: 當(dāng)連續(xù)圖像擁有大量高分辨率細(xì)節(jié)(比如一只斑馬)已卷,并且單一樣本(淺藍(lán)色)被用于決定這個像素值時梧田,我們得到一個無用的值。??Stuart c Maxwell侧蘸。

當(dāng)在一個小區(qū)域連續(xù)圖像有很多細(xì)節(jié)裁眯,那么這些類型的錯誤就會出現(xiàn)。在斑馬例子中讳癌,連續(xù)圖像在幾個像素的空間中就包含了整群斑馬(的細(xì)節(jié))穿稳。對于鋸齒三角形例子,連續(xù)圖像具有可以立即過渡的精確鋒利的邊緣晌坤,而不是漸變的邊緣逢艘。出于技術(shù)原因,這些種類的問題被統(tǒng)稱為鋸齒(aliasing)骤菠。

16.3 解決方案(The Solution)

當(dāng)在小區(qū)域存在大量細(xì)節(jié)它改,我們能夠在具體(圖像)表達(dá)中維護(hù)所有信息是不可能的。但是僅通過采納單一樣本來決定我們正在生成的像素的色彩會讓事情變得更糟商乎,很可能只是拿到了一個沒有意義的值央拖。有意義的行為是我們最好借助在某種合適的區(qū)域中的平均值設(shè)置這個像素的值。在斑馬例子中鹉戚,可能我們最好只是設(shè)置這個像素為灰色鲜戒。

存在很多方法以數(shù)學(xué)方式建模這種問題并尋求最優(yōu)解。例如抹凳,采用“傅立葉分析”遏餐,你可以觀察哪些“頻率”使用一定數(shù)目的像素能夠表達(dá),以及處理不可表達(dá)頻率的最好方式却桶。針對這樣的討論境输,參考課后書目[6]。從一個最優(yōu)化的觀點(diǎn)颖系,你可以嘗試最小化原始連續(xù)圖像和最終在屏幕上顯示的光圖像之間的差異嗅剖。(在屏幕上,每個像素被繪制在有限范圍內(nèi)嘁扼,因此我們可以將光圖像當(dāng)作屏幕上的合成連續(xù)圖像信粮。)

從這些多種觀點(diǎn),對這些觀點(diǎn)我們這里不追求細(xì)節(jié)趁啸,證實(shí)了最好借助下面這種形式的表達(dá)來設(shè)置像素值:
\large{ I[i][j] \leftarrow \iint_\Omega dx\,dy\,I(x,y)F_{i,j}(x,y) \tag{16.1} }
此處F_{i,j}(x,y)為某種函數(shù)强缘,其告知我們[x,y]^t的圖像值應(yīng)該多么強(qiáng)烈影響i,j處的像素值督惰。在這種設(shè)置中,函數(shù)F_{i,j}(x,y)被稱作過濾器(filter)旅掂。

換句話說赏胚,最佳像素值通過在臨近的像素地址執(zhí)行某種連續(xù)加權(quán)平均。實(shí)際上商虐,這就像在點(diǎn)采樣前模糊連續(xù)圖像以獲得具體圖像觉阅。使用方程(16.1)生成一個具體圖像的方式被稱為抗鋸齒(anti-aliasing)。

F_{i,j}的最優(yōu)選擇被證實(shí)依賴于建模這個問題的實(shí)際數(shù)學(xué)方式秘车。理論上典勇,這種最優(yōu)F_{i,j}可能具備廣泛的支持,并且甚至呈現(xiàn)負(fù)值叮趴。實(shí)際上割笙,我們不要求完全的優(yōu)化,并且我們經(jīng)常選擇過濾器F_{i,j}(x,y)為某種容易計算的形式眯亦。最簡單的這種選擇為盒式過濾器(box filter)伤溉,此處F_{i,j}除了中心位于x=i,y=j1\times1正方形區(qū)域外其余處處為0。這種正方形被稱作\Omega_{i,j}妻率,我們得到
\large{ I[i][j] \leftarrow \iint_\Omega dx\,dy\,I(x,y) \tag{16.2} }

在這種情形中谈火,想要的像素值只是像素正方形區(qū)域上的連續(xù)圖像的平均。(參考圖示\text{Figure 16.2}舌涨。)

Figure16.2.png

Figure 16.2: 如果我們使用像素正方形域中的積分來代替點(diǎn)采樣糯耍,我們會獲得一個更好的結(jié)果。??Stuart c Maxwell囊嘉。

在計算機(jī)圖形中温技,甚至方程式(16.2)中的積分也難于確切計算。相反扭粱,它可以通過下列形式的某種和被近似出來:
\large{ I[i][j] \leftarrow \sum_{k=1}^nI(x_k,y_k) \tag{16.3} }
此處k索引了某種地址集合(x_k,y_k),被稱作樣本地址舵鳞。我們稱這種為過采樣(oversampling)。(參考圖示\text{Figure 16.3}琢蛤。)

Figure16.3.png

Figure 16.3: 我們可以使用一些具體樣本集合來近似實(shí)際的積分(這個例子中為6個樣本)蜓堕。??Stuart c Maxwell。

要完成過采樣博其,渲染器首先生成一個“高分辨率”色彩和z緩存“圖像”套才,此處我們會使用術(shù)語樣本表示每個這種高分辨率像素。隨后慕淡,一旦光柵化完成背伴,這些樣本的分組被聚在一起平均,借助方程(16.3),生成最終的傻寂,低分辨率圖像息尺。

如果針對高分辨率圖像的樣本地址組成了一個規(guī)則的,高分辨率的網(wǎng)格疾掰,那么這被稱作超級采樣(super sampling)搂誉。參考圖示\text{Figure 16.6}(底部),可以看到一個使用了非常高的過采樣率的超級采樣的效果静檬。

針對高分辨率“圖像”勒葱,我們也能夠選擇其它采樣模式,就像在\text{Figure 16.3}中所形象展示的巴柿。當(dāng)使用方程(16.3)近似方程(16.2)時,這種較不規(guī)則的圖像有助于避免系統(tǒng)錯誤死遭。關(guān)于這種不規(guī)則圖案的一些益處的更詳細(xì)討論广恢,參考課后書目[12,49]。.

在OpenGL中呀潭,采樣圖案的細(xì)節(jié)是硬件依賴的钉迷。它們能夠被API調(diào)用所改變,或者更容易地钠署,通過在一個交互式控制面板中更改硬件驅(qū)動的設(shè)置糠聪。

在OpenGL中,我們也可以選擇進(jìn)行多采樣(multisampling)谐鼎。在這種情形舰蟆,就如過采樣中,OpenGL繪制到一個“高分辨率”的色彩和z-緩存狸棍。在每個三角形的光柵化過程中身害,“覆蓋率(coverage)”和z-值(z-values)在這個樣本級別被計算。但是為了效率草戈,碎片著色器根據(jù)最終的解析像素僅僅被調(diào)用一次塌鸯。在一個單一的(最終解析)像素中,這個色彩在被三角形命中的所有樣本之間共享唐片。正如上面丙猬,一旦光柵化完成,這些高分辨率的分組被放在一起平均费韭,借助方程(16.3)來生成最終的低分辨率圖像茧球。多采樣可以作為一種有效的抗鋸齒方法,因為星持,不使用紋理映射時袜腥,色彩在每個三角形上的變化趨勢相當(dāng)緩慢,因而它們不需要在高空間分辨率上被計算。參考圖示\text{Figure 16.6}(中部)觀看在不使用紋理映射渲染一個場景時使用多采樣的效果羹令。

要處理在紋理映射期間出現(xiàn)的鋸齒失真鲤屡,我們擁有在渲染處理外圍隨時支配紋理圖像的便利。這導(dǎo)致了在小節(jié)18.3中所描述的漸進(jìn)式紋理映射(mip mapping)這類專有的技術(shù)福侈。我們推遲紋理抗鋸齒和漸進(jìn)式紋理映射的討論酒来,直到我們已經(jīng)在第17章中講解了圖像重建(reconstruction)的主題。

16.3.1 題外話(In the Wild)

數(shù)碼相機(jī)中肪凛,抗鋸齒通過在每個像素傳感器范圍上出現(xiàn)的空間整合來完成堰汉,同時也借助由鏡頭所產(chǎn)生的光學(xué)模糊。一些相機(jī)還包含專門的額外光學(xué)元件用于在傳感器采樣前模糊連續(xù)圖像伟墙∏萄迹抗鋸齒在一些包含某種規(guī)則圖案場景的數(shù)碼圖像中有時可以被看到,比如哪些穿著花呢夾克的圖像戳葵。

在人類視覺中就乓,抗鋸齒效果通常不會被遭遇到。大多數(shù)抗鋸齒拱烁,至少在人眼視覺的中央凹區(qū)域(foveal central region)生蚁,是由于應(yīng)用到光上的光學(xué)模糊,這會很好地發(fā)生在光線照射到感知細(xì)胞之前戏自,參考課后書目[78]邦投。視網(wǎng)膜上感知細(xì)胞的不規(guī)則空間布局也有助于高效提供空間位置的(隨機(jī)性地)劇烈變化,而這會將明顯可注意到的鋸齒變?yōu)椴伙@眼的噪點(diǎn)擅笔。

16.3.2 抗鋸齒線條(Antialiased Lines)

理想情況下志衣,線條是一維的,并且對于繪制一條正確過濾的線條意味著什么的概念是一個更復(fù)雜的問題猛们。平滑線條繪制在OpenGL中是可用的蠢涝,但是這超越了我們的范圍。有興趣的讀者可以參考課后書目[48]并且從那里進(jìn)行查閱阅懦。

16.4 Alpha

假設(shè)我們有兩個具體圖像和二,一個前景圖,I^f耳胎,和一個后景圖惯吕,I^b,我們想要合并它們?yōu)橐粋€圖像I^c怕午。比如废登,我們可能想要疊加一個天氣預(yù)報員的前景圖片在天氣地圖的后景圖像之上。最直觀的方案是從其圖像中摳出天氣預(yù)報員像素郁惜。在合成圖像中堡距,我們只要用提取的預(yù)報員像素替換哪些對應(yīng)的天氣地圖像素即可配深。

不幸地是员寇,這會為我們在天氣預(yù)報員/地圖過渡區(qū)域中呈現(xiàn)一種鋸齒狀的邊緣(參考圖示\text{Figure 16.4}顾彰,左側(cè))塘偎。在一個真實(shí)的相片或者借用方程(16.2)渲染的圖像中,在預(yù)報員/地圖邊緣的像素色彩會借用某種預(yù)報員和地圖色彩的平均易稠。問題是在我們的具體圖層中缸废,我們針對每個像素僅僅保存了一個色彩值,并且這是不如此(在一個像素?fù)碛卸鄠€色彩值)就不能計算出正確的合成像素色彩驶社。

Figure16.4.png

Figure 16.4: 一個圓球的圖像在一個紋理背景上被合成企量。仔細(xì)觀察這個圓球的邊緣。在左側(cè)亡电,進(jìn)行整體合成(或者說沒有合成)届巩。在右側(cè),alpha值被用于混合份乒。??Hamilton c Chong恕汇。

對于這個問題,一個合理的方案可以借助一個稱為alpha混合的技術(shù)來獲得冒嫡。基礎(chǔ)思路是在每個圖層中為每個像素關(guān)聯(lián)一個值四苇,\alpha[i][j]孝凌,其描述了那個像素上圖層整體的不透明度和覆蓋率。一個值為1的alpha值表達(dá)了一個完全不透明/被占據(jù)的像素月腋,而一個為0的值表達(dá)了完全透明/未被占據(jù)的像素蟀架。一個小數(shù)值表示了部分透明的(部分占據(jù)的)像素。例如榆骚,在天氣預(yù)報員圖像中片拍,我們會預(yù)期每個完全被預(yù)報員所覆蓋的像素?fù)碛兄禐?的alpha值,同時那些位于其輪廓上的像素會擁有小數(shù)值妓肢,因為那些像素僅被預(yù)報員部分占據(jù)捌省。

然后,要合成兩個圖層碉钠,在每個像素上纲缓,我們借用這些alpha值來決定怎樣去合成前景色和背景色。

更明確地喊废,讓I(x,y)為一個連續(xù)圖像祝高,同時讓C(x,y)為連續(xù)(x,y)域上的一個二進(jìn)制值化的覆蓋函數(shù),在任何點(diǎn)上其值為1代表在這個地方圖像被”占據(jù)“污筷,而0代表沒被占據(jù)工闺。讓我們在我們的具體圖像上存儲這個值為
\large{ \begin{array}{rcl} I[i][j] & \leftarrow & \iint_{\Omega_{i,j}}dx\,dy\,I(x,y)\,C(x,y) \\ \alpha[i][j] & \leftarrow & \iint_{\Omega_{i,j}}dx\,dy\,C(x,y)\end{array} }
在這種格式中的色彩經(jīng)常被稱作預(yù)乘(pre-multiplied)版本(查看下面小節(jié)16.4.2中的非預(yù)乘版本)。

給定這些值,當(dāng)我們想要在I^b[i][j]之上合成I^f[i][j]陆蟆,我們借助下面的公式計算合成的圖像色彩雷厂,I^c[i][j]
\large{ I^c[i][j] \leftarrow I^f[i][j] + I^b[i][j](1-\alpha^f[i][j]) \tag{16.4} }
也就是說,在一個像素上被觀察到的背景色的數(shù)量成比例于那個像素前景圖層的透明度遍搞。

同樣地罗侯,對于復(fù)合圖像的alpha值可以被計算為
\large{ \alpha^c[i][j] \leftarrow \alpha^f[i][j] + \alpha^b[i][j](1-\alpha^f[i][j]) \tag{16.5} }

經(jīng)常,背景圖層在所有像素上是完全不透明的溪猿,在這種情形中钩杰,合成圖像也是如此。但是這個公式足夠通用可以建模兩個局部不透明的圖像诊县,這種情形可以生成一個擁有小數(shù)alpha值的合成圖像讲弄;當(dāng)處理兩個以上的圖層時,這個可以用作一個中間結(jié)果依痊。

圖示\text{Figure 16.4}展示了在一個紋理背景圖像上合成一個球體的前景圖像避除。前景圖像中,圓球(右側(cè))邊緣的像素具有小數(shù)alpha值胸嘁。最終的合成圖像中瓶摆,球體邊緣展示了前景色彩和背景色彩的混合。

方程(16.4)和方程(16.5)的操作被稱作具體二進(jìn)制over操作性宏。你可以輕松驗證over操作是可組合的但不是可交換的群井。也就是,
\large{ I_a\,over\,(I_b\,over\,I_c ) = (I_a\,over\,I_b )\,over\,I_c }
但是
\large{ I_a\,over\,I_b \neq I_b\,over\,I_a }

16.4.1 對比連續(xù)合成(Comparison to Continuous Composition)(選學(xué))

Alpha混合基于將像素看作半透明物體的概念毫胜。讓我們看一下具體alpha混合的結(jié)果如何與一個正確抗鋸齒书斜,并連續(xù)合成的圖像進(jìn)行比較。

C^f為前景連續(xù)圖像I^f的二(進(jìn)制)值化的覆蓋函數(shù)(binary valued coverage function)酵使。同時讓C^b為背景連續(xù)圖像I^b的二(進(jìn)制)值化的覆蓋函數(shù)荐吉。(從通用性角度,在某些時刻我們允許背景圖像為未占據(jù)的)口渔。我們假設(shè)样屠,在任意點(diǎn)(x,y),如果C^f(x,y)為1缺脉,我們觀察前景色彩瞧哟,并且如果C^f(x,y)為0,我們觀察背景色彩枪向。那么勤揩,在像素i,j處盒式過濾的(box-filtered)抗鋸齒具體圖像應(yīng)該為
\large{ \begin{array}{rcl} I^c[i][j] & \leftarrow & \iint_{\Omega_{i,j}}dx\,dy\,(I^f(x,y)\,C^f(x,y) + I^b(x,y)\,C^b(x,y) \\ & & - I^f(x,y)\,C^f(x,y)\,C^f(x,y)) \\ & = & \iint_{\Omega_{i,j}}dx\,dy\,I^f(x,y)\,C^f(x,y) + \iint_{\Omega_{i,j}}dx\,dy\,I^b(x,y)\,C^b(x,y) \\ & & - \iint_{\Omega_{i,j}}dx\,dy\,I^b(x,y)\,C^b(x,y)\,C^f(x,y) \end{array} }
讓我們把這個公式和alpha混合的結(jié)果比較
\large{ \begin{array}{rcl} I^c[i][j] & \leftarrow & I^f[i][j] + I^b[i][j](1-\alpha^f[i][j]) \\ & = & \iint_{\Omega_{i,j}}dx\,dy\,I^f(x,y)\,C^f(x,y) \\ & & + (\iint_{\Omega_{i,j}}dx\,dy\,I^b(x,y)\,C^b(x,y))(1 - \iint_{\Omega_{i,j}}dx\,dy\,C^f(x,y) \\ & = & \iint_{\Omega_{i,j}}dx\,dy\,I^f(x,y)\,C^f(x,y) + \iint_{\Omega_{i,j}}dx\,dy\,I^b(x,y)\,C^b(x,y) \\ & & - \iint_{\Omega_{i,j}}dx\,dy\,I^b(x,y)\,C^b(x,y).\iint_{\Omega_{i,j}}dx\,dy\,C^f(x,y) \end{array} }

兩種結(jié)果的差異為
\large{ \iint_{\Omega_{i,j}}dx\,dy\,I^b(x,y)\,C^b(x,y) - \iint_{\Omega_{i,j}}dx\,dy\,I^b(x,y)\,C^b(x,y).\iint_{\Omega_{i,j}}dx\,dy\,C^f(x,y) }
這種誤差就是一個乘積的積分和一個積分的乘積之間的差異。如此秘蛔,我們將這種誤差當(dāng)作表達(dá)了兩個方面的“相互關(guān)聯(lián)關(guān)系”的數(shù)量陨亡,其中一方面為在某個像素上前景覆蓋率的分布傍衡,以及另一方面為在那個像素內(nèi)的背景數(shù)據(jù)的分布。如果我們假設(shè)前景覆蓋率是均勻的并且隨機(jī)的负蠕,那么我們可以安全地忽略這種誤差蛙埂。

16.4.2 非預(yù)乘版本(Non Premultiplied)

在alpha的某些用法中,代替存儲I\alpha遮糖,我們和\alpha一起存儲I'=I/\alpha绣的。這被稱作"非預(yù)乘"版本。這提升了數(shù)據(jù)精度欲账;當(dāng)一個像素?fù)碛行〉母采w率(coverage)數(shù)值屡江,那么I會是一個小的數(shù)字并且在固定點(diǎn)表示中只會利用幾個低位數(shù)位。在非預(yù)乘格式中赛不,你能夠在存儲文件格式中使用所有的數(shù)位惩嘉,從而獨(dú)立于覆蓋率描述色彩。在非預(yù)乘格式中踢故,over操作變得更加復(fù)雜:
\large{ \begin{array}{rcl} \alpha^c[i][j] & \leftarrow & \alpha^f[i][j]+\alpha^b[i][j](1-\alpha^f[i][j]) \\ I^{'c}[i][j] & \leftarrow & \frac{1}{\alpha^c[i][j]}(\alpha^f[i][j]I^{'f}[i][j] +(\alpha^b[i][j]I^{'b}[i][j])(1-\alpha^f[i][j])) \end{array} }

雖然在背景中當(dāng)所有像素都讓其alpha值為1文黎,這會變?yōu)?br> \large{ \begin{array}{rcl} \alpha^c[i][j] & \leftarrow & 1 \\ I^{'c}[i][j] & \leftarrow & \alpha^f[i][j]I^{'f}[i][j] +I^{'b}[i][j](1-\alpha^f[i][j]) \end{array} }
這是一種你有時候會碰到的表達(dá)。

預(yù)乘格式的一個有利方面是如果我們想要在每個方向使用一個值為2的因子縮小圖像殿较,(這種情形會被需要耸峭,比如,對于漸進(jìn)式映射淋纲,在后面小節(jié)18.3中被描述)劳闹,我們只要將4個合適的I^f值在一起平均。然而在非預(yù)乘格式帚戳,這種計算會變得丑陋玷或。

16.4.3 抽取時模糊(Pulling Mattes)

給出一些真實(shí)相片儡首,不容易正確抽取出場景中被觀察物體的圖層片任。即便你讓天氣預(yù)報員站在一個藍(lán)色屏幕的前面,可能容易迷惑于一個藍(lán)色調(diào)的不透明前景像素和一個半透明的灰色像素蔬胯。這是一個當(dāng)前研究的領(lǐng)域对供。對于這個主題的更多信息,參考課后書目[43]氛濒。

16.4.4 實(shí)踐(In Practice)

OpenGL中产场,alpha不只是用于圖像合成,而是以更通用意義的方式作為建模透明性和混合色彩值的工具舞竿。我們能夠賦值一個alpha值作為碎片著色器中fragColor的第四部件京景,并且這被用于把fragColor和當(dāng)前位于幀緩存中的任意當(dāng)前存在色彩合并在一起。例如骗奖,alpha可以被用作建模(單色)透明的方式确徙⌒汛混合(blending)通過調(diào)用glEnable(GL_BLEND)來啟用,并且將要被使用的混合計算通過在glBlendFunc的調(diào)用中指定參數(shù)來使用鄙皇。

例如芜赌,圖示\text{Figure 16.5}中的毛絨兔子在OpenGL中借助alpha混合被繪制。毛絨兔子被繪制為一系列“殼”伴逸,每個殼使用一個表達(dá)一個皮毛切片的圖像被紋理化缠沈。這些紋理包含alpha 值,所以皮毛之間的空間是半透明的错蝴。這種技術(shù)被描述在參考書目[42]洲愤。

在圖像中使用alpha的主要困難為,對于不可交換的混合操作(比如over操作符)漱竖,物體圖層必須以特定順序被繪制(比方說從后到前)禽篱。如果我們被以亂序順序給出圖層,并且還必須合并它們按照它們被給到我們時的順序馍惹,沒有方式可以得到想要的結(jié)果躺率。這使得透明某種程度上難于在一個基于光柵化的上下文中處理。這剛好相反于z-緩存的通常用法万矾,這里不透明物體可以以任何順序繪制悼吱。

Figure16.5.png

Figure 16.5: 毛絨兔子被作為一系列越來越大的同心兔子方式來繪制。每個(兔子)都是部分透明的良狈。很神奇地后添,這看起來像毛絨絨的皮毛。

Figure16.6.png

Figure 16.6: 頂部行:一個棋盤圖案被繪制為小的黑白正方形薪丁。(這里沒有使用紋理映射)遇西。圖像在右側(cè)被放大以更清晰地展示像素值。在正方形的邊緣严嗜,鋸齒被看到粱檀。在遠(yuǎn)方區(qū)域,云紋圖案被看到漫玄。中間行:圖像在OpenGL中借助多采樣方式被生成茄蚯。這會提顯著升圖像的質(zhì)量。底部行:圖像借助非常高的超級采樣比率被離線生成睦优。這是我們理想中想讓我們的渲染所看起來的樣子渗常。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市汗盘,隨后出現(xiàn)的幾起案子皱碘,更是在濱河造成了極大的恐慌,老刑警劉巖隐孽,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件癌椿,死亡現(xiàn)場離奇詭異家凯,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)如失,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進(jìn)店門绊诲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人褪贵,你說我怎么就攤上這事掂之。” “怎么了脆丁?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵世舰,是天一觀的道長。 經(jīng)常有香客問我槽卫,道長跟压,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任歼培,我火速辦了婚禮震蒋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘躲庄。我一直安慰自己查剖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布噪窘。 她就那樣靜靜地躺著笋庄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪倔监。 梳的紋絲不亂的頭發(fā)上直砂,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機(jī)與錄音浩习,去河邊找鬼静暂。 笑死,一個胖子當(dāng)著我的面吹牛瘦锹,可吹牛的內(nèi)容都是我干的籍嘹。 我是一名探鬼主播闪盔,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼弯院,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了泪掀?” 一聲冷哼從身側(cè)響起听绳,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎异赫,沒想到半個月后椅挣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體头岔,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年鼠证,在試婚紗的時候發(fā)現(xiàn)自己被綠了峡竣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡量九,死狀恐怖适掰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情荠列,我是刑警寧澤类浪,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站肌似,受9級特大地震影響费就,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜川队,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一力细、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧固额,春花似錦艳汽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瑟捣,卻和暖如春馋艺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背迈套。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工捐祠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人桑李。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓踱蛀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親贵白。 傳聞我的和親對象是個殘疾皇子率拒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容