2013-04-10 36 views
10

我正在尝试创建一个OpenGL ES 2.0片段着色器,它可以沿着一个轴输出多个停止渐变。它应该在以百分比定义的点上插入多种颜色。如何创建多个停止渐变片段着色器?

我用if S中的片段着色器,这样实现的:

float y = gl_FragCoord.y; 
float step1 = resolution.y * 0.20; 
float step2 = resolution.y * 0.50; 

if (y < step1) { 
    color = white; 
} else if (y < step2) { 
    float x = smoothstep(step1, step2, y); 
    color = mix(white, red, x); 
} else { 
    float x = smoothstep(step2, resolution.y, y); 
    color = mix(red, green, x); 
} 

他们说,在片段着色器分支可以杀死性能。是否有一些巧妙的技巧可以用来在不使用if的情况下插入许多值?它是否真的值得(这是非常主观的,我知道,但作为经验法则)?

为了说明这个GLSL沙盒的链接我的问题,完整的源代码(仍低于虽然):http://glsl.heroku.com/e#8035.0

+0

据我所知,GPU上的所有内核都期望在同一时间执行相同的操作。如果您有分支机构,那么存在不同内核需要执行不同操作的风险,因此有些内核会被有效阻塞。这是杀死性能的原因。在着色器中避免分支确实是一种好的做法。 – 2015-04-20 19:16:46

回答

6

如果你想消灭你可以做以下(从Heroku的拍摄)分支机构;

color = mix(white, red, smoothstep(step1, step2, y)); 
color = mix(color, blue, smoothstep(step2, step3, y)); 
color = mix(color, green, smoothstep(step3, resolution.y, y)); 

但我不确定这是否比if/elses更快。

+0

这是我真正想要的答案!如果我遇到性能问题,那么我会对这些方法的性能进行基准测试。 – murgo 2013-04-11 08:20:31

+1

此代码的一个工作示例:http://glslsandbox.com/e#39992.0 – neave 2017-04-18 16:04:48