[OpenGL]图形学之旅:纹理贴图三部曲

下面开始介绍一下OpenGL中的纹理贴图,具体分以下三步:


0.声明存储贴图的相关数据:

#define MAXTEXTURE 1                

GLuint texture[MAXTEXTURE];	            //定义纹理数组,用于存放后面得到的图像纹理信息


1.引入bmp位图:

AUX_RGBImageRec *LoadImage(char *Filename)	         //载入位图数据						
{
	FILE *File = NULL;												
	if (!Filename)													
	{
		return NULL;												
	}
	File = fopen(Filename,"r");										
	if (File)														
	{
		fclose(File);												
		return auxDIBImageLoad(Filename);							
	}
	return NULL;			
}

2.将载入的位图转为纹理:

BOOL LoadTextureGL(void)	          //将载入的位图转化为纹理											
{
	BOOL State = false;												
	
	AUX_RGBImageRec *TextureImage[MAXTEXTURE];	  //创建纹理的存储空间			
	
	memset(TextureImage, 0, sizeof(void *) * MAXTEXTURE);	  //清除纹理存储空间中的图像信息为空			
	
	// 加载图片并检查是否出错 ,如果图片不存在则返回	
	if (TextureImage[0]=LoadImage("Data/sky.bmp"))
	{   
		State=true;													
		glGenTextures(MAXTEXTURE, &texture[0]);	  //将载入的图像转化成纹理,保存到texture数组中					
		
		// 用图片数据产生纹理
		for (int i=0; i<MAXTEXTURE; ++i)					
		{
			
			glBindTexture(GL_TEXTURE_2D, texture[i]);// 使用来自位图数据生成的典型纹理
			// 生成纹理 
			gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[i]->sizeX, TextureImage[i]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[i]->data);
			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);	//当纹理放大得原始的纹理大 ( GL_TEXTURE_MAG_FILTER )或缩小得比原始得纹理小( GL_TEXTURE_MIN_FILTER )时采用线性滤波方式
			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);	
		}
	}
	
	for (int i=0; i<MAXTEXTURE; ++i)          //释放用来存储位图信息的内存
	{
		if (TextureImage[i])										
		{
			if (TextureImage[i]->data)							
			{
				free(TextureImage[i]->data);						
			}
			free(TextureImage[i]);								
		}
	}
	return State;													
}

3.将纹理贴图应用到场景中:

void GameScene::DrawSky()
{
	glEnable(GL_TEXTURE_2D);	// 启用纹理映射
	glEnable(GL_DEPTH_TEST);	//开启深度测试
	glDisable(GL_BLEND);		// 关闭混合
	LoadTextureGL();
	glBindTexture(GL_TEXTURE_2D,texture[0]);	//绑定纹理在下面绘制的物体上
	glBegin(GL_QUADS);

        //左边是原图的坐标,原图必须是2的整数倍,最小64*64,还有128*128,最大不要256*256,会非常的卡。
        //右边是绘制的图形的坐标
        glTexCoord2f(0.0f,0.0f);glVertex3f(0.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,0.0f);
	glTexCoord2f(0.0f,1.0f);glVertex3f(0.0f,1.0f,0.0f);
	glEnd();
	glDisable(GL_TEXTURE_2D); // 启用纹理映射
	glDisable(GL_DEPTH_TEST);	//开启深度测试
}

以上三步便完成了纹理贴图,具体原理与细节以后补上。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值