1、 今天终于把png格式的图片进行透明纹理贴图给搞定了。读取png格式图片用的是FreeImage这个GUI,这段代码同样可以读其他格式的图片,代码如下:
FREE_IMAGE_FORMATfifmt = FreeImage_GetFileType("E:/VV-Ocean/texture/clouds_20070202-0240.png",0);
FIBITMAP*dib = FreeImage_Load(fifmt,"E:/VV-Ocean/texture/clouds_20070202-0240.png", 0);
BYTE *bits = newBYTE[FreeImage_GetWidth(dib)*FreeImage_GetHeight(dib)*4];
BYTE *pixels = (BYTE*)FreeImage_GetBits(dib);
BYTEt_r,t_g,t_b,t_a;
for(intpix=0; pix<FreeImage_GetWidth(dib)*FreeImage_GetHeight(dib); pix++)
{
t_r = bits[pix*4+0] =pixels[pix*4+2];
t_g = bits[pix*4+1] =pixels[pix*4+1];
t_b = bits[pix*4+2] =pixels[pix*4+0];
t_a = bits[pix*4+3] =pixels[pix*4+3];
}
glGenTextures(1,&texture); //generate texture object
glBindTexture(GL_TEXTURE_2D, texture); // enable ourtexture object
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR);
// generate thetexture image
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,FreeImage_GetWidth(dib),
FreeImage_GetHeight(dib), 0, GL_RGBA,GL_UNSIGNED_BYTE, bits);
FreeImage_Unload(dib);
deletebits;
(1) 进行透明贴图的时候,要开混色(Blend);
(2) glTexImage2D 和 gluBuild2DMipmaps这两个函数,后者是经过GPU优化的,效率高,程序会根据视点离物体远的时候它会用比较粗糙的纹理,当视点离物体近的时候它会按照纹理过滤方法选用精细的图像,原理是Mipmaps,比如说你用一张256*256的图像当纹理,用第二个函数的话它会为这张图建立层次信息256*256(最清晰)、128*128、64*64、32*32、...通过纹理过滤会选择一个合适的像素尺寸。
使用glTexImage2D()时所采用的位图文件分辨率必须为:64×64、128×128、256×256三种格式,如果其他大小则会出现绘制不正常。而gluBuild2DMipmaps()支持任意分辨率位图文件
(3) 当一个物体已经有个纹理的时候,再去贴另外一个纹理的时候,要打开blend,或者用多重纹理。