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; }
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; }
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); //开启深度测试 }