您的位置:首页 > 运维架构

FreeImage读取纹理,在OpenGL中实现透明纹理

2011-07-22 14:05 417 查看
FreeImage 是一款免费的、开源的、跨平台(Windows 、Linux 和Mac OS X )的,支持20 多种图像类型的(如BMP 、JPEG 、GIF 、PNG 、TIFF 等)图像处理库。其最大优点就是采用插件驱动型架构,具有快速、灵活、简单易用的特点,得到了广泛使用。相关的源码、库文件及帮助文档可以从http://freeimage.sourceforge.net/ 免费下载使用。
下载了上述网址中的源文件,在64位环境下重新编译,注意用到的文件FreeImage.h FreeImaged.dll FreeImaged.lib
FreeImage 的主要功能有多格式位图的读写;方便的位图信息获取;位深度转换;位图页面访问;基本的几何变换和点处理;通道合并与混合等。FreeImage 暂时不支持矢量图形和高级图像处理,位图绘制需要由用户来完成。 FreeImage 中的所有函数都以FreeImage_ 开头,如图像文件的读写函数分别为FreeImage_Load 和FreeImage_Save 。FIBITMAP 数据结构保存着位图信息和像素数据,是FreeImage 的核心。
png透明纹理的实现,读取png格式图片用的是FreeImage这个GUI,这段代码同样可以读其他格式的图片,代码如下:
void load_png_texture(void){
FREE_IMAGE_FORMAT fifmt = FreeImage_GetFileType("H:/maobi256.png",0);
FIBITMAP*dib = FreeImage_Load(fifmt,"H:/maobi256.png", 0);
BYTE *bits = new BYTE[FreeImage_GetWidth(dib)*FreeImage_GetHeight(dib)*4];
BYTE *pixels = (BYTE*)FreeImage_GetBits(dib);
for(int pix=0; pix<FreeImage_GetWidth(dib)*FreeImage_GetHeight(dib); pix++)
{
bits[pix*4+0] =pixels[pix*4+2];
bits[pix*4+1] =pixels[pix*4+1];
bits[pix*4+2] =pixels[pix*4+0];
bits[pix*4+3] =pixels[pix*4+3];
}
glGenTextures(1,&textureMAOBI); //generate texture object
glBindTexture(GL_TEXTURE_2D, textureMAOBI); // 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 the texture image
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,FreeImage_GetWidth(dib),FreeImage_GetHeight(dib), 0, GL_RGBA,GL_UNSIGNED_BYTE, bits);
//gluBuild2DMipmaps(GL_TEXTURE_2D, 3, FreeImage_GetWidth(dib),FreeImage_GetHeight(dib), GL_RGB, GL_UNSIGNED_BYTE, bits);
FreeImage_Unload(dib);
delete bits;
}
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,textureMAOBI);
glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBegin(GL_POLYGON);
glTexCoord2f(0,0);
glVertex3f(emitterX+0.5-1.5f,emitterY+1-1.5f,0.0f);
glTexCoord2f(1,0);
glVertex3f( emitterX+0.5+1.5f,emitterY+1-1.5f,0.0f);
glTexCoord2f(1,1);
glVertex3f( emitterX+0.5+1.5f, emitterY+1+1.5f,0.0f);
glTexCoord2f(0,1);
glVertex3f(emitterX+0.5-1.5f, emitterY+1+1.5f,0.0f);
glEnd();
glDisable( GL_BLEND );
glDisable(GL_TEXTURE_2D);
(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,或者用多重纹理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: