OpenGL可同時對多邊形映射多個紋理,稱為『多紋理映射』. 它是OpenGL的可選擴展實現,並非所有的OpenGL都有實現.『OpenGL API的所有擴展必須得到ARB(OpenGL體系評審委員會)的認可』,在進行多紋理映射時,每個紋理單元都將映射結果傳遞給下個紋理單元,直至所有的紋理的紋理單元都進行映射(最終結果)演示程式:下载
多紋理映射分為四個步驟: |
1.判斷是否支持『多紋理映射』 |
2.讀取擴展函式的指針 |
3.建立紋理單元 |
4.設置紋理坐標 |
定義多紋理映射結構
typedef struct MULTITEXTURE_TYP {
TEXTURE texture0;
TEXTURE texture1;
}MULTITEXTURE,*MULTITEXTURE_PTR;
1.驗證當前版本的OpenGL是否支持『多紋理映射』
函式 | 簡介 |
glGetString(GL_EXTENSIONS) | 獲取OpenGL所支持的所有擴展函式
返回以空格隔開的字符串列表 |
GL_ARB_multitexture | 查找(GL_ARB_multitexture)判斷是否支持『多紋理映射』 |
判斷是否支持某一擴展函式
bool Extensions_OpenGL(const char * name)
{
char * extensions;
int index = 0;
int length,n;
extensions = (char*)glGetString(GL_EXTENSIONS);// 擴展函式
length = strlen(name);// 長度
while (extensions[index] != NULL)// 循環查找
{
n = strcspn(extensions + index, ” “);// 查找空格
if (n == length && strncmp(extensions + index, name, length) == 0)// 比較
return true;
index = index + n + 1; // 跳過空格
}
return false;
}
2.讀取擴展函式的指針
函式 | 簡介 |
PROC wglGetProcAddress(LPCSTR lpszProc); | 返回擴展函式的地址 |
擴展函式定義 | 簡介 |
typedef void (APIENTRY * PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); | 為多紋理映射設置紋理座標 |
typedef void (APIENTRY * PFNGLACTIVETEXTUREARBPROC) (GLenum texture); | 設置當前的紋理單元 |
typedef void (APIENTRY * PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); | 設置選擇當前的紋理單位,以便用頂點數組指定紋理坐標數據 |
初此化多紋理映射
PFNGLMULTITEXCOORD2FARBPROC glMultiTexCoord2fARB;
PFNGLACTIVETEXTUREARBPROC glActiveTextureARB;
PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTextureARB;
void Init_Multitexture()
{// 判斷是否支持某一擴展函式
if( Extensions_OpenGL(“GL_ARB_multitexture”) )
{
glMultiTexCoord2fARB=(PFNGLMULTITEXCOORD2FARBPROC)wglGetProcAddress(“glMultiTexCoord2fARB”);
glActiveTextureARB=(PFNGLACTIVETEXTUREARBPROC)wglGetProcAddress(“glActiveTextureARB”);
glClientActiveTextureARB=(PFNGLCLIENTACTIVETEXTUREARBPROC)wglGetProcAddress(“glClientActiveTextureARB”);
}
}
3.建立紋理單元
載入紋理並綁定 | 簡介 |
『.bmp』 『.tga』 『.pcx』 | 載入紋理文件 |
glGenTextures(1, &texture->ID); | 生成紋理單元綁定紋理 |
激活多紋理映射
void Active_Multitexture(MULTITEXTURE_PTR multitexture)
{
glActiveTextureARB(GL_TEXTURE0_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, multitexture->texture0.ID);// 綁定紋理
glActiveTextureARB(GL_TEXTURE1_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, multitexture->texture1.ID);// 綁定紋理
}
OpenGL最多支持32個紋理『GL_TEXTURE0_ARB』~『GL_TEXTURE31_ARB』
但最後通過查詢當前版本支持的最大單元量
int maxTexUnits;
glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB,&maxTexUnits);
4.設置紋理坐標
簡介 | |
void glMultiTexCoord2fARB(GLenum texUnit,float coords); | 設置紋理坐標 |
texUnit: GL_TEXTURE0_ARB~GL_TEXTURE31_ARB | 紋理單元索引 |
Coords: | 紋理坐標 |