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

本文介绍了如何使用FreeImage库在OpenGL环境中读取和处理PNG透明纹理。通过FreeImage加载位图,转换像素数据,并使用OpenGL创建纹理对象。同时,文章提到了开启GL_BLEND进行透明混合,以及glTexImage2D和gluBuild2DMipmaps的使用区别和优化效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 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,或者用多重纹理。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值