8.6.4编程实例-纹理映射

clip_image002

 

复制代码
  1 #include <GL/glut.h>
  2 
  3 #include <stdlib.h>
  4 
  5 #include <stdio.h>
  6 
  7 #define stripeImageWidth 32
  8 
  9 GLubyte stripeImage[4*stripeImageWidth];
 10 
 11 void makeStripeImage(void) //生成纹理
 12 
 13 { int j;
 14 
 15 for (j=0; j<stripeImageWidth; j++)
 16 
 17 { stripeImage[4*j+0] = (GLubyte) ((j<=4) ? 255 :0);
 18 
 19 stripeImage[4*j+1] = (GLubyte) ((j>4) ? 255 : 0);
 20 
 21 stripeImage[4*j+2] = (GLubyte) 0;
 22 
 23 stripeImage[4*j+3] = (GLubyte) 255;
 24 
 25 }
 26 
 27 }
 28 
 29 // 平面纹理坐标生成
 30 
 31 static GLfloat xequalzero[] = {1.0, 1.0, 1.0, 1.0};
 32 
 33 static GLfloat slanted[] = {1.0, 1.0, 1.0, 0.0};
 34 
 35 static GLfloat *currentCoeff;
 36 
 37 static GLenum currentPlane;
 38 
 39 static GLint currentGenMode;
 40 
 41 static float roangles;
 42 
 43 void init(void)
 44 
 45 { glClearColor (1.0, 1.0, 1.0, 1.0);
 46 
 47 glEnable(GL_DEPTH_TEST);
 48 
 49 glShadeModel(GL_SMOOTH);
 50 
 51 makeStripeImage();
 52 
 53 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
 54 
 55 glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT);
 56 
 57 glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 58 
 59 glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 60 
 61 glTexImage1D(GL_TEXTURE_1D, 0, 4, stripeImageWidth, 0,
 62 
 63 GL_RGBA, GL_UNSIGNED_BYTE, stripeImage);
 64 
 65 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
 66 
 67 currentCoeff = xequalzero;
 68 
 69 currentGenMode = GL_OBJECT_LINEAR;
 70 
 71 currentPlane = GL_OBJECT_PLANE;
 72 
 73 glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, currentGenMode);
 74 
 75 glTexGenfv(GL_S, currentPlane, currentCoeff);
 76 
 77 glEnable(GL_TEXTURE_GEN_S);
 78 
 79 glEnable(GL_TEXTURE_1D);
 80 
 81 glEnable(GL_LIGHTING);
 82 
 83 glEnable(GL_LIGHT0);
 84 
 85 glEnable(GL_AUTO_NORMAL);
 86 
 87 glEnable(GL_NORMALIZE);
 88 
 89 glFrontFace(GL_CW);
 90 
 91 glMaterialf (GL_FRONT, GL_SHININESS, 64.0);
 92 
 93 roangles=45.0f;
 94 
 95 }
 96 
 97 void display(void)
 98 
 99 { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
100 
101 glPushMatrix ();
102 
103 glRotatef(roangles,0.0,0.0,1.0);
104 
105 glutSolidSphere(2.0,32,32 );
106 
107 glPopMatrix ();
108 
109 glFlush();
110 
111 }
112 
113 void reshape(int w, int h)
114 
115 { glViewport(0, 0, (GLsizei) w, (GLsizei) h);
116 
117 glMatrixMode(GL_PROJECTION);
118 
119 glLoadIdentity();
120 
121 if (w <= h)
122 
123 glOrtho (-3.5, 3.5, -3.5*(GLfloat)h/(GLfloat)w,
124 
125 3.5*(GLfloat)h/(GLfloat)w, -3.5, 3.5);
126 
127 else
128 
129 glOrtho (-3.5*(GLfloat)w/(GLfloat)h,
130 
131 3.5*(GLfloat)w/(GLfloat)h, -3.5, 3.5, -3.5, 3.5);
132 
133 glMatrixMode(GL_MODELVIEW);
134 
135 glLoadIdentity();
136 
137 }
138 
139 void idle()
140 
141 { roangles += 0.05f;
142 
143 glutPostRedisplay();
144 
145 }
146 
147 int main(int argc, char** argv)
148 
149 {
150 
151 glutInit(&argc, argv);
152 
153 glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
154 
155 glutInitWindowSize(256, 256);
156 
157 glutInitWindowPosition(100, 100);
158 
159 glutCreateWindow (argv[0]);
160 
161 glutIdleFunc(idle);
162 
163 init ();
164 
165 glutDisplayFunc(display);
166 
167 glutReshapeFunc(reshape);
168 
169 glutMainLoop();
170 
171 return 0;
172 
173 }
复制代码

附上本实验的VC++工程代码(VC++2008)

posted on   慢步前行  阅读(1868)  评论(0编辑  收藏  举报

努力加载评论中...

导航

点击右上角即可分享
微信分享提示