【3.8.8编辑器bug】材质无法修改shader数组属性的值

我声明了一个数组,但是无法在材质里修改数组的值
每次保存后都会重置,不知道是不是写法错了
想问一下有没有shader大佬知道为啥

// Copyright (c) 2017-2020 Xiamen Yaji Software Co., Ltd.
CCEffect %{
techniques:
    - passes:
          - vert: sprite-vs:vert
            frag: sprite-fs:frag
            depthStencilState:
                depthTest: false
                depthWrite: false
            blendState:
                targets:
                    - blend: true
                      blendSrc: src_alpha
                      blendDst: one_minus_src_alpha
                      blendDstAlpha: one_minus_src_alpha
            rasterizerState:
                cullMode: none
            properties:
                alphaThreshold: { value: 0.5 }
                maskRTs: { value: white }
                maskRects: { value: [0.25, 0.25, 0.5, 0.5] }

}%

CCProgram sprite-vs %{
    precision highp float;
    #include <builtin/uniforms/cc-global>
    #if USE_LOCAL
        #include <builtin/uniforms/cc-local>
    #endif
    #if SAMPLE_FROM_RT
        #include <common/common-define>
    #endif
    in vec3 a_position;
    in vec2 a_texCoord;
    in vec4 a_color;

    out vec4 color;
    out vec2 uv0;

    vec4 vert() {
        vec4 pos = vec4(a_position, 1);
        
        #if USE_LOCAL
            pos = cc_matWorld * pos;
        #endif
        
        #if USE_PIXEL_ALIGNMENT
            pos = cc_matView * pos;
            pos.xyz = floor(pos.xyz);
            pos = cc_matProj * pos;
        #else
            pos = cc_matViewProj * pos;
        #endif
        
        uv0 = a_texCoord;
        #if SAMPLE_FROM_RT
            CC_HANDLE_RT_SAMPLE_FLIP(uv0);
        #endif
        color = a_color;
        
        return pos;
    }
}%

CCProgram sprite-fs %{
    precision highp float;
    #include <builtin/internal/embedded-alpha>
    #include <builtin/internal/alpha-test>

    in vec4 color;

    // 遮罩纹理          
    uniform sampler2D maskRTs[5];
    uniform MaskBlock {
        vec4 maskRects[2]; // 遮罩区域 (x, y, width, height in UV space)
    };

    #if USE_TEXTURE
        in vec2 uv0;
        #pragma builtin(local)
        layout(set = 2, binding = 12)uniform sampler2D cc_spriteTexture;
    #endif

    vec4 frag() {
        vec4 o = vec4(1, 1, 1, 1);
        
        #if USE_TEXTURE
            o *= CCSampleWithAlphaSeparated(cc_spriteTexture, uv0);
            #if IS_GRAY
                float gray = 0.2126 * o.r + 0.7152 * o.g + 0.0722 * o.b;
                o.r = o.g = o.b = gray;
            #endif
        #endif
        
        o *= color;
        
        // 计算在遮罩区域内的相对坐标 (0-1)                    
        vec2 relativePos = vec2(
            (uv0.x - maskRects[0].x) / (maskRects[0].z - maskRects[0].x),
            (uv0.y - maskRects[0].y) / (maskRects[0].w - maskRects[0].y)
        );
        vec4 maskColor = texture(maskRTs[0], relativePos); // 对纹理进行采样
        o *= maskColor;
        
        ALPHA_TEST(o);
        return o;
    }
}%

强行修改meta文件倒是能挂上,但是编辑器里修改后又会重置回空数组,不能又是编辑器的bug吧。。

不出意外的话不持支数组,QQ_1766571648222
你在这里用uniform声名的变量,它默认就是你在properties的设定值。

我在代码里修改是能生效的。我现在非常怀疑又是编辑器bug

你这个又用的很有灵魂啊

很无奈,这也是bug的话都是我发现的第几个了,引擎有bug就算了,有大神能看源码找问题,编辑器有bug是真的一点也解决不了,只能改习惯

为啥不setProperty,我看可以传纹理

可以用setProperty,但是现在我的问题是为啥编辑器里挂上去了点保存后会被重置

内置的好像都没这种写法,估计官方都没试过 :face_with_raised_eyebrow:

之前也遇到过,发现代码修改可行就不在编辑器中修改了

所以还真是编辑器bug是吧,可怜我一个shader小白还以为是语法问题浪费半天时间 :sob: :sob: :sob:

我记得以前尝试过,好像不能用数组 :sweat_smile:

但是 运行后用setProperty 或者 直接改meta文件里的数组 都能生效 :sob:

没错啊,是vec4[]啊
image

uniform sampler2D maskRTs[5];
你先删掉这个看下

跟这个没关系,删掉下面的vec4数组也是改不动的,所以我觉得应该就是编辑器的问题没错了,别找自己的问题了
20251225144534_rec_

image
shader能使用的数组,没这么强悍

别纠结数组了,直接setProperty吧,cocos的shader本来写法很怪,我们这的技美都要看内置的shader去写,不敢随便写

材质预定义10来个变量,写个映射配置去setProperty一样的效果