曲面重复纹理填充

来源:互联网 发布:c51单片机题库及答案 编辑:程序博客网 时间:2024/05/03 02:54
#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;}

原创粉丝点击