【问题标题】:How to optimize a color gradient shader?如何优化颜色渐变着色器?
【发布时间】:2024-01-08 11:15:05
【问题描述】:

我创建了这个简单的片段着色器来实现垂直颜色渐变效果。 但我发现这对我的移动设备全屏显示很费力。

有什么办法可以优化吗?

这里是代码链接

http://glsl.heroku.com/e#13541.0

【问题讨论】:

  • 为什么不在顶点着色器中计算颜色,让变化的插值做实际的渐变?
  • 我的印象是片段着色器是用来处理颜色的。您能否指出一些描述在顶点着色器中执行此操作的材料。我读过它可以大大提高性能。
  • 您在顶点着色器中使用相同的代码,然后将变量直接泵入 gl_FragColor。
  • 那么我如何在顶点着色器中获得 gl_FragCoord 呢?
  • @user1109536:不,您也可以在顶点着色器中处理颜色。只是没有最终片段的颜色。您将为顶点定义颜色,并将它们传递给变量。然后,您将简单地在基元上线性插值颜色。没有比这更快的了。

标签: opengl glsl shader


【解决方案1】:

你可以这样做。

vec2 position = (gl_FragCoord.xy / resolution.xy);

vec4 top = vec4(1.0, 0.0, 1.0, 1.0);
vec4 bottom = vec4(1.0, 1.0, 0.0, 1.0);

gl_FragColor = vec4(mix(bottom, top, position.y));

Example

你可以自己进一步改变颜色,我只是用随机颜色。


您甚至可以进一步消除计算x,但这有点过头了。

vec4 top = vec4(1.0, 0.0, 1.0, 1.0);
vec4 bottom = vec4(1.0, 1.0, 0.0, 1.0);

gl_FragColor = vec4(mix(bottom, top, (gl_FragCoord.y / resolution.y)));

【讨论】:

  • 谢谢。这就是我一直在寻找的。我会选择第二个选项。此外,在着色器代码中删除未使用的变量是否会提高其 fps 输出?
  • 不客气! ...着色器编译器本身将优化代码并删除所有未使用的变量、语句、制服等。虽然如果您可以看到/知道如何自己优化它,最好这样做,而不是完全依赖于着色器编译器,因为事情因 GPU 和驱动程序而异。 ...此外,您可以预先计算的越多越好,因此不要将 3 个矩阵发送到着色器然后计算它们,而是预先计算它们并将它们作为结果矩阵发送。