OpenGL之纹理贴图(1):Basic

来源:互联网 发布:通联数据股份公司 ceo 编辑:程序博客网 时间:2024/06/02 08:04

:这里总结的是一些在OpenGL中做纹理贴图需要注意的问题,并不是完整的教你如何在OpenGL中使用纹理贴图,因为已经有很好的资料可供我们选择,比如<OpenGL Super Bible>,<OpenGL Programming Guide>.
在OpenGL API中,没有任何的装载图像文件获取象素信息的函数,但是在定义纹理的时候,这些象素信息又是必要的。
在很多的情况下,我们都需要自己编写装载图片文件获取象素信息的函数。下面是读取bmp文件,获取象素信息的代码:
//在此代码中,做了一定的简化,bmp图像是24b的真彩图像
char* LoadBMPff(const char* filename)
{

 ifstream fileStream;
 fileStream.open(filename,fstream::binary);//注意:打开模式必须指定fstream::binary,否则会出错 
 BITMAPFILEHEADER header;
 fileStream.read( (char*)&header, sizeof(BITMAPFILEHEADER) );
 BITMAPINFO info;
 fileStream.read( (char*)&info, header.bfOffBits-sizeof(BITMAPFILEHEADER) );
 
 int size=( (info.bmiHeader.biWidth*3+3)&~3 )*info.bmiHeader.biHeight;
 pixelData=new char[size];
 fileStream.read( pixelData, size );
 return pixelData;

}
调用以上函数成功的话,返回值就是指向象素信息的指针,这个指针可以作为glTexImage2D()函数的最后一个参数。

在使用bmp图像作为纹理图像的时候,特别注意由于bmp的色彩空间顺序是BGR,并不是常见的RGB,所以glTexImage2D()中的format参数的值应该是GL_BGR_EXT,而不是GL_RGB.

纹理图像的尺寸,(包括width和height,但这两个值可以不同),必须是2的n次幂的形式,尺寸的最大值和最小值都有一定的限制。最大值和具体的OpenGL实现有关,最小值是不小于64*64.

纹理坐标的问题。在Windows平台下,常见的坐标原点是一个区域的左上角,并且以水平方向向右,垂直方向向下为正方面,如图所示:
         (0,0.000000)----------------(width-1,0.0000000)
           |                                 |
           |                                 |
           |                                 |
           |                                 |
         (0,height-1)-----------------(width-1,height-1)
而纹理坐标是以左下角为坐标原点,并且以水平方向向右,垂直方向向上为正方向,如图所示:
         (0,1.000000)-----------------(1.00000,1.000000)
           |                                  |
           |                                  |
           |                                  |
           |                                  |
         (0,0.000000)-----------------(1.00000,0.000000)
一般情况下,纹理坐标的大小是在[0,1]这个范围内,但是并不能说纹理坐标不能超过这个范围。当纹理坐标超过这个范围时,在映射的过程中,会重复或者缩限映射,具体的可以参照glTexParameter() 函数。
在纹理映射的时候,不一定要将整个纹理映射,可以映射纹理的一部分,例如只映射纹理的上半部分,则纹理坐标可以设为:(0.0,0.5),(0.0,1.0),(1.0,1.0),(1.0,0.5)
在纹理形状和物体形状不一致时,为了使在映射的过程中不发生扭曲的现象,应该使映射纹理的形状和物体的形状成比例。例如一个正方向纹理映射到长方形物体上,若物体的坐标为:
   (0.0,0.0,d),(w,0.0,d),(w,h,d),(h,0.0,d),其中w/h=3/4;
则纹理坐标可设为:
   (0.0,0.0),(0.75,0.00),(0.75,1.0),(1.0,0.0);
-----暂时到这里了,以后有新的问题再修改.

-----------------------------致力于多媒体技术,成为有思想的软件工程师------------------------

此文章为我原创作品,若要转载,请和本人联系,或注明出处。
欢迎大家对文章内容提出宝贵意见,同时希望大家及时指出文中的错误之处,这样我可以及时更正。
我的联系方式:
QQ: 7578420
Email: jerrydong@tom.com

----------------------------------------------------------------------------------------

原创粉丝点击