收藏 分销(赏)

OpenGL纹理贴图简单例子.docx

上传人:xrp****65 文档编号:7597222 上传时间:2025-01-10 格式:DOCX 页数:9 大小:104.29KB 下载积分:10 金币
下载 相关 举报
OpenGL纹理贴图简单例子.docx_第1页
第1页 / 共9页
OpenGL纹理贴图简单例子.docx_第2页
第2页 / 共9页


点击查看更多>>
资源描述
【代码】 #include <windows.h> #include <GL/glut.h> #include <GL/glext.h> static double X = 0; static double Y = 0; static double Z = 7; // 定义函数指针,在Windows环境下使用OpenGL扩展 PFNGLACTIVETEXTUREARBPROC glActiveTextureARB = NULL; PFNGLMULTITEXCOORD2FARBPROC glMultiTexCoord2fARB = NULL; // 纹理存储数组 static GLubyte T0[64][64][4]; static GLubyte T1[64][64][4]; static GLubyte T2[64][64][4]; // 纹理名字 static GLuint Tname0; static GLuint Tname1; static GLuint Tname2; // 创建纹理 void makeImages() { int i, j, c; // 第一个纹理,渐变绿色,*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; } } // 第二个纹理,黑白相间横条,*64 for (i = 0; i < 64; i++) { for (j = 0; j < 64; j++) { if (i % 16 < 8) c = 255; else c = 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; else c = 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; } } } void init() { // 获取函数地址 glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)wglGetProcAddress("glActiveTextureARB"); glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC)wglGetProcAddress("glMultiTexCoord2fARB"); // 场景初始化 glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel(GL_FLAT); glEnable(GL_DEPTH_TEST); makeImages(); // 纹理初始化 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // 对其像素字节 glGenTextures(1, &Tname0); // 获取纹理名字 glGenTextures(1, &Tname1); // 获取纹理名字 glGenTextures(1, &Tname2); // 获取纹理名字 // 初始化纹理 glBindTexture(GL_TEXTURE_2D, Tname0); // 生成指定名字的纹理对象 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 64, 64, 0, GL_RGBA, GL_UNSIGNED_BYTE, T0); // 设置纹理对象内容 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); } void display() { 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); // 视图变换 // 激活纹理对象 glActiveTextureARB (GL_TEXTURE0_ARB); // 选中号纹理 glEnable(GL_TEXTURE_2D); // 使纹理可用 glBindTexture(GL_TEXTURE_2D, Tname0); // 激活纹理 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); // 设置纹理贴图方式 // 绘制正方形 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); 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(); } void reshape(int w, int h) { 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); // 视图变换 } void pressKey(int key, int x, int y) { switch(key) { case GLUT_KEY_RIGHT: X += 1; glutPostRedisplay(); break; case GLUT_KEY_LEFT: X -= 1; glutPostRedisplay(); break; case GLUT_KEY_UP: Y += 1; glutPostRedisplay(); break; case GLUT_KEY_DOWN: Y -= 1; glutPostRedisplay(); break; default: break; } } int main(int argc, 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(); return 0; } 【程序截图】 【说明】 对于Windows平台下,需要包含glext.h头文件。 方向键为控制投影参考点的位置。 第一行三个正方形分别是只贴一层纹理的效果。 第二行两个正方形分别是贴上面两种纹理的效果。 第三行两个正方形是贴上三种纹理的效果。
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 应用文书 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服