我应该使用大小不为2的幂的纹理吗?


40

在OpenGL和DirectX的早期,纹理大小要求是2的幂。这意味着浮点值的内插可以非常快地使用移位等方法完成。

从OpenGL 2.0开始(以及之前的扩展,通过扩展),已支持非二次幂纹理尺寸。

二次幂纹理在现代集成和离散GPU上是否具有性能优势?非二次方纹理有什么优势?

是否有大量台式机拥有支持非二次幂纹理的卡?


Answers:


15

在现代集成和离散GPU上坚持“二次幂”纹理是否具有性能优势?

大多数现代GPU支持非两种(NPOT)纹理的幂并很好地处理它们。性能下降很少。但是没有什么要考虑的问题:

  • 使用NPOT纹理时,与下一个POT纹理一样,它会占用更多的RAM空间。从技术上讲,您只是浪费了可用于在其中放置东西的空间。

  • 与下一个尺寸的POT相比,NPOT纹理的处理速度可能明显慢(在OpenGL 2.1中,性能下降了30%);

  • 较早的GPU和板载/片上GPU并不那么先进,它们通常支持NPOT纹理,但支持速度很慢且笨拙。

  • 即使是较老的GPU也可能根本拒绝接受/显示NPOT纹理。

  • 可能会由于mip-map插值而产生边缘瑕疵,您的25x25纹理可能带有黑色条纹,并在其中添加了像素以将其填充为32x32大小。

PS我不确定移动设备,关于POT纹理可能还有更多限制。

非二次方纹理有什么优势?

据我所知,只有两个优点:

  • 如果未包装,则它们在HDD上占用的空间会更少(当包装的空白区域添加很少时)
  • 您可以节省编写NPOT-> POT转换器的时间。您将需要一个发布版本,但是使用NPOT纹理设计和原型化接口/模型就可以了

是否有大量台式机用户没有支持非二次幂纹理的卡?

据我所知,并在PC上进行了测试-是的。其中包括大部分的降速/较小的错误GPU和少量根本无法处理NPOT的卡。


6

非二次幂纹理的一种常见用法是用于“屏幕大小”或“半屏幕大小”(依此类推)的渲染目标纹理用于后期处理效果。

在这些情况下,不需要mipmap,缓冲区始终未压缩,因此奇数的纹理大小在这里引起的问题更少


4

在较旧的硬件上,NPOT纹理存在局限性。如该OpenGL Wiki所述,某些较旧的硬件要求NPOT不具有mipmap,压缩纹理要求对齐4x4像素,但新硬件应能完美处理。

以我的经验,如果使用NPOT纹理而不是POT,那么即使是相对较新的硬件也会对性能造成重大影响。我不知道问题是什么;在渲染状态的某种组合中,渲染实际上是在软件中完成的。因此,除非您有充分的理由,否则我建议您仍然尝试尽可能多地使用POT。

关于为什么使用NPOT而不是POT的原因-如果您具有NPOT尺寸的图像,例如1600x1200,则使用2048x2048像素的表面会浪费大量视频内存。


3
如果您使用的是在内存中压缩的纹理格式(例如PVR或DXT),那么将比例缩放到2的下一个幂将比未压缩但更小的NPOT纹理使用更少的纹理内存。
四分

3
您的措辞有点含糊,如果您要说的话有多余之处,请抱歉-压缩纹理仍然需要4的倍数的像素大小,即使在支持NPOT纹理的现代硬件上也是如此。

1
我希望当前的硬件在上载驱动程序时仍会在驱动程序中平铺/旋转纹理。这将更改纹理的布局,以使硬件访问更为优化。控制台(我不包括XNA)要求您在自己的工具链中手动执行此布局优化,我敢肯定,这些仅适用于POW2。
罗杰·帕金斯

-1

2种纹理的强大功能可在任何类型的GPU上将性能提高约30%,不仅旧的GPU(高端GPU与普通GPU的区别要快30%),它们还需要30%的内存,但所需的内存却更少,它们可以提高质量为特定距离提供适当的纹理大小,它的工作原理类似于对纹理进行抗锯齿。


这仅提供了(已经指定的)二次幂纹理的优点,它没有解决问题本身,这就是为什么鉴于上述优点,为什么要使用二次幂纹理。
乔什

对不起,我误解了这个问题,通过2个电源就被限制在2048,1024,512,等大概这是最主要的原因
优素福ghatavi

非2的幂对于不需要mipmaps的纹理(例如gui纹理)和始终靠近相机的第一人称角色的纹理也很有用
yusef ghatavi 2015年

-3

我的程序员艺术只有正确的大小。

当然,这可以简化我的显示逻辑,从而知道如果我想在屏幕的左上方设置纹理,则可以将0,0设置为纹理的左上方,并在正确的位置看到所有纹理,而如果必须添加0alpha填充,则将纹理定位在屏幕边缘的位置会更加复杂。另外,当然,仍然必须将0alpha进行alpha混合,如果我正在查看不透明的纹理,则可能不希望没有alpha通道。


6
通常在屏幕上放置多边形而不是纹理。可以根据需要使用任何UV,从而为多边形提供多边形-它们不一定需要从0变为1;如果您的纹理只有30宽,则可以设置为0.9375(这是POT纹理良好的另一个原因-UV可以精确表示)。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.