OpenGL ES提供了如此多的選項用來保存、映射,以及配置紋理,以至于這個主題常常會壓垮程序員。關(guān)于紋素顏色格式、紋理環(huán)境函數(shù)、取樣模式,以及細(xì)節(jié)級別存在一個天文數(shù)字的組合和排列。本節(jié)甚至?xí)榻B更多的選項,因此為了保持這個主題在可管理范圍內(nèi),專注于現(xiàn)代最常用的用例是必要的。
可以使用包含透明度元素的GL_RGBA 紋理格式來指定每個紋素的透明度。圖3-6顯示了一個擁有透明度顏色元素值的紋理,因此棋盤格圖案可以透過半透明的紋素顯示出來。通常一個或者更多個紋素會結(jié)合燈光和頂點顏色來決定每個片元的最終顏色和透明度。第4章會介紹燈光。每個片元產(chǎn)生的透明度都會影響片元怎么與一個幀緩存內(nèi)的現(xiàn)存內(nèi)容相混合。
當(dāng)紋理計算出來一個完全不透明的最終片元顏色時,這個片元顏色會簡單地替換任何在幀緩存的像素顏色渲染緩存內(nèi)現(xiàn)存的對應(yīng)的像素顏色。還有更有意思的混合方式。如果計算出來的片元顏色部分透明或者全透明,OpenGL ES會使用一個混合函數(shù)來混合片元顏色與像素顏色渲染緩存內(nèi)對應(yīng)的像素。
通過調(diào)用glEnable(GL_BLEND)函數(shù)來開啟混合。然后通過調(diào)用glBlendFunc(sourceFactor,destinationFactor)來設(shè)置混合函數(shù)。sourceFactor參數(shù)用于指定每個片元的最終顏色元素是怎么影響混合的。destinationFactor參數(shù)用于指定在目標(biāo)幀緩存中已經(jīng)存在的顏色元素會怎么影響混合。最常用的混合函數(shù)配置是設(shè)置sourceFactor為GL_SRC_ALPHA,設(shè)置destinationFactor為GL_ONE_MINUS_SRC_ALPHA,如下代碼所示:
GL_SRC_ALPHA用于讓源片元的透明度元素挨個與其他的片元顏色元素相乘。GL_ONE_MINUS_SRC_ALPHA用于讓源片元的透明度元素(1.0)與在幀緩存內(nèi)的正被更新的像素的顏色元素相乘。結(jié)果是,如果片元的透明度值為0,那么沒有片元的顏色會出現(xiàn)在幀緩存中。如果片元的透明度值為1,那么片元的顏色會完全替代在幀緩存中的對應(yīng)的像素顏色。介于0.0到1.0之間的透明度值意味著片元顏色的一部分會被添加到幀緩存內(nèi)對應(yīng)的像素顏色的一部分中來產(chǎn)生一個混合的結(jié)果。當(dāng)使用glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA) 時,在幀緩存中的最終顏色是用下面的方程式計算的: