http://hi.baidu.com/pro_lily/blog/item/d3e513272b701b038a82a18b.html
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,或者用多重纹理。 |