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

转载 2009年08月18日 22:20:00

 

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

玻璃渣资源里标准的2n次方人物纹理,图像挤的满满的,每个身体部位纹理还是一个矩形,利用率之高不得不令人佩服,然而这对美工要求是极高的.
1024*768的图像是要拆成4*3的256*256图像的,而不是一整大张纹理,因为768不是2的n次方,更不要扩大为1024*1024,加大25%的内存.
还有Wow里Loading界面的图像都压成512*512,因为Loading图像模糊一点不要紧,很简单却都是很重要的细节.
所以当Wow运行在我Geforce2的显卡上时,我觉的很cool.

Nvidia的驱动程序也很讨厌,实际Geforce6显卡才支持non power of two texture,Geforce 5200级的显卡,在硬件能力上不足以支持NPOT,但是最新的驱动程序使用了软件模式进行模拟支持,而软件模拟根本毫无实用价值,渲染变得超级缓慢,因为驱动程序每次纹理渲染都会很聪明地把非2次方尺寸图像自动Scale到2次方尺寸,对于一个800*600的图像,驱动程序在这个步骤就吃光了CPU.
所以总有些人喊着为什么OpenGL没有软件渲染支持,DX很体贴都有(实际上DX也没有,比如那个所谓的8层纹理),而我认为如果软件渲染能解决问题,那要硬件作什么!不能解决问题的方案我们支持它作什么!

// OpenGL动态执行2n次方图像限制
inline int next_p2(int a)
{
 int rval=1;
 while(rval<a) rval<<=1;
 return rval;
}

int nWidthPowerOfTwo = next_p2(tex.nWidth);
int nHeightPowerOfTwo = next_p2(tex.nHeight);

if(tex.nWidth == nWidthPowerOfTwo  &&  tex.nHeight == nHeightPowerOfTwo)

 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, nWidthPowerOfTwo, nHeightPowerOfTwo, 0, ilGetInteger(IL_IMAGE_FORMAT), GL_UNSIGNED_BYTE, ilGetData());
 tex.fScaleX = tex.fScaleY = 1.0f;

else

 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, nWidthPowerOfTwo, nHeightPowerOfTwo, 0, ilGetInteger(IL_IMAGE_FORMAT), GL_UNSIGNED_BYTE, NULL);
 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, tex.nWidth, tex.nHeight, ilGetInteger(IL_IMAGE_FORMAT), GL_UNSIGNED_BYTE, ilGetData());
 tex.fScaleX = (float)tex.nWidth / (float)nWidthPowerOfTwo;
 tex.fScaleY = (float)tex.nHeight/ (float)nHeightPowerOfTwo;
}

然而对这个问题,正确的解决方案是事先规划,强制执行,be clever.

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

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

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

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

2的幂次方表示答案及注释(NOIP)

2的幂次方表示 总时间限制: 1000ms 内存限制: 65536kB 描述 任何一个正整数都可以用2的幂次方表示。例如: 137=27+23+20 同时约定方次...
  • lydia_ke
  • lydia_ke
  • 2017年11月30日 17:37
  • 81

【OpenGL ES 2.0】如何显示出非2的N次幂的贴图。(NPOT)

在绑定纹理后,添加下面四行代码 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(...
  • mvplinchen888
  • mvplinchen888
  • 2013年11月25日 16:36
  • 1099

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

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

求一个数是否是另一个数的n次方幂、一个数是否是2的n次方幂

package math.calculate; import java.util.Scanner; public class testBitOperation { private static...
  • superit401
  • superit401
  • 2017年10月16日 16:13
  • 229

c++求幂次方

比如说求x的y次方 while(y!=0){ if(k%2==1){ ans = (ans*m)%MOD; k--; } k /= 2;
  • muyuxiaozi
  • muyuxiaozi
  • 2014年09月22日 21:05
  • 1498

flash-connect模块

flash是一个connect-flash中的模块在session中特定的存储区域。 1、先安装 package.json 文件中connect-flash:“*” 2、导入flash模块 ...
  • qq_26746521
  • qq_26746521
  • 2016年10月03日 22:13
  • 219

NOIP2006数列(sequence)

数列(sequence.pas/c/cpp)【问题描述】给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是:1,3,4,...
  • wxf1995
  • wxf1995
  • 2010年10月13日 12:22
  • 3889

一元n次多项式的处理

题目描述:一元n次多项式的处理 问题描述:符号处理是一类非数值性问题,一元多项式就是符号处理的一类实例。一个一元n次多项式的一般形式如下: Pn(x)=p1xe1+p2xe2+…各+pmxem 其中...
  • BanRuo_Cheng
  • BanRuo_Cheng
  • 2017年05月01日 20:40
  • 245
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用非2次方幂的图像纹理的问题
举报原因:
原因补充:

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