天天看點

OpenGL ES紋理貼圖

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();

繼續閱讀