function gradient4(regl) {
return regl({
frag: `
precision highp float;
uniform vec4 color0;
uniform vec4 color1;
uniform vec4 color2;
uniform vec4 color3;
uniform vec2 iResolution;
uniform float lrgb;
float fnToRgb (float c) {
float tmp = abs(c);
if (tmp > 0.0031308) {
return 1.055 * pow(tmp, 1. / 2.4) - 0.055;
}
return c * 12.92;
}
vec4 toRgb(vec4 color) {
return vec4 (fnToRgb(color.r), fnToRgb(color.g), fnToRgb(color.b), color.a);
}
float fnToLrgb (float c) {
float tmp = abs(c);
if (tmp <= 0.04045) {
return c / 12.92;
}
return pow((tmp + 0.055) / 1.055, 2.4);
}
vec4 toLrgb(vec4 color) {
return vec4 (fnToLrgb(color.r), fnToLrgb(color.g), fnToLrgb(color.b), color.a);
}
void main () {
vec2 uv = gl_FragCoord.xy / iResolution.xy;
if (lrgb != 0.) {
vec4 colorLeft = mix(toLrgb(color2),toLrgb(color0),uv.y);
vec4 colorRight = mix(toLrgb(color3),toLrgb(color1),uv.y);
vec4 color = toRgb(mix(colorLeft,colorRight,uv.x));
gl_FragColor = color;
} else {
vec4 colorLeft = mix(color2,color0,uv.y);
vec4 colorRight = mix(color3,color1,uv.y);
vec4 color = mix(colorLeft,colorRight,uv.x);
gl_FragColor = color;
}
}`,
vert: `
attribute vec2 position;
void main () {
gl_Position = vec4(position, 1, 1.0);
}`,
attributes: {
position: [
[-1, -1],
[1, -1],
[1, 1],
[1, 1],
[-1, 1],
[-1, -1]
]
},
uniforms: {
iResolution: (_) => [_.viewportWidth, _.viewportHeight],
color0: (_, props) => props.colors[0],
color1: (_, props) => props.colors[1],
color2: (_, props) => props.colors[2],
color3: (_, props) => props.colors[3],
lrgb: (_, props) => props.lrgb || 0.0
},
depth: {
enable: false,
mask: false
},
count: 6
});
}