opengl-es - 警告 X3550 : array reference cannot be used as an l-value

标签 opengl-es glsl shader fragment-shader vertex-shader

我试图让我的着色器在 Shaderfrog 中工作,我通过 URL 导入我的 glsl 沙箱版本。

我有错误:“C:\fakepath(111,2-27): warning X3550: array reference cannot be used as an l-value; not natively addressable, force loop to unroll.

真的不确定为什么会发生这个错误,我试过在循环中取消嵌套任何循环但无济于事。

这是我的片段代码:

#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

最佳答案

理解错误

array reference cannot be used as an l-value



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 [...]



以及 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. [...]



这意味着可以读取表单 col[i] ,但不可能通过赋值写入。

您必须在选择中分配向量的组件:

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;
}

关于opengl-es - 警告 X3550 : array reference cannot be used as an l-value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60984733/

相关文章:

ios - iOS 上的 OpenGL ES 1.1 : No clipping planes?

iphone - 使用 OpenGL ES 在 2D 空间中定位元素

android - 如何将 GLSurfaceView 渲染保存到文件?

opengl - 估计 GLSL 着色器所需的寄存器数量

c++ - 顶点属性 - 使用 short 而不是 float 作为顶点位置

android - 如何使用OpenGLES 2.0在libgdx中的背景上实时渲染Android的YUV-NV21摄像机图像?

android - Android 2D 图形的显示是否使用 EGL 库?

javascript - 如何使用 webgl 处理和更新大型数组?

c++ - 如何阻止着色器扭曲纹理

c++ - ATI 卡上的片段着色器与 NVIDIA 卡上的片段着色器