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,或者用多重纹理。
下载了上述网址中的源文件,在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,或者用多重纹理。
相关文章推荐
- opengl读取24位BMP文件为纹理并处理黑色背景为透明
- 利用opencv读取图片将其作为opengl的纹理图片的实现方法
- 利用opencv读取图片将其作为opengl的纹理图片的实现方法
- 利用opencv读取图片将其作为opengl的纹理图片的实现方法
- 利用opencv读取图片将其作为opengl的纹理图片的实现方法
- 如何在OpenGl实现透明纹理贴图?(转)
- 在D3D中实现纹理的关键色透明
- OpenGL 4.0 GLSL 实现 投影纹理映射(Projective Texture Mapping)
- windows下利用gdi+读取图片并转换成opengl纹理支持的像素格式
- OpenGL In C# 02 使用FBO的方式绘制OpenGL窗体 并在XP下实现全透明
- OpenGL3D图形、旋转、纹理、键盘移动、光照、滤波、透明(完整) 转自http://www.cnblogs.com/tiandsp/archive/2012/01/23/2329049.html
- 用OpenGL实现纹理自动生长(蒋立华,秦雪,刘晓东,刘归荣)
- 关于OpenGL透明纹理渲染出来效果不正确的问题
- OpenGL之C++实现读取txt文件并显示
- Android OpenGL 纹理绘制图像---Native实现
- 用OpenGL实现纹理自动生长(蒋立华,秦雪,刘晓东,刘归荣)
- OpenGL程序二:实现纹理映射到3D立方体上
- openGL三维网格坐标,旋转,缩放,灯光设置,纹理读取,模型读取(MFC单文档)
- 【OpenGL】(NeHe教程学习)纹理映射及代码实现
- OpenGL 4.0 GLSL 实现 投影纹理映射(Projective Texture Mapping) (转)