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

原创 2007年09月24日 22:31:00

 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;

相关文章推荐

Non Power of Two Textures 无二次幂限制的纹理

无二次幂限制的纹理(Non-Power-of-Two Textures)   OpenGL仅支持分辨率为2mx2n的纹理。但现在我们可以使用“无二次幂限制”的纹理。   OpenGL only...
  • wolf96
  • wolf96
  • 2015年09月04日 14:40
  • 1635

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

OpenGL学习笔记6:高级纹理知识

矩形纹理纹理目标为GL_TEXTURE_RECTANGLE。 首选,矩形纹理不能进行Mip贴图; 然后,矩形纹理不是标准化的(实际上是对像素寻址) 最后,纹理坐标不能重复,并且不支持纹理压缩加载...
  • ylbs110
  • ylbs110
  • 2016年07月16日 20:03
  • 2320

OpenGL纹理尺寸限制

最近在Android平台下开发播放器,移植ffmpeg到android平台,在视频显示的时候,由于无法使用硬件特性(Video Overlap),从而使用swscale作resize,但测试发现速度太...

使用非2次方幂的图像纹理的问题

图像使用2次方是很讨厌的问题,不在技术难度上,而在技术妥协上.实际上要求美工作出2次方纹理,并且整张图的空间利用率要高,是很难的. 当有些策划丢过来奇奇怪怪的尺寸的图像,我都要吐血,当知道2n次方限...

WebGL and OpenGL Differences - 非2的次幂纹理的那些讲究儿

WebGL and OpenGL Differences - 非2的次幂纹理的那些讲究儿
  • sleks
  • sleks
  • 2014年07月02日 06:59
  • 1430

Opengl贴纹理

  • 2017年03月24日 21:35
  • 17.83MB
  • 下载

opengl纹理贴图例子

  • 2009年05月07日 14:34
  • 929KB
  • 下载

Android OpenGL ES2 一切从绘制纹理开始

android openGL ES2 一切从绘制纹理开始

OpenGL超级宝典总结(二)2D/3D笛卡尔坐标、坐标裁剪、纹理坐标、MVP转换

在OpenGL中,如果
  • cbbbc
  • cbbbc
  • 2014年10月03日 00:28
  • 2242
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OpenGL 中贴长宽不为2的幂的纹理的方法(李传中)
举报原因:
原因补充:

(最多只允许输入30个字)