OpenGL可以把紋理映射到指定的圖形的表面上。簡單一點的,就是給平面映射紋理,比如一個四邊形,一個長方體的6個面,都可以指定位圖作為紋理映射到各個面上,下面簡單介紹相關的函數
1、glGenTextures函數
void glGenTextures(GLsizei n, GLuint * textures);
函數參數的含義:
n —— 生成的紋理的名稱的個數;
textures —— 生成的紋理名稱所存儲位置的指針,也就是一個紋理數組的記憶體位址,或者說是數組首元素的記憶體位址。
函數被調用,會生成一系列紋理的名字,并存儲到指定的數組中。
2、glBindTexture函數
glBindTexture函數實作了将調用glGenTextures函數生成的紋理的名字綁定到對應的目标紋理上。該函數的聲明如下所示:
void glBindTexture(GLenum target,GLuint texture);
函數參數的含義:
target —— 紋理被綁定的目标,它隻能取值GL_TEXTURE_1D或者GL_TEXTURE_2D;
texture —— 紋理的名稱,并且,該紋理的名稱在目前的應用中不能被再次使用。
3、glTexImage2D函數
調用glTexImage2D函數,用來指定二維紋理圖像。該函數的聲明如下所示:
void glTexImage2D(
GLenum target,
GLint level,
GLint components,
GLsizei width,
GLsizei height,
GLint border,
GLenum format,
GLenum type,
const GLvoid *pixels );
函數參數的含義:
target —— 指定目标紋理,必須為GL_TEXTURE_2D;
level —— 指定圖像級别的編号,0表示基本圖像,其它可以參考MSDN;
components —— 紋理中顔色元件的編号,可是是1或2或3或4;
width —— 紋理圖像的寬度;
height —— 紋理圖像的高度;
border —— 紋理圖像的邊框寬度,必須是0或1;
format —— 指定像素資料的格式,一共有9個取值:GL_COLOR_INDEX、GL_RED、GL_GREEN、GL_BLUE、GL_ALPHA、GL_RGB、 GL_RGBA、GL_BGR_EXT、GL_BGRA_EXT、GL_LUMINANCE、GL_LUMINANCE_ALPHA ,具體含義可以參考MSDN;
type —— 像素資料的資料類型,取值可以為GL_UNSIGNED_BYTE, GL_BYTE, GL_BITMAP, GL_UNSIGNED_SHORT, GL_SHORT, GL_UNSIGNED_INT, GL_INT, and GL_FLOAT;
pixels —— 記憶體中像素資料的指針。
4、glTexParameteri函數
glTexParameteri函數或者glTexParameterf函數用來設定紋理參數,聲明如下所示:
void glTexParameterf( GLenum target,GLenum pname, GLfloat param );
void glTexParameteri( GLenum target, GLenum pname, GLint param);
函數參數的含義:
target —— 目标紋理,必須為GL_TEXTURE_1D或GL_TEXTURE_2D;
pname —— 用來設定紋理映射過程中像素映射的問題等,取值可以為:GL_TEXTURE_MIN_FILTER、GL_TEXTURE_MAG_FILTER、 GL_TEXTURE_WRAP_S、GL_TEXTURE_WRAP_T,詳細含義可以檢視MSDN;
param —— 實際上就是pname的值,可以參考MSDN。
另外,該類函數還有兩個:
void glTexParameterfv()
void glTexParameteriv()
egl調用如下:
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
功能就是實作線形濾波的功能,當紋理映射到圖形表面以後,如果因為其它條件的設定導緻紋理不能更好地顯示的時候,進行過濾,按照指定的方式 進行顯示,可能會過濾掉顯示不正常的紋理像素。
5.glEGLImageTargetTexture2DOES函數
該函數可以完成相當于一般情況下的glTexImage2D的效果
EGLImage代表一種由EGL客戶API(如OpenGL,OpenVG)建立的共享資源類型,它的本意是共享2D圖像資料。
關于EGLImage的一種使用情景就是通過它來建立一個2D紋理:
eglCreateImageKHR (EGLDisplay dpy, EGLContext ctx, EGLenum target,EGLClientBuffer buffer, const EGLint *attrib_list)
其中,target決定了建立紋理的方式,buffer是圖像資料,可以是一塊gembuffer或者tbm surface
eg: image = eglCreateImage(EVAS_GL_NATIVE_SURFACE, tbm, NULL);
glBindTexture(GL_TEXTURE_2D, ad->texture);
glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, image);//類似glTexImage2D的功能
6.紋理映射過程
概括的說, 紋理映射機制允許你将一個圖像關聯到一個多邊形上,進而呈現出真實視覺效果。例如, 你可以将書的封面圖像應用到一個方形上, 這樣這個方形看起來就像是一本書了。 你可以将地球的地圖通過紋理映射應用到一個球體上, 那麼這個球體就是一個3D的具真實感的地球了。紋理映射在當今的3D圖形應用上處處皆是。遊戲都是通過紋理映射來作為虛拟真實的第一個步驟。
紋理映射是一個二維的數組。數組中的每一項稱之為紋理點( texel )。 雖然這個數組是二維的, 但是可以映射到非二維的對象上, 如球體或者其他的 3D 對象模型上。
比較常見的是, 開發者在他們的圖形應用中運用二維紋理, 當然一維或者三維的紋理也并非未聞。二維紋理有寬度和高度決定二維。一維紋理也有寬度和高度, 隻是高度被設為值1(機關:像素 pixel). 而三維紋理不僅具有寬度和高度, 還有深度, 是以三維為紋理又稱為立體紋理。我們讨論的主要是二維紋理
确定紋理坐标:
glTexCoord2f(1.of,1.Of);glVertex3f(1.Of,1.Of,0.Of);比如這一句話.對于設定紋理貼圖的坐标和繪圖坐标的确定問題.一般的 情況假設紋理和圖檔都是正方形的,那麼我們希望紋理映射到整個物體上面,這個時候紋理坐标按照逆時針放心依次(0,0),(1,0),(1,1),(0,1),其 中的四個坐标隻是代表的向量,并不是真實的坐标,如果是要一半貼到物體上就應該是0.5的值了,假如你給的紋理坐标大于1,那麼将會貼多個紋 理,比如值為2的時候,會有4個紋理貼圖.
glBegin(GL_POLYGON);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5f, 0.5f, 0.5f);//左下角
glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f, 0.5f, 0.5f); // 右下角
glTexCoord2f(1.0f, 1.0f); glVertex3f(0.5f, 0.5f, -0.5f);// 右上角
glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, 0.5f, -0.5f);// 左上角
glEnd();