【问题标题】:Improve performance by reusing the alpha channel of a RGB texture?通过重用 RGB 纹理的 Alpha 通道来提高性能?
【发布时间】:2017-03-14 17:38:07
【问题描述】:

我有一个 48 位纹理 RGB16F。

https://www.khronos.org/registry/OpenGL-Refpages/es3.0/html/glTexImage2D.xhtml 指出使用 RGB 时。 1.0 将被放入 alpha 通道。

1.0 是隐含的还是实际存储的?

在后一种情况下。我的主要问题: 如果我将我的 16 位高度图放入 alpha 通道,那么它就变成了 RGBA16F。 我会提高性能吗?

欢迎所有见解。

【问题讨论】:

    标签: opengl-es opengl-es-3.0


    【解决方案1】:

    1.0 是隐含的还是实际存储的?

    这是特定于实现的。如果您询问 888 与 8888 纹理,我会告诉您几乎每个实现都必须使用 32 位/纹素,但我不太确定 16F 格式。这说明 Metal 没有定义 RGB16F 格式 (link),这强烈表明 PowerVR GPU 至少会填充该格式。 Vulkan 确实定义了 RGB16F,但是虽然规范要求支持 R16F、RG16F 和 RGBA16F,但它不需要支持 RGB16F (link),这再次表明某些供应商缺乏原生支持。如果某处的某些 GPU 确实支持 RGB16F,我不会感到惊讶,但我怀疑大多数只是填充。要获得更明确的答案,您可能需要在 GPU 论坛上发布问题或通过检查某些受控条件下的内存使用情况进行实验。

    在后一种情况下。我的主要问题:如果我将我的 16 位高度图放入 alpha 通道,那么它就变成了 RGBA16F。我会提高性能吗?

    您是否同时对其进行采样(即来自相同的着色器,具有相同的 UV)?如果是这样,那么肯定是比使用 RGB16F 加 R16F 更好的选择。如果它们没有一起采样(例如,高度图是在顶点着色器中采样的,颜色是在片段着色器中采样的),那么就更难猜测了。可能您会损害高度图提取的性能(那些额外的字节会破坏缓存),但不会损害颜色提取(无论如何都有填充)-总体而言,您会损失一些性能但会节省一些内存-任何性能损失都是可能很小,如果您的瓶颈在其他地方,它可能根本不会造成任何伤害。

    【讨论】:

    • 如果您确实有不同的时间用法(例如,使用高度场的顶点着色器,使用颜色的片段着色器)然后不要打包它们。性能损失可能很小,但您将使用更多的内存带宽(在基于图块的架构上有效地加载整个纹理两次),这是缩短电池寿命的好方法。
    【解决方案2】:

    1.0 是隐含的还是实际存储的?

    我怀疑“两者”,虽然可能不是你的意思。

    大多数 GPU 采样器支持缺失通道的隐式规则(颜色为 0.0,Alpha 为 1.0),并且使用这些规则比从内存中采样/过滤的功率更低,因此我希望这会对缺失的通道使用隐式负载。

    但是,硬件通常也对加载大小不是 2 次方的东西过敏(在大多数缓存架构上,跨越缓存线边界的东西通常需要两个周期才能加载),所以我也会 em> 期望每个纹素都被填充到 64 位。 16 位填充包含的内容可能不是 1.0,因为硬件不在乎,因为它使用隐式规则。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-08
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      • 2012-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多