紋理對齊:
默認(rèn)情況下胸私,OpenGL采用4字節(jié)的對齊方式挫掏,比如:如果一幅RGB圖像,包含3個(gè)分量特纤,若圖像的寬度為199個(gè)像素军俊,那么圖像的每一行占用多少空間呢?
答:如果按照緊密包裝的形式捧存,已知每個(gè)分量占用一個(gè)字節(jié)粪躬,那么所占的內(nèi)存為:199*3 = 597。顯然這樣是錯(cuò)誤的矗蕊,因?yàn)槲覀儾捎玫氖?字節(jié)對齊短蜕,而597不是4的倍數(shù),實(shí)際每一行占用為600字節(jié)傻咖。
如果要改變對齊方式使用glPixelStorei()朋魔。
紋理參數(shù):
注意:當(dāng)紋理加載到內(nèi)存時(shí)紋理已經(jīng)被規(guī)范到0-1
glTexParameteri (GLenum target,GLenum pname,GLint param);
target可以是GL_TEXTURE_1D,GL_TEXTURE_2D卿操,GL_TEXTURE_3D
pname指定了需要設(shè)置的紋理參數(shù)GL_TEXTURE_MAG_FILTER警检,GL_TEXTURE_MIN_FILTER (過濾),GL_TEXTURE_WRAP_S害淤,GL_TEXTURE_WRAP_T (環(huán)繞)
param用于設(shè)置特定的紋理參數(shù)的值
過濾:
紋理和屏幕上的像素從來不會(huì)形成一對一的對應(yīng)關(guān)系扇雕,因此當(dāng)紋理應(yīng)用時(shí)紋理不是被拉伸就是壓縮;根據(jù)一個(gè)拉伸或收縮的紋理貼圖計(jì)算顏色片段的過程稱為紋理過濾 (Texture Filitering).
過濾種類:GL_TEXTURE_MAG_FILTER放大過濾窥摄,GL_TEXTURE_MIN_FILTER縮小過濾
參數(shù)值:GL_NEAREST最鄰近過濾镶奉,是最簡單、最快速的過濾方法崭放,不管紋理坐標(biāo)位于哪個(gè)紋理單元哨苛,這個(gè)紋理單元的顏色就作為這個(gè)片段的紋理顏色,當(dāng)紋理被拉伸時(shí)出現(xiàn)鋸齒狀币砂。GL_LINEAR線形過濾建峭,這個(gè)模式不是把最近的紋理單元應(yīng)用到紋理坐標(biāo)中,而是把這個(gè)紋理周圍的加權(quán)平均值應(yīng)用到這個(gè)紋理坐標(biāo)决摧,類似于模糊效果亿蒸。?
環(huán)繞:
一般情況下我們在0.0到0.1之間指定紋理坐標(biāo)凑兰,但是如果紋理坐標(biāo)在這個(gè)范圍之外時(shí)根據(jù)紋理環(huán)繞模式(Wrapping Mode)處理問題;GL_TEXTURE_WRAP_T边锁,GL_TEXTURE_WRAP_S分別指兩個(gè)方向
GL_CLAMP_TO_EDGE模式下超過0-1范圍的根據(jù)邊緣的紋理顏色來確定顏色
GL_CLAMP_TO_BORDER使用由代碼設(shè)置GL_TEXTURE_BORDER_COLOR(設(shè)置邊框顏色為紅色)的顏色
各向異性過濾:
當(dāng)我們垂直看一幅圖片時(shí)這個(gè)過程是完美的姑食,但是我們以一個(gè)角度傾斜觀察這個(gè)圖片時(shí),對周圍紋理進(jìn)行常規(guī)采樣會(huì)導(dǎo)致一些紋理信息的丟失砚蓬,如果我們在進(jìn)行紋理過濾時(shí)考慮到了觀察角度矢门,那么這種過濾方法稱為各向異性過濾。
?GLfloat fLargest;
glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &fLargest); ?
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, fLargest);
Mip貼圖:
當(dāng)紋理被頻繁的放大或者縮小時(shí)一會(huì)造成屏幕閃爍灰蛙,二會(huì)造成性能浪費(fèi)祟剔;所以提前把一組尺寸不同但內(nèi)容相同的圖片載入內(nèi)存,這叫做Mip貼圖摩梧。這組圖片每個(gè)圖片比上個(gè)縮小一倍物延,直到大小為1*1為止,這比不使用mip內(nèi)存消耗多出三分之一
如何使用仅父?
Mop貼圖是通過glTexImage2D()加載每一層圖片直到1*1叛薯,如果不需要到1*1,可以通過glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_BASE_LEVEL,0)或者glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAX_LEVEL,0)控制哪些Mip層被加載笙纤。也可以直接使用glGenerateMipmap()系統(tǒng)為我們自動(dòng)生成并加載其余Mip層
紋理壓縮:
紋理貼圖可以增加令人難以置信的逼真效果耗溜,并且在定點(diǎn)處理上所需要付出的代價(jià)非常少。但是它需要大量的內(nèi)存來存儲(chǔ)和處理紋理
壓縮紋理:glTexImage2D(GL_TEXTURE_2D,0, GL_COMPRESSED_RGB, nWidth, nHeight,0,eFormat, GL_UNSIGNED_BYTE, pBits);
選擇最快速度還是最佳質(zhì)量來選擇壓縮格式:glHint();
從內(nèi)存中讀取已經(jīng)壓縮的紋理:glCompressedTexImage2D ()