您的位置:首页 > 运维架构

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

2012-12-11 18:53 489 查看
下面开始介绍一下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);	//开启深度测试
}


以上三步便完成了纹理贴图,具体原理与细节以后补上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: