shader传入数组,浏览器正常,模拟器报错value not found

ccc 2.4.4
按照大佬的代码改的shader,想实现可变数量多个光源的2d场景。


浏览器无报错结果正常,模拟器报错

新手求解答。。。

CCEffect %{
  techniques:
  - passes:
    - vert: vs
      frag: fs
      blendState:
        targets:
        - blend: true
      rasterizerState:
        cullMode: none
      properties:
        texture: { value: white }
        alphaThreshold: { value: 0.5 }
        light_radius: { value: 0.2 } 
        //传入的数组
        light_prop: {value: [-1.0, -1.0, -1.0, -1.0]}
        light_strength: {value: 0.1}
        dummy: {value: 0.1}
        wh_ratio: {value: 1.0}
}%


CCProgram vs %{
  precision highp float;

  #include <cc-global>
  #include <cc-local>

  in vec3 a_position;
  in vec4 a_color;
  out vec4 v_color;
  out vec4 fragPos;

  #if USE_TEXTURE
  in vec2 a_uv0;
  out vec2 v_uv0;
  #endif

  void main () {
    vec4 pos = vec4(a_position, 1);

    #if CC_USE_MODEL
    pos = cc_matViewProj * cc_matWorld * pos;
    #else
    pos = cc_matViewProj * pos;
    #endif

    #if USE_TEXTURE
    v_uv0 = a_uv0;
    #endif

    v_color = a_color;

    gl_Position = pos;
    // TODO: optimization
    fragPos = cc_matWorld *vec4(a_position, 1);
  }
}%


CCProgram fs %{
  precision highp float;
  
  #include <alpha-test>
  #include <texture>

  in vec4 v_color;
  in vec4 fragPos;

  #if USE_TEXTURE
  in vec2 v_uv0;
  uniform sampler2D texture;
  #endif

  uniform LIGHT {
    // 光照半径
    float light_radius;
    // 漫反射环境光强度
    float light_strength;
    // 界面宽高比
    float wh_ratio;
    float dummy;
    // 光照中心点
    vec4 light_prop[256];
  };

  void main () {
    vec4 o = vec4(1, 1, 1, 1);

    #if USE_TEXTURE
      CCTexture(texture, v_uv0, o);
    #endif

    o *= v_color;
    ALPHA_TEST(o);

    float result = light_strength;
    for (int i=0;i<256;i++) {
      // 光的强度 light_prop[i].z,小于0标志读取完毕所有光源
      if (light_prop[i].z < 0.0) {
        break;
      }
      // 光的位置 light_prop[i].x,light_prop[i].y
      float dist = sqrt(pow(fragPos.x * wh_ratio - light_prop[i].x * wh_ratio, 2.0) + pow(fragPos.y - light_prop[i].y, 2.0));  
    
      // 叠加所有光照强度
      result = result + 1.0/(dist+1.0)*light_prop[i].z;
    }
    
    gl_FragColor = vec4(o.r * result, o.g * result, o.b * result, 1.0);
  }
}%
1赞

解决了。把数组长度减小就好了。

该主题在最后一个回复创建后14天后自动关闭。不再允许新的回复。