下面开始介绍一下OpenGL中的纹理贴图,具体分以下三步:
2.将载入的位图转为纹理:
3.将纹理贴图应用到场景中:
以上三步便完成了纹理贴图,具体原理与细节以后补上。
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); //开启深度测试
}
以上三步便完成了纹理贴图,具体原理与细节以后补上。