#include <GL/glut.h>#include <stdlib.h>#include <math.h>GLfloat ctrlpoints[2][3][3] = {{{-1.5,0,0.0},{0,1,0.0},{3,0,0.0}},{{-1.5,-2,0.0},{0,-3,0.0},{3,-2,0.0}}};GLfloat texpts[2][2][2] = {{{0.0, 0.0}, {0.0, 20.0}}, {{20.0, 0.0}, {20.0, 20.0}}};void display(void){ int i,j; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(255.0, 255.0, 255.0); // 绘制控制点 glPointSize(5.0f); glBegin(GL_POINTS); for ( i = 0;i < 2;i++) { for ( j = 0;j < 3;j++) {glVertex3f(ctrlpoints[i][j][0],ctrlpoints[i][j][1],ctrlpoints[i][j][2]); } } glEnd();/*glEvalMesh2详解glEvalMesh2 (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);GLenum mode:GL_POINT 点 GL_LINE 线 GL_FILL 由纹理或颜色填充GLint i1, GLint i2, GLint j1, GLint j2由glMapGrid2f分割大小决定*/ glEvalMesh2(GL_FILL, 0, 20, 0, 20); glFlush();}#defineimageWidth 4#defineimageHeight 4GLubyte image[3*imageWidth*imageHeight];void makeImage(void){int i;for ( i = 0; i < imageWidth*imageHeight/2;i++){image[i*3+0] = 255;image[i*3+1] = 255;image[i*3+2] = 255;}for ( i = imageWidth*imageHeight/2; i < imageWidth*imageHeight;i++){image[i*3+0] = 255;image[i*3+1] = 0;image[i*3+2] = 0;}}void init(void){/*glMap2f详解glMap2f (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);GLenum target:GL_MAP2_VERTEX_3 生成顶点坐标GL_MAP2_TEXTURE_COORD_2 生成纹理作弊GLfloat u1:0常规设置GLfloat u2:1常规设置GLfloat ustride:3 u方向用于表示坐标的浮点数数目间隔GLintuorder:3u方向的控制点数目GLfloat v1:0常规设置GLfloat v2:1常规设置GLint vstride:9v方向上,有2组控制点,2组控制点之间相隔 ustride*uorder = 3*3GLint vorder:2v方向的控制点组数目const GLfloat *points:ctrlpoints控制点坐标指针*/ glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 3, 0, 1, 9, 2, &ctrlpoints[0][0][0]); glMap2f(GL_MAP2_TEXTURE_COORD_2, 0, 1, 2, 2, 0, 1, 4, 2, &texpts[0][0][0]); glEnable(GL_MAP2_TEXTURE_COORD_2); glEnable(GL_MAP2_VERTEX_3);/*glMapGrid2f 详解glMapGrid2f (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);GLint un:20u方向的分割次数为20次GLfloat u1:GLfloat u2:01分割范围从0-1GLint vn:20v方向的分割次数为20次GLfloat v1:GLfloat v2:01分割范围从0-1*/ glMapGrid2f(20, 0.0, 1.0, 20, 0.0, 1.0); makeImage(); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);/*glTexParameteri参数3 GLint param == GL_REPEAT重复纹理,重复纹理次数由texpts纹理坐标的放大系数所决定,纹理坐标被归一化后坐标从0-1之间,这里被放大了20倍0-20,重复纹理次数20*/ 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_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, imageWidth, imageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, image); glEnable(GL_TEXTURE_2D); glEnable(GL_DEPTH_TEST); glShadeModel (GL_FLAT);}void reshape(int w, int h){ glViewport(0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0,w,0,h,-100,100); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(w/2,h/2,0); glScalef(50,50,50);}int main(int argc, char** argv){ glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize (500, 500); glutInitWindowPosition (100, 100); glutCreateWindow (argv[0]); init (); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); return 0;}