2013年6月22日 星期六

OpenGL基本瞭解(十七)(Texture mapping)


材質貼圖,又稱紋理貼圖,在電腦圖形學中是把儲存在內存里的點陣圖包 裹到3D渲染物體的表面。紋理貼圖給物體提供了豐富的細節,用簡單的方式類比出了複雜的外觀。一個影像(紋理)被貼(對映)到場景中的一個簡單形體上,就 像印花貼到一個平面上一樣。這大大減少了在場景中製作形體和紋理的計算量。例如,可以建立一個球並把臉的紋理貼上去,這樣就不用處理鼻子和眼睛的形狀了。
隨著圖形卡功 能越來越強,理論上材質貼圖變得越來越不必要,而三維繪製(渲染)成了常用的工具。但事實上,最近的趨勢是使用更大和更多的紋理影像,再加上把多幅紋理組 合到同個物體的不同角度的複雜技術。(這在即時圖形學中更為重要,因為同時顯示的紋理個數是可用圖形內存容量的函式。)
最後顯示在螢幕上的像素是從紋理的紋素中計算的,計算方法由紋理濾波決定。最簡單的方法是每個像素使用一個最接近的紋素,多個紋素之間的線性插值也很常用,還有更複雜的辦法,參看Mipmap。另外,紋理也可用來決定模型表面的顏色,甚至雙向反射分布函式(BRDF),從而和光照模型等方法結合起來。

貼圖的影像大小,必須為方形(長方亦可),且其長寬的像素必須為2的倍數,這是為了節省硬體資源。如果不是所需大小,可以用縮放方式,或是填充空白像素來解決。




OPENGLES參考指令

GL_TEXTURE_WRAP_S,有三個次選項
1. GL_CLAMP_TO_EDGE, 2. GL_MIRRORED_REPEAT, 3. GL_REPEAT(default).  

GL_TEXTURE_WRAP_T,有三個次選項
1. GL_CLAMP_TO_EDGE, 2. GL_MIRRORED_REPEAT, 3. GL_REPEAT(default).


組合參考, GL_MIRRORED_REPEAT只是在重複時,會呈現鏡射狀。

WRAP_S: GL_REPEAT
WRAP_T: GL_REPEAT
WRAP_S: GL_REPEAT
WRAP_T: GL_CLAMP_TO_EDGE
WRAP_S: GL_REPEAT
WRAP_T: GL_CLAMP_TO_EDGE
WRAP_S: GL_CLAMP_TO_EDGE
WRAP_T: GL_CLAMP_TO_EDGE






glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);


其中
S = x dimension
T = y dimension
 
 
Many 3D modeling packages can export UV texture coordinates 
along with the model. 
(opengl calls these coordinates S and T). 

(U,V) = (X,Y) of texture.

U = X pixel position of image / image width ;

V = Y pixel position of image / image height ;

U/V類似一個相對於Texture這個圖上位置的百分比(假設圖寬及長各為一)


 
但是在iphone 3D Programming這本書上面寫的是左上系統,同DirectX所述。 
而OPENGL的規格所寫的是左下系統。 

只要知道差異就好了,不必細究太多,有問題的話再反轉一下Y就好了。
 

 參考網站

http://www.inf.ufrgs.br/~oliveira/RTM.html

http://zh.wikipedia.org/wiki/%E6%9D%90%E8%B4%A8%E8%B4%B4%E5%9B%BE

http://open.gl/textures

http://www.opengl.org/wiki/Texture

http://www.imobilebbs.com/wordpress/archives/1571

http://www.cs.nccu.edu.tw/~mtchi/3d12/lab/3d12-lab5.pdf

http://caobeixingqiu.is-programmer.com/posts/18999.html

http://thedev-log.blogspot.tw/2012/07/texture-coordinates-tutorial-opengl-and.html

沒有留言: