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