#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();
}
#define imageWidth 4
#define imageHeight 4
GLubyte 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方向用于表示坐标的浮点数数目间隔
GLint uorder:
3 u方向的控制点数目
GLfloat v1:
0 常规设置
GLfloat v2:
1 常规设置
GLint vstride:
9 v方向上,有2组控制点,2组控制点之间相隔 ustride*uorder = 3*3
GLint vorder:
2 v方向的控制点组数目
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:
20 u方向的分割次数为20次
GLfloat u1:
GLfloat u2:
0
1 分割范围从0-1
GLint vn:
20 v方向的分割次数为20次
GLfloat v1:
GLfloat v2:
0
1 分割范围从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;
}
曲面重复纹理填充
最新推荐文章于 2023-01-04 10:30:00 发布