曲面重复纹理填充

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值