关闭

OpenGL 中贴长宽不为2的幂的纹理的方法(李传中)

标签: bytedeleteimagec++extnull
2932人阅读 评论(0) 收藏 举报
分类:

 1,一幅120×120 的24 位位图,文件名为“木材.bmp”。由于它的宽度w 和高度均不为2 的幂,所以对于OpenGL2.0 以下版本,该图像不能直接用于纹理图像贴图,是非规则纹理图像。下面我们给出用C++ 语言实现这类图像纹理贴图的方法。


首先我们获取图像的宽度w 和高度h:
BITMAP BM;
HBITMAP hBmp=(HBITMAP)LoadImage (NULL," 木材.bmp",
IMAGE_BITMAP,0,0,LR_LOADFROMFILE |
LR_CREATEDIBSECTION);
GetObject(hBmp, s izeof(BM), &BM);
w=BM.bmWidth;
h=BM.bmHeight;
其次,为了提高图像的逼真度,我们寻找和w 和h 最接近的整数w1 和h1,而w1 和h1 均为2 的幂。
int m=(int)log((double)w)/log(2.0);
int h=(int)log((double)h)/log(2.0);
int w1=(int)pow(2.0,(double)w);
int h1=(int)pow(2.0,(double)h);


显然上述方法求出的w1 和h1 分别小于w 和h。对于上面的图片,求出w1 和h1 的值为64,这个值不是最好的结果,因为和120 最接近的2 的幂应该是128。为此,我们需要修正w1和h1 的值:
int w2=2*w1; if(w2-w<w-w1) w1=w2;
int h2=2*h1; if(h2-h<h-h1) h1=h2;

最后,用w1 和h1 放缩纹理图像。
GLubyte* pImage = new GLubyte [w*h*
(BM.bmWidthBytes /s izeof(GL_UNSIGNED_BYTE))];
gluScaleImage(GL_BGR_EXT, BM.bmWidth, BM.bmHeight,
GL_UNSIGNED_BYTE, BM.bmBits , w1, h1,
GL_UNSIGNED_BYTE, pImage);


对于新的纹理图像pImage, 我们就可以使用函数
glTexImage2D()指定为纹理图像。
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0,
GL_BGR_EXT, GL_UNSIGNED_BYTE, pImage);
delete []pImage;

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:225919次
    • 积分:2935
    • 等级:
    • 排名:第12486名
    • 原创:59篇
    • 转载:5篇
    • 译文:0篇
    • 评论:47条
    最新评论