关于在OpenGL应用程序中使用非二次方纹理是否安全,我一直听到有争议的意见。有人说所有现代硬件都完全支持NPOT纹理,也有人说它不支持,或者性能大受欢迎。
我之所以这么问,是因为我想把一些东西渲染到屏幕大小的帧缓冲区(可能不是二的幂),并将其用作纹理。我想了解在这种情况下性能和可移植性会发生什么。
从很久以前(2004年)的OpenGL-2开始,任意纹理大小就被指定为OpenGL的核心部分。自那以后设计的所有GPU都支持NP2纹理。唯一的问题是性能有多好。
然而,自从GPU可编程以来,任何基于固定函数纹理采集访问的可预测模式的优化都变得有点过时了,GPU现在已经为通用数据位置优化了缓存,性能现在也不是什么大问题。事实上,对于P2纹理,您可能需要升级数据以匹配格式,这会增加所需的内存带宽。然而,内存带宽是现代GPU的头号瓶颈。因此,使用稍小的NP2纹理实际上可以提高性能。
简而言之:你可以安全地使用NP2纹理,性能也不是什么大问题。
现代图形硬件上的所有现代API(我相信OpenGL ES的某些版本除外)(ATi/AMD/nVidia的最后10代左右和Intel的最后几代)都支持NP2纹理。它们已经使用了很长一段时间,特别是在后处理方面。
然而,这并不是说它们像二次幂纹理一样方便。一个主要案例是内存打包;当它们是二次方时,驱动程序通常可以更好地将纹理打包到内存中。如果使用mipmaps查看纹理,则可以将基础和所有mip打包到原始宽度的150%和原始高度的100%的区域中。也有可能某些纹理大小会将内存页与步幅(纹理行大小,以字节为单位)对齐,这将提供最佳的内存访问情况。NP2使这种优化更难执行,因此内存使用和寻址的效率可能会降低。您是否会注意到任何影响在很大程度上取决于驱动程序和应用程序。
屏幕外效果可能是NP2纹理最常见的用例,尤其是屏幕大小的纹理。现在市场上几乎每一款执行任何类型的后处理或延迟渲染的游戏都有1-15个屏幕外缓冲区,其中许多缓冲区与屏幕大小相同(对于某些效果,一半或四分之一的大小是有用的)。这些通常都得到很好的支持,即使使用mipmaps也是如此。
因为NP2纹理得到了广泛支持,而且在台式机和控制台上几乎是板上钉钉的事,所以使用它们应该很好。如果你担心平台或硬件可能不受支持,那么容易出现的故障包括使用最接近的2次方大小(可能会导致质量稍低,但会起作用)或完全放弃效果(后果明显)。
我在制作游戏(+4年)和使用iOS&使用OpenGL 2.0 跨平台开发Android
坚持使用最大大小为2048x2048的PoT纹理,因为有些设备(尤其是硬件便宜的设备)仍然不支持动态纹理大小,我从现实生活中的测试人员那里了解到这一点,并亲眼目睹了这一点。现在有这么多设备,你永远不知道你将面临什么样的GPU。
如果你不使用PoT纹理,你的iOS设备也会显示黑色方块和人工制品。
只是一个提示。
即使OpenGL X需要任意纹理大小,某些视频卡仍然不完全符合OpenGL。我有一个朋友的IntelCard在NPOT2纹理方面有问题(我认为现在Intel Card完全兼容)。
你有理由使用NPOT2纹理吗?但请记住,也许一些旧硬件不支持它们,你可能需要一些软件回退,使你的纹理成为POT2。
你没有任何理由使用NPOT2纹理吗?然后只使用POT2纹理。(某些压缩格式仍然需要POT2纹理)