使用纹理贴图的步骤

纹理贴图的步骤

1.创建纹理对象,并为它指定一个纹理

2.确定纹理如何应用到每个像素上

3.启用纹理贴图功能

4.绘制场景,提供纹理坐标和几何图形坐标


实例:(经过纹理贴图的棋盘)

[cpp] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. #include <GL/glut.h>  
  2. #include <stdlib.h>  
  3. #include <stdio.h>  
  4.   
  5. /*  Create checkerboard texture */  
  6. #define checkImageWidth 64  
  7. #define checkImageHeight 64  
  8. static GLubyte checkImage[checkImageHeight][checkImageWidth][4];  
  9.   
  10. #ifdef GL_VERSION_1_1  
  11. static GLuint texName;  
  12. #endif  
  13.   
  14. void makeCheckImage(void)//生成棋盘纹理  
  15. {  
  16.    int i, j, c;  
  17.       
  18.    for (i = 0; i < checkImageHeight; i++) {  
  19.       for (j = 0; j < checkImageWidth; j++) {  
  20.          c = ((((i&0x8)==0)^((j&0x8))==0))*255;  
  21.          checkImage[i][j][0] = (GLubyte) c;  
  22.          checkImage[i][j][1] = (GLubyte) c;  
  23.          checkImage[i][j][2] = (GLubyte) c;  
  24.          checkImage[i][j][3] = (GLubyte) 255;  
  25.       }  
  26.    }  
  27. }  
  28.   
  29. void init(void)  
  30. {      
  31.    glClearColor (0.0, 0.0, 0.0, 0.0);  
  32.    glShadeModel(GL_FLAT);  
  33.    glEnable(GL_DEPTH_TEST);  
  34.   
  35.    makeCheckImage();  
  36.    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);  
  37.   
  38. #ifdef GL_VERSION_1_1  
  39.    glGenTextures(1, &texName);//命名纹理图像(第一步)  
  40.    glBindTexture(GL_TEXTURE_2D, texName);//创建纹理对象(第一步)  
  41. #endif  
  42.   
  43.    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);//指定这个纹理对象的包装形式,并指定纹理的颜色应该如何进行过滤(第一步)  
  44.    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);  
  45.    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);  
  46.    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);  
  47. #ifdef GL_VERSION_1_1  
  48.    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, checkImageWidth, checkImageHeight,0, GL_RGBA, GL_UNSIGNED_BYTE, checkImage);  //指定一个纹理 (第一步)  
  49. #else  
  50.    glTexImage2D(GL_TEXTURE_2D, 0, 4, checkImageWidth, checkImageHeight,   
  51.                 0, GL_RGBA, GL_UNSIGNED_BYTE, checkImage);  
  52. #endif  
  53. }  
  54.   
  55. void display(void)  
  56. {  
  57.    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  
  58.    glEnable(GL_TEXTURE_2D);   //启用纹理功能(第三步)  
  59.    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);//设置绘图模式(第二步)  
  60. #ifdef GL_VERSION_1_1  
  61.    glBindTexture(GL_TEXTURE_2D, texName);  
  62. #endif  
  63.   
  64.    glBegin(GL_QUADS);  
  65.    glTexCoord2f(0.0, 0.0);                //设置当前纹理坐标(第四步)  
  66.    glVertex3f(-2.0, -1.0, 0.0);  
  67.    glTexCoord2f(0.0, 1.0); glVertex3f(-2.0, 1.0, 0.0);  
  68.    glTexCoord2f(1.0, 1.0); glVertex3f(0.0, 1.0, 0.0);  
  69.    glTexCoord2f(1.0, 0.0); glVertex3f(0.0, -1.0, 0.0);  
  70.   
  71.    glTexCoord2f(0.0, 0.0); glVertex3f(1.0, -1.0, 0.0);  
  72.    glTexCoord2f(0.0, 1.0); glVertex3f(1.0, 1.0, 0.0);  
  73.    glTexCoord2f(1.0, 1.0); glVertex3f(2.41421, 1.0, -1.41421);  
  74.    glTexCoord2f(1.0, 0.0); glVertex3f(2.41421, -1.0, -1.41421);  
  75.    glEnd();  
  76.    glFlush();  
  77.    glDisable(GL_TEXTURE_2D);  
  78. }  
  79.   
  80. void reshape(int w, int h)  
  81. {  
  82.    glViewport(0, 0, (GLsizei) w, (GLsizei) h);  
  83.    glMatrixMode(GL_PROJECTION);  
  84.    glLoadIdentity();  
  85.    gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 30.0);  
  86.    glMatrixMode(GL_MODELVIEW);  
  87.    glLoadIdentity();  
  88.    glTranslatef(0.0, 0.0, -3.6);  
  89. }  
  90.   
  91. void keyboard (unsigned char key, int x, int y)  
  92. {  
  93.    switch (key) {  
  94.       case 27:  
  95.          exit(0);  
  96.          break;  
  97.       default:  
  98.          break;  
  99.    }  
  100. }  
  101.   
  102. int main(int argc, char** argv)  
  103. {  
  104.    glutInit(&argc, argv);  
  105.    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);  
  106.    glutInitWindowSize(250, 250);  
  107.    glutInitWindowPosition(100, 100);  
  108.    glutCreateWindow(argv[0]);  
  109.    init();  
  110.    glutDisplayFunc(display);  
  111.    glutReshapeFunc(reshape);  
  112.    glutKeyboardFunc(keyboard);  
  113.    glutMainLoop();  
  114.    return 0;   
  115. }  
  116.   

【函数注释】
1、 glPixelStorei(GL_UNPACK_ALIGNMENT,1);
         对齐像素字节函数 控制的是所读取数据的对齐方式,默认4字节对齐,即一行的图像数据字节数必须是4的整数倍,即读取数据时,读取4个字            节用来渲染一行,之后读取4字节数据用来渲染第二行。对RGB 3字节像素而言,若一行10个像素,即30个字节,在4字节对齐模式下,                       OpenGL会读取32个字节的数据,若不加注意,会导致glTextImage中致函数的读取越界,从而全面崩溃。
2、 glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,XX);
      指定纹理贴图和材质混合的方式,从而产生特定的绘制效果。(XX为混合方式参数,OpenGL默认为GL_REPLACE,即只使用纹理.)
      
加载一圆柱体模型(带纹理贴图,材质为全红):
  
 
----------------------------------------------------------------------
(1)XX为GL_REPLACE模式

(2)XX为GL_BLEND模式

(3)XX为GL_DECAL模式

(4)XX为GL_MODULATE模式

(5)XX为GL_ADD模式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值