无尽的夜空,唯有月光撒满窗前

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  14 Posts :: 0 Stories :: 2 Comments :: 0 Trackbacks

常用链接

留言簿

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

http://hi.baidu.com/pro_lily/blog/item/d3e513272b701b038a82a18b.html

2011-02-18 21:34

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×64128×128256×256三种格式,如果其他大小则会出现绘制不正常。而gluBuild2DMipmaps()支持任意分辨率位图文件

(3) 当一个物体已经有个纹理的时候,再去贴另外一个纹理的时候,要打开blend,或者用多重纹理。

posted on 2012-01-11 13:43 skyline 阅读(1634) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理