Search code examples
opengl-esglslshaderfragment-shadervertex-shader

Warning X3550: array reference cannot be used as an l-value


I'm trying to make my shader work in Shaderfrog, I import my glsl sandbox version via URL.

I have the error: "C:\fakepath(111,2-27): warning X3550: array reference cannot be used as an l-value; not natively addressable, forcing loop to unroll.

Really not sure why this error is occurring, I've tried un-nesting any loops within loops but to no avail.

Here's my fragment code:

#extension GL_OES_standard_derivatives : enable

precision highp float;
varying vec2 vUv;
uniform float time;
uniform vec2 resolution;
void main() 
{
    vec2 p = vUv.xy / resolution.x * .05;
    vec3 col;

    for (float j = 0.; j < 3.; j++) {

        p.x += ((0.05 / 2.0) * sin(2.0 * 10. * p.y + (time*0.2) + cos((time / (150. * 2.0)) * 2.0)));
        p.y += ((0.02 / 2.0)* cos(2.0 * 10. * p.x + (time*0.15) + sin((time / (100. * 2.0)) * 2.0)));

        p.x += ((0.05 / 3.0) * sin(3.0 * 10. * p.y + (time*0.2) + cos((time / (150. * 3.0)) * 3.0)));
        p.y += ((0.02 / 3.0)* cos(3.0 * 10. * p.x + (time*0.15) + sin((time / (100. * 3.0)) * 3.0)));

        p.x += ((0.05 / 4.0) * sin(4.0 * 10. * p.y + (time*0.2) + cos((time / (150. * 4.0)) * 4.0)));
        p.y += ((0.02 / 4.0)* cos(4.0 * 10. * p.x + (time*0.15) + sin((time / (100. * 4.0)) * 4.0)));

        p.x += ((0.05 / 5.0) * sin(5.0 * 10. * p.y + (time*0.2) + cos((time / (150. * 5.0)) * 5.0)));
        p.y += ((0.02 / 5.0)* cos(5.0 * 10. * p.x + (time*0.15) + sin((time / (100. * 5.0)) * 5.0)));

        p.x += ((0.05 / 6.0) * sin(6.0 * 10. * p.y + (time*0.2) + cos((time / (150. * 6.0)) * 6.0)));
        p.y += ((0.02 / 6.0)* cos(6.0 * 10. * p.x + (time*0.15) + sin((time / (100. * 6.0)) * 6.0)));

        p.x += ((0.05 / 7.0) * sin(7.0 * 10. * p.y + (time*0.2) + cos((time / (150. * 7.0)) * 7.0)));
        p.y += ((0.02 / 7.0) * cos(7.0 * 10. * p.x + (time*0.15) + sin((time / (100. * 7.0)) * 7.0)));

        p.x += ((0.05 / 8.0) * sin(8.0 * 10. * p.y + (time*0.2) + cos((time / (150. * 8.0)) * 8.0)));
        p.y += ((0.02 / 8.0)* cos(8.0 * 10. * p.x + (time*0.15) + sin((time / (100. * 8.0)) * 8.0)));

        p.x += ((0.05 / 9.0) * sin(9.0 * 10. * p.y + (time*0.2) + cos((time / (150. * 9.0)) * 9.0)));
        p.y += ((0.02 / 9.0)* cos(9.0 * 10. * p.x + (time*0.15) + sin((time / (100. * 9.0)) * 9.0)));

        p.x += ((0.05 / 10.0) * sin(10.0 * 10. * p.y + (time*0.2) + cos((time / (150. * 10.0)) * 10.0)));
        p.y += ((0.02 / 10.0)* cos(10.0 * 10. * p.x + (time*0.15) + sin((time / (100. * 10.0)) * 10.0)));

        p.x += ((0.05 / 11.0) * sin(11.0 * 10. * p.y + (time*0.2) + cos((time / (150. * 11.0)) * 11.0)));
        p.y += ((0.02 / 11.0)* cos(11.0 * 10. * p.x + (time*0.15) + sin((time / (100. * 11.0)) * 11.0)));

        p.x += ((0.05 / 12.0) * sin(12.0 * 10. * p.y + (time*0.2) + cos((time / (150. * 12.0)) * 12.0)));
        p.y += ((0.02 / 12.0)* cos(12.0 * 10. * p.x + (time*0.15) + sin((time / (100. * 12.0)) * 12.0)));

        p.x += ((0.05 / 13.0) * sin(13.0 * 10. * p.y + (time*0.2) + cos((time / (150. * 13.0)) * 13.0)));
        p.y += ((0.02 / 13.0)* cos(13.0 * 10. * p.x + (time*0.15) + sin((time / (100. * 13.0)) * 13.0)));

        p.x += ((0.05 / 14.0) * sin(14.0 * 10. * p.y + (time*0.2) + cos((time / (150. * 14.0)) * 14.0)));
        p.y += ((0.02 / 14.0)* cos(14.0 * 10. * p.x + (time*0.15) + sin((time / (100. * 14.0)) * 14.0)));

        p.x += ((0.05 / 15.0) * sin(15.0 * 10. * p.y + (time*0.2) + cos((time / (150. * 15.0)) * 15.0)));
        p.y += ((0.02 / 15.0)* cos(15.0 * 10. * p.x + (time*0.15) + sin((time / (100. * 15.0)) * 15.0)));

        p.x += ((0.05 / 16.0) * sin(16.0 * 10. * p.y + (time*0.2) + cos((time / (150. * 16.0)) * 16.0)));
        p.y += ((0.02 / 16.0)* cos(16.0 * 10. * p.x + (time*0.15) + sin((time / (100. * 16.0)) * 16.0)));

        p.x += ((0.05 / 17.0) * sin(17.0 * 10. * p.y + (time*0.2) + cos((time / (150. * 17.0)) * 17.0)));
        p.y += ((0.02 / 17.0)* cos(17.0 * 10. * p.x + (time*0.15) + sin((time / (100. * 17.0)) * 17.0)));

        p.x += ((0.05 / 18.0) * sin(18.0 * 10. * p.y + (time*0.2) + cos((time / (150. * 18.0)) * 18.0)));
        p.y += ((0.02 / 18.0)* cos(18.0 * 10. * p.x + (time*0.15) + sin((time / (100. * 18.0)) * 18.0)));

        p.x += ((0.05 / 19.0) * sin(19.0 * 10. * p.y + (time*0.2) + cos((time / (150. * 19.0)) * 19.0)));
        p.y += ((0.02 / 19.0)* cos(19.0 * 10. * p.x + (time*0.15) + sin((time / (100. * 19.0)) * 19.0)));

        p.x += ((0.05 / 20.0) * sin(20.0 * 10. * p.y + (time*0.2) + cos((time / (150. * 20.0)) * 20.0)));
        p.y += ((0.02 / 20.0)* cos(20.0 * 10. * p.x + (time*0.15) + sin((time / (100. * 20.0)) * 20.0)));

        p.x += ((0.05 / 21.0) * sin(21.0 * 10. * p.y + (time*0.2) + cos((time / (150. * 21.0)) * 21.0)));
        p.y += ((0.02 / 21.0)* cos(21.0 * 10. * p.x + (time*0.15) + sin((time / (100. * 21.0)) * 21.0)));

        p.x += ((0.05 / 22.0) * sin(22.0 * 10. * p.y + (time*0.2) + cos((time / (150. * 22.0)) * 22.0)));
        p.y += ((0.02 / 22.0)* cos(22.0 * 10. * p.x + (time*0.15) + sin((time / (100. * 22.0)) * 22.0)));

        p.x += ((0.05 / 23.0) * sin(23.0 * 10. * p.y + (time*0.2) + cos((time / (150. * 23.0)) * 23.0)));
        p.y += ((0.02 / 23.0)* cos(23.0 * 10. * p.x + (time*0.15) + sin((time / (100. * 23.0)) * 23.0)));

        p.x += ((0.05 / 24.0) * sin(24.0 * 10. * p.y + (time*0.2) + cos((time / (150. * 24.0)) * 24.0)));
        p.y += ((0.02 / 24.0)* cos(24.0 * 10. * p.x + (time*0.15) + sin((time / (100. * 24.0)) * 24.0)));

        p.x += ((0.05 / 25.0) * sin(25.0 * 10. * p.y + (time*0.2) + cos((time / (150. * 25.0)) * 25.0)));
        p.y += ((0.02 / 25.0)* cos(25.0 * 10. * p.x + (time*0.15) + sin((time / (100. * 25.0)) * 25.0)));

        col[int(j)] = 20.*(abs(p.x + p.y));
    }

    gl_FragColor = vec4(col, 1.);
}

https://shaderfrog.com/app/editor

http://glslsandbox.com/e#59252.0


Solution

  • To understand the error

    array reference cannot be used as an l-value

    see OpenGL ES Shading Language 1.00 Specification - 5.5 Vector Components

    [...] To form an l-value, swizzling must be applied to an l-value of vector type [...]

    and further OpenGL ES Shading Language 1.00 Specification - 5.8 Assignments

    [...] Array variables are l-values and may be passed to parameters declared as out or inout. However, they may not be used as the target of an assignment. [...]

    That means it is possible to read form col[i], but it is not possible to write to it by an assignment.

    You have to assign the components of the vector in a selection:

    vec3 col;
    for (int j = 0; j < 3; j++) {
    
        // [...]
    
        float c = 20.*(abs(p.x + p.y));
        if (j==0)
            col.x = c;
        else if (j==1)
            col.y = c;
        else
            col.z = c;
    }