OpenGL纹理贴图简单例子.docx
- 文档编号:30007188
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:18
- 大小:16.32KB
OpenGL纹理贴图简单例子.docx
《OpenGL纹理贴图简单例子.docx》由会员分享,可在线阅读,更多相关《OpenGL纹理贴图简单例子.docx(18页珍藏版)》请在冰豆网上搜索。
OpenGL纹理贴图简单例子
【代码】
#include
#include
#include
staticdoubleX=0;
staticdoubleY=0;
staticdoubleZ=7;
//定义函数指针,在Windows环境下使用OpenGL扩展
PFNGLACTIVETEXTUREARBPROCglActiveTextureARB=NULL;
PFNGLMULTITEXCOORD2FARBPROCglMultiTexCoord2fARB=NULL;
//纹理存储数组
staticGLubyteT0[64][64][4];
staticGLubyteT1[64][64][4];
staticGLubyteT2[64][64][4];
//纹理名字
staticGLuintTname0;
staticGLuintTname1;
staticGLuintTname2;
//创建纹理
voidmakeImages(){//第二个纹理,黑白相间横条,*64
for(i=0;i<64;i++){
for(j=0;j<64;j++){
if(i%16<8)c=255;
//第一个纹理,渐变绿色,*64
for(i=0;i<64;i++){
}for(j=0;j<64;j++){
}T0[i][j][0]=(GLubyte)0;
T0[i][j][1]=(GLubyte)i*5+j*5;
T0[i][j][2]=(GLubyte)0;
T0[i][j][3]=(GLubyte)255;
inti,j,c;
}}}elsec=0;
T1[i][j][0]=(GLubyte)c;
T1[i][j][1]=(GLubyte)c;
T1[i][j][2]=(GLubyte)c;
T1[i][j][3]=(GLubyte)255;
//第三个纹理,黑白相间竖条,*64
for(i=0;i<64;i++){
}for(j=0;j<64;j++){
}if(j%16<8)c=255;
elsec=0;
T2[i][j][0]=(GLubyte)c;
T2[i][j][1]=(GLubyte)c;
T2[i][j][2]=(GLubyte)c;
T2[i][j][3]=(GLubyte)255;
voidinit(){//初始化纹理
glBindTexture(GL_TEXTURE_2D,Tname0);//生成指定名字的纹理对象
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,64,64,0,GL_RGBA,GL_UNSIGNED_BYTE,T0);//设glGenTextures(1,&Tname0);//获取纹理名字
glGenTextures(1,&Tname1);//获取纹理名字
glGenTextures(1,&Tname2);//获取纹理名字
makeImages();//纹理初始化
glPixelStorei(GL_UNPACK_ALIGNMENT,1);//对其像素字节
//场景初始化
glClearColor(
0.0,
0.0,
0.0,
0.0);
glShadeModel(GL_FLAT);
glEnable(GL_DEPTH_TEST);
//获取函数地址
glActiveTextureARB=
glMultiTexCoord2fARB=
(PFNGLACTIVETEXTUREARBPROC)wglGetProcAddress("glActiveTextureARB");
(PFNGLMULTITEXCOORD2FARBPROC)wglGetProcAddress("glMultiTexCoord2fARB");
置纹理对象内容}voiddisplay(){//绘制正方形
glBegin(GL_QUADS);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,
0.0,
0.0);
glVertex3f(-
4.0,
1.5,
0.0);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,
0.0,
1.0);
glVertex3f(-
4.0,
3.5,
0.0);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,
1.0,
1.0);
glVertex3f(-
2.0,
3.5,
0.0);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,
1.0,
0.0);
//激活纹理对象
glActiveTextureARB(GL_TEXTURE0_ARB);//选中号纹理
glEnable(GL_TEXTURE_2D);//使纹理可用
glBindTexture(GL_TEXTURE_2D,Tname0);//激活纹理
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);//设置纹理贴图方式glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt((GLfloat)X,(GLfloat)Y,(GLfloat)Z,
0.0,
0.0,
0.0,
0.0,
1.0,
0.0);//视图变换glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);//设置纹理过滤方式glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);//设置纹理过滤方式glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);//设置纹理过滤方式glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);//设置纹理过滤方式//同上,初始化纹理
glBindTexture(GL_TEXTURE_2D,Tname1);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,64,64,0,GL_RGBA,GL_UNSIGNED_BYTE,T1);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
//同上,初始化纹理
glBindTexture(GL_TEXTURE_2D,Tname2);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,64,64,0,GL_RGBA,GL_UNSIGNED_BYTE,T2);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glVertex3f(-
2.0,
1.5,
0.0);
glEnd();
glDisable(GL_TEXTURE_2D);
//同上,绘制正方形,使用号纹理
glActiveTextureARB(GL_TEXTURE1_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,Tname1);
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);
glBegin(GL_QUADS);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,
0.0,
0.0);
glVertex3f(-
1.0,
1.5,
0.0);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,
0.0,
1.0);
glVertex3f(-
1.0,
3.5,
0.0);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,
1.0,
1.0);
glVertex3f(
1.0,
3.5,
0.0);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,
1.0,
0.0);
glVertex3f(
1.0,
1.5,
0.0);
glEnd();
glDisable(GL_TEXTURE_2D);
//同上,绘制正方形,使用号纹理
glActiveTextureARB(GL_TEXTURE2_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,Tname2);
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);
glBegin(GL_QUADS);
glMultiTexCoord2fARB(GL_TEXTURE2_ARB,
0.0,
0.0);
glVertex3f(
2.0,
1.5,
0.0);
glMultiTexCoord2fARB(GL_TEXTURE2_ARB,
0.0,
1.0);
glVertex3f(
2.0,
3.5,
0.0);
glMultiTexCoord2fARB(GL_TEXTURE2_ARB,
1.0,
1.0);
glVertex3f(
4.0,
3.5,
0.0);
glMultiTexCoord2fARB(GL_TEXTURE2_ARB,
1.0,
0.0);
glVertex3f(
4.0,
1.5,
0.0);
glEnd();
glDisable(GL_TEXTURE_2D);
//同上,绘制正方形,使用号和号纹理
glActiveTextureARB(GL_TEXTURE0_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,Tname0);
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
glActiveTextureARB(GL_TEXTURE1_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,Tname1);
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
glBegin(GL_QUADS);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,
0.0,
0.0);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,
0.0,
0.0);
glVertex3f(-
2.5,-
1.0,
0.0);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,
0.0,
1.0);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,
0.0,
1.0);
glVertex3f(-
2.5,
1.0,
0.0);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,
1.0,
1.0);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,
1.0,
1.0);
glVertex3f(-
0.5,
1.0,
0.0);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,
1.0,
0.0);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,
1.0,
0.0);
glVertex3f(-
0.5,-
1.0,
0.0);
glEnd();
//反激活纹理,防止干扰
glActiveTextureARB(GL_TEXTURE0_ARB);
glDisable(GL_TEXTURE_2D);
glActiveTextureARB(GL_TEXTURE1_ARB);
glDisable(GL_TEXTURE_2D);
//同上,绘制正方形,使用号和号纹理
glActiveTextureARB(GL_TEXTURE1_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,Tname1);
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
glActiveTextureARB(GL_TEXTURE2_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,Tname2);
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
glBegin(GL_QUADS);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,
0.0,
0.0);
glMultiTexCoord2fARB(GL_TEXTURE2_ARB,
0.0,
0.0);
glVertex3f(
0.5,-
1.0,
0.0);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,
0.0,
1.0);
glMultiTexCoord2fARB(GL_TEXTURE2_ARB,
0.0,
1.0);
glVertex3f(
0.5,
1.0,
0.0);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,
1.0,
1.0);
glMultiTexCoord2fARB(GL_TEXTURE2_ARB,
1.0,
1.0);
glVertex3f(
2.5,
1.0,
0.0);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,
1.0,
0.0);
glMultiTexCoord2fARB(GL_TEXTURE2_ARB,
1.0,
0.0);
glVertex3f(
2.5,-
1.0,
0.0);
glEnd();
glActiveTextureARB(GL_TEXTURE1_ARB);
glDisable(GL_TEXTURE_2D);
glActiveTextureARB(GL_TEXTURE2_ARB);
glDisable(GL_TEXTURE_2D);
//绘制正方形,使用号、号和号纹理
glActiveTextureARB(GL_TEXTURE0_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,Tname0);
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
glActiveTextureARB(GL_TEXTURE1_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,Tname1);
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
glActiveTextureARB(GL_TEXTURE2_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,Tname2);
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
glBegin(GL_QUADS);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,
0.0,
0.0);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,
0.0,
0.0);
glMultiTexCoord2fARB(GL_TEXTURE2_ARB,
0.0,
0.0);
glVertex3f(-
1.0,-
3.5,
0.0);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,
0.0,
1.0);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,
0.0,
1.0);
glMultiTexCoord2fARB(GL_TEXTURE2_ARB,
0.0,
1.0);
glVertex3f(-
1.0,-
1.5,
0.0);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,
1.0,
1.0);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,
1.0,
1.0);
glMultiTexCoord2fARB(GL_TEXTURE2_ARB,
1.0,
1.0);
glVertex3f(
1.0,-
1.5,
0.0);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,
1.0,
0.0);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,
1.0,
0.0);
glMultiTexCoord2fARB(GL_TEXTURE2_ARB,
1.0,
0.0);
glVertex3f(
1.0,-
3.5,
0.0);
glEnd();
glActiveTextureARB(GL_TEXTURE0_ARB);
}glDisable(GL_TEXTURE_2D);
glActiveTextureARB(GL_TEXTURE1_ARB);
glDisable(GL_TEXTURE_2D);
glActiveTextureARB(GL_TEXTURE2_ARB);
glDisable(GL_TEXTURE_2D);
glFlush();
voidreshape(intw,inth){}
voidpressKey(intkey,intx,inty){}switch(key){caseGLUT_KEY_RIGHT:
}X+=1;
glutPostRedisplay();
break;
X-=1;
glutPostRedisplay();
break;
Y+=1;
glutPostRedisplay();
break;
Y-=1;
glutPostRedisplay();
break;
break;
glViewport(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(
60.0,(GLfloat)w/(GLfloat)h,
1.0,
30.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt((GLfloat)X,(GLfloat)Y,(GLfloat)Z,
0.0,
0.0,
0.0,
0.0,
1.0,
0.0);//视图变换caseGLUT_KEY_LEFT:
caseGLUT_KEY_UP:
caseGLUT_KEY_DOWN:
default:
intmain(intargc,char**argv){}glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);
glutInitWindowSize(250,250);
glutInitWindowPosition(100,100);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutSpecialFunc(pressKey);
glutMainLoop();
return0;
【程序截图】
【说明】
对于Windows平台下,需要包含glext.h头文件。
方向键为控制投影参考点的位置。
第一行三个正方形分别是只贴一层纹理的效果。
第二行两个正方形分别是贴上面两种纹理的效果。
第三行两个正方形是贴上三种纹理的效果。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OpenGL 纹理 贴图 简单 例子