【问题标题】:Hardware support for non-power-of-two textures对非二次幂纹理的硬件支持
【发布时间】:2015-08-06 20:50:43
【问题描述】:

我一直听到关于在 OpenGL 应用程序中使用非幂的两个纹理是否安全的争议性意见。有人说所有现代硬件都完美支持 NPOT 纹理,也有人说不支持,或者性能受到很大影响。

我问的原因是因为我想将某些内容渲染到屏幕大小的帧缓冲区(可能不是 2 的幂)并将其用作纹理。我想了解在这种情况下性能和可移植性会发生什么变化。

【问题讨论】:

    标签: opengl graphics textures


    【解决方案1】:

    自很久以前(2004 年)的 OpenGL-2 以来,任意纹理大小已被指定为 OpenGL 的核心部分。此后设计的所有 GPU 都支持 NP2 纹理。唯一的问题是性能有多好。

    然而,自从 GPU 实现可编程后,任何基于固定功能纹理聚集访问的可预测模式的优化都变得有点过时了,GPU 现在已经针对一般数据局部性进行了优化,性能现在也不是什么大问题。事实上,对于 P2 纹理,您可能需要升级数据以匹配格式,这会增加所需的内存带宽。然而,内存带宽是现代 GPU 的第一大瓶颈。因此,使用稍小的 NP2 纹理实际上可能会提高性能。

    简而言之:您可以安全地使用 NP2 纹理,性能也不是什么大问题。

    【讨论】:

    • 谢谢,我很愚蠢地使用旧的 opengl 版本并在 2014 年之前为 2 图形的力量而苦苦挣扎,感谢您确认我将从现在开始使用 OpenGl 2.0 并将处理 Non power of 2图形,我很高兴,另一方面,我很笨,哈哈。
    【解决方案2】:

    现代图形硬件(来自 ATi/AMD/nVidia 的最后 10 代左右和来自 Intel 的最后几代)上的所有现代 API(我相信除了某些版本的 OpenGL ES)都支持 NP2 纹理。它们已经使用了很长一段时间,尤其是用于后期处理。

    但是,这并不是说它们与 2 次幂纹理一样方便。一种主要情况是内存打包;当它们是 2 的幂时,驱动程序通常可以更好地将纹理打包到内存中。如果您查看带有 mipmap 的纹理,则基础和所有 mip 可以打包到原始宽度的 150% 和原始高度的 100% 的区域中。某些纹理大小也有可能将内存页面与步幅(纹理行大小,以字节为单位)对齐,这将提供最佳的内存访问情况。 NP2 使这种优化更难执行,因此内存使用和寻址可能效率低下。您是否会注意到任何影响在很大程度上取决于驱动程序和应用程序。

    屏幕外效果可能是 NP2 纹理最常见的用例,尤其是屏幕大小的纹理。现在市场上几乎所有执行任何类型的后处理或延迟渲染的游戏都有 1-15 个屏幕外缓冲区,其中许多与屏幕大小相同(对于某些效果,一半或四分之一大小是有用的)。这些通常得到很好的支持,即使使用 mipmap。

    由于 NP2 纹理得到广泛支持,并且几乎可以肯定地在台式机和游戏机上使用,因此使用它们应该可以正常工作。如果您担心可能不支持它们的平台或硬件,那么简单的后备方法包括使用最接近的 2 次幂大小(可能会导致质量稍低,但会起作用)或完全放弃效果(具有明显的后果)。

    【讨论】:

      【解决方案3】:

      通过使用 OpenGL 2.0 进行跨平台开发,我在制作游戏(+4 年)和使用适用于 iOS 和 Android 的纹理图集方面拥有丰富的经验

      坚持使用最大尺寸为 2048x2048 的 PoT 纹理,因为某些设备(尤其是具有廉价硬件的廉价设备)仍然不支持动态纹理尺寸,我从现实生活中的测试人员那里知道这一点并亲眼目睹。现在有这么多设备,你永远不知道你会面对什么样的 GPU。

      如果您不使用 PoT 纹理,您的 iOS 设备也会显示黑色方块和伪影。

      只是一个提示。

      【讨论】:

        【解决方案4】:

        即使 OpenGL X 需要任意纹理大小,某些显卡仍然不能完全兼容 OpenGL。我有一个朋友的 IntelCard 遇到 NPOT2 纹理问题(我认为现在 Intel 卡完全兼容)。

        您有任何理由使用 NPOT2 纹理吗?比这样做,但请记住,也许一些旧硬件不支持它们,您可能需要一些软件后备来使您的纹理 POT2。

        您没有任何理由使用 NPOT2 纹理吗?然后只需使用 POT2 纹理。 (某些压缩格式仍然需要 POT2 纹理)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-07-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多