现在的位置: 首页 > 综合 > 正文

OpenGL中的纹理映射

2018年01月16日 ⁄ 综合 ⁄ 共 3676字 ⁄ 字号 评论关闭
GLfloat xrot;//x y z的旋转量
GLfloat yrot;
GLfloat zrot;
GLuint texture[1];//存储一个纹理
AUX_RGBImageRec *LoadBMP(char *Filename){
FILE *file=NULL;
  if (!Filename)
  {
	  return NULL;
  }
file=fopen(Filename,"r");
if (file)
{
	fclose(file);
	return auxDIBImageLoad(Filename);//载入位图并返回指针
}
return NULL;
}

int LoadGLTextures()
{
	//状态指示器
	int Status=false;
	//创建纹理的存储空间
 AUX_RGBImageRec *TextureImage[1];

 //清楚图像记录,确保其内容为空
 memset(TextureImage,0,sizeof(void *)*1);

 // 载入位图,检查有无错误,如果位图没找到则退出
 	if (TextureImage[0]=LoadBMP("data/gougou.bmp"))
	{
			Status=TRUE;							// 将 Status 设为 TRUE
			glGenTextures(1, &texture[0]);					// 创建纹理			
			// 使用来自位图数据生成 的典型纹理		
			glBindTexture(GL_TEXTURE_2D, texture[0]);
			// 生成纹理
			glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
			glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);	// 线形滤波			
			glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);	// 线形滤波		
	}
	if (TextureImage[0])							// 纹理是否存在	
	{	
		if (TextureImage[0]->data)					// 纹理图像是否存在		
		{		
			free(TextureImage[0]->data);				// 释放纹理图像占用的内存		
		}	
		free(TextureImage[0]);						// 释放图像结构		
	}
	return Status;								// 返回 Status
}

在头文件GLAUX.H中有定义

typedef struct _AUX_RGBImageRec {
    GLint sizeX, sizeY;
    unsigned char *data;
} AUX_RGBImageRec;

文中自定义了一个函数LoadBMP(filename),返回一个AUX_RGBImageRec的指针,首先判断文件是否为空,能否正常打开,然后关闭文件,得到句柄
函数int LoadGLTextures()通过调用函数LoadBMP来载入位图,并转化为纹理。任然检查纹理是否存在,在刻画完纹理后清空释放所占内存

初始化中要启动相应的纹理刻画函数

int InitGL(GLvoid)
{
	if (!LoadGLTextures())							// 调用纹理载入子例程		
	{		
		return FALSE;							// 如果未能载入,返回FALSE		
	}
glEnable(GL_TEXTURE_2D);						// 启用纹理映射
 glShadeModel(GL_SMOOTH);//阴影平滑
 glClearColor(0.0f,0.0f,0.0f,0.0f); //黑色的背景
 glClearDepth(1.0f);
 glEnable(GL_DEPTH_TEST);		// 启用深度测试
  glDepthFunc(GL_LEQUAL);
  glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);// 告诉系统对透视进行修正
return true;
}

然后具体的画纹理

int DrawGLScene(GLvoid)								// 从这里开始进行所有的绘制
{	
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);			// 清除屏幕和深度缓存	
	glLoadIdentity();							// 重置当前的模型观察矩阵	
	glTranslatef(0.0f,0.0f,-5.0f);						// 移入屏幕 5 个单位
	glRotatef(xrot,1.0f,0.0f,0.0f);						// 绕X轴旋转
	glRotatef(yrot,0.0f,1.0f,0.0f);						// 绕Y轴旋转	
	glRotatef(zrot,0.0f,0.0f,1.0f);						// 绕Z轴旋转

    glBindTexture(GL_TEXTURE_2D, texture[0]);				// 选择纹理

	glBegin(GL_QUADS);
	
	// 前面
	glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);	// 纹理和四边形的左下
	glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);	// 纹理和四边形的右下
	glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);	// 纹理和四边形的右上	
	glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);	// 纹理和四边形的左上
	
	// 后面	
	glTexoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);	// 纹理和四边形的右下	
	glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);	// 纹理和四边形的右上	
	glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);	// 纹理和四边形的左上	
	glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);	// 纹理和四边形的左下
	
	// 顶面	
	glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);	// 纹理和四边形的左上	
	glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,  1.0f,  1.0f);	// 纹理和四边形的左下	
	glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,  1.0f,  1.0f);	// 纹理和四边形的右下	
	glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);	// 纹理和四边形的右上
	
	// 底面
	glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);	// 纹理和四边形的右上
	glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);	// 纹理和四边形的左上	
	glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);	// 纹理和四边形的左下	
	glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);	// 纹理和四边形的右下
	
	// 右面	
	glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);	// 纹理和四边形的右下	
	glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);	// 纹理和四边形的右上	
	glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);	// 纹理和四边形的左上	
	glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);	// 纹理和四边形的左下
	
	// 左面	
	glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);	// 纹理和四边形的左下	
	glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);	// 纹理和四边形的右下
	glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);	// 纹理和四边形的右上
	glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);	// 纹理和四边形的左上
	glEnd();

	xrot+=0.1f;								// X 轴旋转	
	yrot+=0.1f;								// Y 轴旋转	
	zrot+=0.1f;								// Z 轴旋转	
	return true;								// 继续运行	
}

刻画纹理就是调用上面的纹理,纹理就是图片,注意将图片的每个坐标与正方体的每个面的坐标相对应
其实与前面的区别就在于开始的纹理调用刻画的过程,在具体刻画的时候注意对应坐标的问题

抱歉!评论已关闭.