【问题标题】:Which GLSL Multi Colour Linear/Radial Gradients Strategy to use?使用哪种 GLSL 多色线性/径向渐变策略?
【发布时间】:2014-06-17 16:19:59
【问题描述】:

我正在使用 OpenGL ES 2 和 GLSL 进行开发,但我不知道如何处理多色/分段渐变(线性和径向)。

我不知道哪种方法是最佳做法:

  1. 获取渐变颜色的纹理并在片段着色器中对其进行采样(本质上是使用常规纹理)。
  2. 计算机首先生成渐变纹理并在片段着色器中对其进行采样,如上所述(不需要 PNG 等渐变) - 缓存此纹理以保存再生。
  3. 在片段着色器中使用插值来按片段位置计算片段值 - 这看起来我必须使用多个 if、一个循环以及您不希望每个片段执行的东西。
  4. 我没有想到的其他策略。

我知道这个问题有点主观,但是在网上四处寻找信息后,我没有找到任何关于如何进行的具体信息......

【问题讨论】:

  • 对于将来阅读本文的任何人 - 我选择了上面的选项 2。我在单独的帧缓冲区中生成线性/径向渐变的纹理,获取纹理,然后将其缓存以获得更好的性能。这使我能够以与常规纹理相同的方式轻松地在任意 2D 形状上绘制渐变,如纹理,从那时起保持通用。制作纹理后,性能与绘制从磁盘加载的任何图像相同。由于我只以不频繁的间隔生成梯度,因此对性能的影响可以忽略不计。希望这会有所帮助!

标签: opengl-es glsles


【解决方案1】:

好吧,我可以告诉你如何进行,但你可能不喜欢这个答案。 ;) 主要的两种方法是对纹理进行采样或进行着色器计算。要确定哪一个对您的情况更有效,您需要同时实现这两个,并开始进行基准测试。影响每个性能的因素太多了,无法给出一个通用的答案。

其中一个主要因素当然是您的计算有多复杂。但是现代 GPU 对于纯计算具有非常高的原始性能。自从您询问 ES 以来,您最有可能使用的移动 GPU 并没有那么多,但即使是最新的移动 GPU 也变得非常强大。分支不是免费的,但不一定像您想象的那样有害。

另一方面,纹理采样看起来像是着色器中的单个操作,但仅基于此,您不应该假设它自动比执行一堆计算更快。纹理采样性能可能受到许多因素的限制,包括纹理采样硬件单元的吞吐量、内存带宽、缓存命中率等。特别是如果您的纹理需要相当大以提供必要的精度,内存带宽可能会伤害您,访问移动设备上的内存会消耗大量电量。此外,仅需要额外的内存使用是不可取的,因为您主要处理非常有限的内存量。

当然,不同 GPU 之间的性能特征可能会有很大差异。因此,如果您想得出可靠的结论,则需要在各种设备上进行基准测试。

对于在着色器中实现计算的方法,请确保它尽可能最佳。在合理可能的情况下避免使用分支,或者至少对各种选项进行基准测试以查看分支对性能的影响程度。如果每个片段的计算部分都相同,请预先计算值并将它们传递给着色器。尽可能用更便宜的操作代替昂贵的操作。例如,不要除以统一值,而是将逆作为统一值传递,并改用乘法。尽可能使用向量运算。

【讨论】:

  • 我有过的最全面的答案,非常感谢!正如您所说,我将尝试两者并对其进行基准测试,如果没有别的,它将很有启发性:D
猜你喜欢
  • 1970-01-01
  • 2021-11-24
  • 2020-06-13
  • 2018-02-03
  • 1970-01-01
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
  • 2011-05-12
相关资源
最近更新 更多