使用哪种GLSL多色线性/径向梯度策略?

时间:2014-06-17 16:20:00

标签: opengl-es glsles

我正在使用OpenGL ES 2& amp; GLSL和我一直坚持如何接近多色/分数梯度(线性和径向)。

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

  1. 获得渐变色的纹理&在碎片Shader中对此进行采样(主要使用常规纹理)。
  2. 计算机首先生成渐变纹理。如上所述在碎片Shader中对此进行采样(不需要渐变的PNG等) - 缓存此纹理以保存重新生成。
  3. 在片段Shader中使用插值来按片段位置计算片段值 - 这看起来像我必须使用多个ifs,一个循环,你不希望每个片段执行的东西。
  4. 我没想到的其他策略。
  5. 我知道这个问题有点主观,但是在网上查看了相关信息我还没有发现任何关于如何进行的具体问题......

1 个答案:

答案 0 :(得分:1)

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

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

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

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

对于在着色器中实现计算的方法,请确保它尽可能最佳。尽可能避免使用分支,或者至少根据各种选项来确定分支对性能的影响程度。如果计算的某些部分对于每个片段是相同的,则预先计算这些值并将它们传递到着色器中。尽可能用更便宜的操作替换昂贵的操作。例如,不是将统一值除以,而是将逆传递为均匀,而是使用乘法。尽可能使用矢量运算。