0

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

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

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

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

4

1 回答 1

1

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

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

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

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

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

于 2014-06-18T05:58:11.823 回答