SETP1:读入位图文件
//读入位图文件
AUX_RGBImageRec *LoadBMP(char *Filename)
{
FILE *File=NULL;
if (!Filename)
{
return NULL;
}
File=fopen(Filename,"r");
if (File)
{
fclose(File);
return auxDIBImageLoad(Filename); // Load The Bitmap And Return A Pointer
}
return NULL;
}
AUX_RGBImageRec *TextureImage[1];//这个结构将持有图像的宽度, 高度和数据
TextureImage[0]=LoadBMP("Data/NeHe.bmp")// 载入位图
SETP 2: 产生所需数量的纹理名
glGenTextures(1, //需要产生纹理名的数目
&texture[0] ); //保存纹理名的数组
SETP 3:创建纹理
创建纹理这个步骤分为几个小步,对于每一个纹理来说它们必须作为原子操作一起调用,然后才能设置第二个纹理
1.创建纹理对象
glBindTexture(GL_TEXTURE_2D, texture[0]); //给texture data 分配name。
2. 指定一个二维纹理
glTexImage2D(GL_TEXTURE_2D,
0,//LOD级数
3,//指定纹素中存储哪些分量(R,G,B,A,深度,辉度或强度)
//这里只指定有关RGBA数据成分,1:选择R; 2:选择R A;3:选择R G B;4:选择R G B A;
TextureImage[0]->sizeX,
TextureImage[0]->sizeY,
0,//纹理边界
GL_RGB,//图像数据格式
GL_UNSIGNED_BYTE,//像素数据类型
TextureImage[0]->data);
3.设置过滤方式
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);// Linear Filtering
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);// Linear Filtering
SETP 4:使用纹理
glEnable(GL_TEXTURE_2D); // Enable Texture Mapping
当绑定后纹理对象可以用一个的无符号整数表示。
glBindTexture(GL_TEXTURE_2D, texture[0]); // Select Our Texture
glBegin() 和 glEnd()之间为每个顶点设置纹理坐标,glTexCoord
如果想变换纹理, 就需要绑定另一个纹理。 有一点很重要, 那就是绑定纹理操作不能在glBegin() 和 glEnd() 之间进行。