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;

OpenGL ES 纹理压缩之ETC (二)

前面介绍了OpenGL ES2.0 支持的压缩ETC1;下面我们来学习一下ETC2。从opengl es3.0 开始支持ETC2纹理压缩,而这种压缩可以支持透明通道。下面看如何使用加载pkm文件pub...
  • lmjssjj
  • lmjssjj
  • 2017年11月13日 16:40
  • 266

各种移动GPU压缩纹理的使用方法

介绍了各种移动设备所使用的GPU,以及各个GPU所支持的压缩纹理的格式和使用方法。 1. 移动GPU大全 目前移动市场的GPU主要有四大厂商系列: 1)Imagination Techn...
  • liaowenfeng
  • liaowenfeng
  • 2014年01月22日 10:03
  • 13672

OpenGL ES 纹理压缩之ETC (一)

纹理压缩之ETC首先来看看一张512像素X 512像素的图片占用的内存大小 512像素X 512像素的纹理图片所占用的内存大小为:512 X 512 X 4(一个像素4个字节) / 1024KB =...
  • lmjssjj
  • lmjssjj
  • 2017年11月13日 15:49
  • 243

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

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

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

 1,一幅120×120 的24 位位图,文件名为“木材.bmp”。由于它的宽度w 和高度均不为2 的幂,所以对于OpenGL2.0 以下版本,该图像不能直接用于纹理图像贴图,是非规则纹理图像。下面我...
  • Crazyjumper
  • Crazyjumper
  • 2007年09月24日 22:31
  • 3199

如何判断一个数是否为2的幂次方

最近在OJ上做题,遇到一道题,其中一个细节就是需要判断一个数是否为2的幂次方。初看似乎很简单,可我想来想去,竟然无甚好办法。最后我用一个笨办法解决了,那就是将2 4 8 16 32… …存到一个数组里...
  • RuiLees
  • RuiLees
  • 2017年04月05日 11:00
  • 610

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

1,一幅120×120 的24 位位图,文件名为“木材.bmp”。由于它的宽度w 和高度均不为2 的幂,所以对于OpenGL2.0 以下版本,该图像不能直接用于纹理图像贴图,是非规则纹理图像。下面我们...
  • doing5552
  • doing5552
  • 2008年04月22日 16:31
  • 864

opengl 不同面贴不同的纹理

参考:http://www.qiliang.net/old/nehe_qt/index.html 不同面纹理贴图在放在begin与end之间,类似下面,否则不生效.  glBindTexture( G...
  • notton
  • notton
  • 2011年05月07日 10:47
  • 850

opengl常见问题

1. 没有glDisable(GL_TEXTURE_2D),导致基本几何作图全部失败。 2. 镜头位置没调好,导致所有物体不可见. 3. 物体位置数据错误,导致物体大大超出镜头显示范围. 4. ...
  • dancing_night
  • dancing_night
  • 2016年03月30日 16:26
  • 1280

如何快速判断一个数是不是2的幂、3的幂、4的幂

1、判断是不是2的幂 将2的幂写成二进制很容易看出,2的幂的二进制只有一个1,其余全是0,如下所示: 000010000...00 而将2的幂的二进制减1,其二进制变为: 000001111...11...
  • x_i_y_u_e
  • x_i_y_u_e
  • 2016年01月12日 22:52
  • 4279
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OpenGL 中贴长宽不为2的幂的纹理的方法(李传中)
举报原因:
原因补充:

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