多重纹理理论不作介绍,我也不清楚底层实现,nehe的opengl教程中也有示例。毕业课题中涉及多重纹理的使用,我只是粘贴部分实现代码,对于一些人来说,这已经足够了,:)
我的显卡是gf5700,查询arb扩展,最多支持4个纹理,所以每个pass也就最多加载4个纹理,我把纹理送入显卡,由Cg操纵纹理,所以,下边代码没有过多对纹理的操作,
#include <gl/gl.h> #include <gl/glu.h> #include "gl/glext.h" //glext.h需要另外去下载
//定义extensions入口宏 #define INIT_ENTRY_POINT( funcname, type ) \ static type funcname= (type) wglGetProcAddress(#funcname); \ if ( !funcname ){ \ TRACE2(_T("!! Fail to Get Proc address: "#funcname \ " (%s,%d)\n"),__FILE__,__LINE__); \ } //Mac end
,,,
//检测一下显卡对多重纹理的支持情况
int nUnits,nSize; glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &nUnits); glGetIntegerv(GL_MAX_RECTANGLE_TEXTURE_SIZE_NV, &nSize); TRACE2("GL_MAX_TEXTURE_UNITS_ARB =%d ,GL_MAX_RECTANGLE_TEXTURE_SIZE_NV =%d \n",nUnits,nSize);
定义纹理,我在里边使用了矩形纹理,这样纹理坐标的范围就不是[0,1],而是[0,w],[0,h],它的使用也很简单,以后有空在说一些它的东西,
glGenTextures(1,¶m.nVerTex); glBindTexture(GL_TEXTURE_RECTANGLE_NV,param.nVerTex); glTexImage2D(GL_TEXTURE_RECTANGLE_NV,0,GL_RGB, param.sizeVertexTex.cx, param.sizeVertexTex.cy,0,GL_RGB,GL_FLOAT,param.pfVertexTex); glTexParameteri(GL_TEXTURE_RECTANGLE_NV,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_RECTANGLE_NV,GL_TEXTURE_MIN_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_RECTANGLE_NV,GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_RECTANGLE_NV,GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); ,,,
创建物体,贴上纹理,
INIT_ENTRY_POINT( glActiveTextureARB, PFNGLACTIVETEXTUREARBPROC ); INIT_ENTRY_POINT( glMultiTexCoord2fARB, PFNGLMULTITEXCOORD2FARBPROC );
//绑定纹理 glActiveTextureARB(GL_TEXTURE0_ARB); glEnable(GL_TEXTURE_RECTANGLE_NV); glBindTexture(GL_TEXTURE_RECTANGLE_NV,pTexA->nIdxTex); glActiveTextureARB(GL_TEXTURE1_ARB); glEnable(GL_TEXTURE_RECTANGLE_NV); glBindTexture(GL_TEXTURE_RECTANGLE_NV,pTexA->nVerTex);
glActiveTextureARB(GL_TEXTURE2_ARB); glEnable(GL_TEXTURE_RECTANGLE_NV); glBindTexture(GL_TEXTURE_RECTANGLE_NV,pTexB->nIdxTex);
glActiveTextureARB(GL_TEXTURE3_ARB); glEnable(GL_TEXTURE_RECTANGLE_NV); glBindTexture(GL_TEXTURE_RECTANGLE_NV,pTexB->nVerTex); glBegin(GL_QUADS);
//左下 glMultiTexCoord2fARB(GL_TEXTURE0_ARB,0,0); glMultiTexCoord2fARB(GL_TEXTURE1_ARB,0,0); glMultiTexCoord2fARB(GL_TEXTURE2_ARB,0,0); glMultiTexCoord2fARB(GL_TEXTURE3_ARB,0,0); glVertex3f(0.0f,0.0f,-10.0f); //右下 glMultiTexCoord2fARB(GL_TEXTURE0_ARB,50,0); glMultiTexCoord2fARB(GL_TEXTURE1_ARB,100.0f,0.0f); glMultiTexCoord2fARB(GL_TEXTURE2_ARB,10.0f,0.0f); glMultiTexCoord2fARB(GL_TEXTURE3_ARB,10.0f,0.0f); glVertex3f(100.0f,0.0f,-10.0f); //右上 glMultiTexCoord2fARB(GL_TEXTURE0_ARB,50,50); glMultiTexCoord2fARB(GL_TEXTURE1_ARB,10.0f,10.0f); glMultiTexCoord2fARB(GL_TEXTURE2_ARB,10.0f,1.0f); glMultiTexCoord2fARB(GL_TEXTURE3_ARB,10.0f,1.0f); glVertex3f(100.0f,100.0f,-10.0f); //左上 glMultiTexCoord2fARB(GL_TEXTURE0_ARB,0,50); glMultiTexCoord2fARB(GL_TEXTURE1_ARB,0.0f,10.0f); glMultiTexCoord2fARB(GL_TEXTURE2_ARB,0.0f,10.0f); glMultiTexCoord2fARB(GL_TEXTURE3_ARB,0.0f,10.0f); glVertex3f(0.0f,100.0f,-10.0f);
glEnd();
glFlush();
glActiveTextureARB(GL_TEXTURE0_ARB); glDisable(GL_TEXTURE_RECTANGLE_NV); glActiveTextureARB(GL_TEXTURE1_ARB); glDisable(GL_TEXTURE_RECTANGLE_NV);
glActiveTextureARB(GL_TEXTURE2_ARB); glDisable(GL_TEXTURE_RECTANGLE_NV);
glActiveTextureARB(GL_TEXTURE3_ARB); glDisable(GL_TEXTURE_RECTANGLE_NV);

|