OpenGL ES 系列筆記二

紋理:紋理是一個(gè)用來保存圖像的顏色元素值的OpenGL ES緩存。

當(dāng)一個(gè)圖像初始化一個(gè)紋理緩存之后,在這個(gè)圖像中的每一個(gè)像素變成了紋理中得一個(gè)紋素。紋素保存顏色數(shù)據(jù),像素通常表示計(jì)算機(jī)屏幕上的一個(gè)實(shí)際的顏色點(diǎn),因此,像素通常會被用作為一個(gè)測量單位,紋素存在于一個(gè)虛擬的沒有尺寸的數(shù)學(xué)坐標(biāo)系中。紋理坐標(biāo)有一個(gè)命名為S軸和T軸的2D坐標(biāo),在一個(gè)紋理中無論有多少個(gè)紋素紋理的尺寸在S軸和T軸上永遠(yuǎn)都是0.0~1.0之間

在每個(gè)頂點(diǎn)的XYZ坐標(biāo)轉(zhuǎn)換為視口坐標(biāo)后,GPU會設(shè)置轉(zhuǎn)換生成三角形內(nèi)的的每個(gè)頂點(diǎn)的每個(gè)像素的顏色,當(dāng)OpenGL ES沒有使用紋理時(shí),GPU會根據(jù)每個(gè)包含了該片元對象的的頂點(diǎn)顏色來算每個(gè)片元的顏色,當(dāng)綁定了紋理有,GPU會根據(jù)綁定的紋理計(jì)算出每個(gè)片元的顏色。

紋理映射

紋理和頂點(diǎn)如何對齊才能讓GPU知道每個(gè)片元對應(yīng)的紋素?

這個(gè)對齊的過程叫做映射,因?yàn)槊總€(gè)頂點(diǎn)除了有XYZ坐標(biāo),還會有UV坐標(biāo),每個(gè)U坐標(biāo)會映射頂點(diǎn)在紋理中一個(gè)S軸上的位置,V則會映射到T軸上



當(dāng)頂點(diǎn)都映射到紋理上,GPU就可以開始計(jì)算每個(gè)片元顏色了,但是并不是每次都會出現(xiàn)片元數(shù) = 玟素?cái)?shù),這樣就涉及到紋理的采樣模式了

紋理采樣:根據(jù)片元的紋理坐標(biāo)到紋理圖中提取對應(yīng)位置的顏色

當(dāng)出現(xiàn)片元與玟素個(gè)數(shù)不對應(yīng)時(shí),程序應(yīng)該告訴OpenGL ES應(yīng)該怎樣去取樣:

減小和放大過濾:

當(dāng)用GL_LINEAR修飾GL_TEXTURE_MIN_FILTER,當(dāng)出現(xiàn)玟素>片元的時(shí)候,就會從幾個(gè)符合條件的玟素采用線性內(nèi)插法混和玟素,從而得到片元的顏色。當(dāng)使用GL_NEAREST修飾GL_TEXTURE_MIN_FILTER,如果出現(xiàn)紋素>片元 就會取距離UV坐標(biāo)最近的一個(gè)紋素作為片元的顏色

而GL_TEXTURE_MAG_FILTER是使用在 紋素<片元的情況,當(dāng)使用GL_LINEAR修飾GL_TEXTURE_MAG_FILTER時(shí)混合附近紋素作為片元的顏色,當(dāng)使用GL_NEAREST時(shí)就會拾取與UV坐標(biāo)最近的一個(gè)紋素并放大紋理。

越界過濾

當(dāng)出現(xiàn)UV坐標(biāo)的值小于0 或者大于1的時(shí)候,紋理坐標(biāo)(0~1)就沒有對應(yīng)的坐標(biāo)去匹配了,這時(shí)候可以設(shè)置另外兩個(gè)屬性去指定紋理的映射方式,此時(shí)有兩個(gè)選擇,要么盡可能多地重復(fù)紋理以填滿映射到記得圖形的整個(gè)UV區(qū)域,要么是取紋理邊緣的元素去填充多出來的片元。

紋理加載


GLKTextureLoader的"-textureQWithCGImage:options:error:"方法會接收一個(gè)CGImageRef并創(chuàng)建一個(gè)新的包含CGImageRef的像素?cái)?shù)據(jù)的OpenGL ES紋理緩存。GLKTextureLoader會自動調(diào)用上面定義的采樣設(shè)置函數(shù)glTexParameteri()來設(shè)置取樣和循環(huán)模式。

透明度、混合和多重紋理

當(dāng)紋理計(jì)算出來一個(gè)完全不透明的最終片元顏色時(shí),這個(gè)片元顏色會簡單地替代任何在幀緩存的像素顏色渲染緩存內(nèi)存在的對應(yīng)的像素顏色。如果計(jì)算出來是半透明或者是全透明的,OpenGL ES就會使用一個(gè)混合函數(shù)來混合片元顏色與像素顏色緩存內(nèi)對應(yīng)的像素。通過glEnable(GL_BLEND)函數(shù)開啟混合。然后通過glBlendFuns(sourceFactor,distinationFactor)來設(shè)置混合函數(shù)。最常用的代碼組合

glEnable(GL_BLEND);

glBlendFunc(GL_SEC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

多重紋理混合

通過多次讀寫像素顏色渲染緩存來創(chuàng)建一個(gè)最終渲染像素的過程叫做多通道渲染。但是,由于內(nèi)存收到限制,多通道渲染是次優(yōu)的??梢赃x擇更優(yōu)秀的多重紋理方法。

所有當(dāng)代的GPU有能夠同時(shí)從至少兩個(gè)紋理緩存中取樣紋素,執(zhí)行紋素取樣的混合的硬件組件叫做一個(gè)紋理單元或者一個(gè)取樣器,如果你的應(yīng)用需要超過了兩個(gè)紋理單元,在確定一個(gè)單獨(dú)的通道中可以結(jié)合多喝個(gè)紋理之前,請使用以上代碼。

多重紋理引入了另一個(gè)組合配置選項(xiàng),GLKit的GLKEffercPropertyTexture類定義了三種常用的多重紋理模式:GLKTextureEnvModeReplace/GLKTextureEnvModeModelate/GLKTextureEnvModelDecalGLKEffectPropertyTexture默認(rèn)使用GLKTextureEnvModeModelate模式會讓所有燈光和其他效果計(jì)算出來的顏色與從一個(gè)取樣的顏色相混合。

使用Shading Language自定義紋理使多重紋理更具有靈活性。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容