紋理
? ? ? ? 紋理是一個用來保存圖像的顏色元素值的OpenGL ES 緩存。它可以控制一個渲染的三角形中每個像素的顏色枫甲。紋理可以使用任何圖像源武,包括樹木、云彩想幻、機器粱栖、人物。當把紋理應(yīng)用到幾何圖形中后脏毯,會使渲染的場景更顯自然,會使三角形的復(fù)雜組合像是真實的物體而不是只有顏色的面闹究。在紋理的緩存中保存的顏色值可能要耗費很多的內(nèi)存,所以食店,應(yīng)該盡量使用最小的圖像來產(chǎn)生可以接受的渲染結(jié)果渣淤。
紋素
? ? ? ? ? 當用一個圖片初始化一個紋理緩存后,在這個圖像中的每個像素變成了紋理中的一個紋素吉嫩。與像素類似价认。紋素保存顏色數(shù)據(jù)。要說區(qū)別自娩。就是像素有具體的尺寸大小用踩,而紋素沒有,紋素存在于一個沒有尺寸的數(shù)學(xué)坐標系中忙迁。
紋理坐標系
? ? ? ? ?紋理坐標系中有一個命為 S 和 T 的2D軸(上面畫錯了脐彩,x當成是S,y當成是T)动漾。在一個紋理中無論有多少紋素丁屎,紋理的尺寸永遠在S軸上是從 0 - 1.0 ,在T 軸上 是從 0 - 1.0.比如:一張圖片寬是100像素旱眯,高是100像素晨川。那S軸的1.0就表示截取圖片的寬是100像素证九,如果S軸是0.5,則只會截取到圖片的寬是50像素共虑,圖片只會顯示一半愧怜。
片元
? ? ? ? ?每個頂點坐標的X、Y妈拌、Z坐標被轉(zhuǎn)換成視口坐標后拥坛,GPU會設(shè)置轉(zhuǎn)換生成的三角形內(nèi)的每個像素的顏色。轉(zhuǎn)換幾何形狀數(shù)據(jù)為幀緩存中的顏色像素的渲染步驟叫做點陣化(rasterizing)尘分,每個顏色像素叫做片元(franment)猜惋。
映射
? ? ? ? ? 程序需要指定怎么對齊紋理和頂點,以便讓GPU知道每個片元的顏色由哪些紋素來決定培愁。這個對齊又叫做映射(mapping)著摔。
? ? ? ? ?其實每個頂點除了給定的X、Y定续、Z坐標谍咆,每個頂點還給出了U和V的坐標值。U坐標會映射紋理中的S軸私股,V坐標會映射到T軸摹察。
取樣
? ? ? ? ?GPU會根據(jù)每個片元的U、V位置從綁定的紋理中選擇紋素倡鲸。這個過程叫做取樣供嚎。取樣會把紋理的S和T坐標系中與每個渲染的三角形的頂點的U、V坐標匹配起來峭状。例如:一個U查坪、V坐標為{0.5,0.5}的片元會被當前綁定的紋理中最接近中間位置的紋素著色宁炫。
取樣模式
glTexParameteri (GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri (GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri (GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri (GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
GL_TEXTURE_MIN_FILTER ? 多個紋素對應(yīng)一個片元時
GL_TEXTURE_MAG_FILTER 沒有足夠多的紋素來唯一性地映射一個片元,會有放大紋理的效果
GL_LINEAR? 當使用指定參數(shù) GL_TEXTURE_MIN_FILTER氮凝,會使用線性插法來混合這些顏色以得到片元最終的顏色羔巢,
GL_LINEAR當使用指定參數(shù)GL_TEXTURE_MAG_FILTER,會混合附近紋素的顏色來計算片元的顏色罩阵,會有一個放大紋理的效果竿秆,并會讓它模糊地出現(xiàn)在渲染的三角形上
GL_NEAREST? 與片元U、V坐標最接近的紋素的顏色會被取樣稿壁,當指定參數(shù)是 GL_TEXTURE_MAG_FILTER幽钢,會有一個放大紋理的效果
除了上面這放大和縮小的過濾選項之外,當U傅是、V坐標的值小于0或者大于1的時候匪燕,有以下兩種選擇蕾羊,要么盡可能多的重復(fù)紋理以填滿映射到幾何圖形的整個U、V區(qū)域帽驯,要么每當片元的U龟再、V坐標超出紋理的S、T坐標系范圍的時候尼变,取樣紋理邊緣的紋素利凑。
glTexParameteri (GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
glTexParameteri (GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
glTexParameteri (GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
GL_TEXTURE_WRAP_S 和 GL_TEXTURE_WRAP_T?分別代表紋理坐標系的S 和T軸
GL_REPEAT :代表重復(fù)紋理
GL_CLAMP_TO_EDGE:代表取邊緣紋理
代碼實現(xiàn)
1.定義一個結(jié)構(gòu)體
2.設(shè)置上下文,創(chuàng)建綁定頂點緩存區(qū)域嫌术,分配內(nèi)存
3.創(chuàng)建綁定頂點索引緩存區(qū)域,分配內(nèi)存
4.設(shè)置屬性
5.添加紋理
6.繪制
7.最后進行銷毀
8.運行結(jié)果
在這個demo第二個例子中我們還用到了一個新的函數(shù)割按,這里說一下。
glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data);
// 用來更新一個已有緩沖區(qū)對象中的一部分數(shù)據(jù)
@param target 用來指定需要更新的緩沖區(qū)對象的類型,如 GL_ARRAY_BUFFER
@param GLintptr 要從什么地方開始更新原來的數(shù)據(jù)(以字節(jié)為單位)
@param size 需要更新的數(shù)據(jù)量的大小
@param data 個指向新數(shù)據(jù)源的指針蚯嫌,將新的數(shù)據(jù)源拷貝到緩沖區(qū)對象中完成更新