Cocos Shader中uniform不支持传递vec4[]数据类型吗?[在线等]

uniform TARGET_PARAMS{
vec4[20] listVec;
vec2 targetPos;
vec2 range;
};
vec4 vert () {
vec4 testVec = listVec[0];
}

报错如下:

问了朋友,HLSL里应该是能够正常传递vec4[]类型数组的,但是Cocos里一直报红字.

各种删除代码,最终只剩这一行" vec4 testVec = listVec[0];"还是报错.

感觉写Shader就跟摸索黑箱一样,处处是坑.

还请大家能帮忙解决这个问题

uniform TARGET_PARAMS{
vec4[20] listVec;
};

uniform TARGET_PARAMS2{
vec2 targetPos;
vec2 range;
};

分开试试

测试,还是同样报错.
如果我把vec4 testVec = listVec[0]注释掉就没报错.
但是我声明了,总要用吧,一样就出错.

vec4 testVec = vec4(listVec[0]);
或者只用listVec[0]

uniform TARGET_PARAMS{
vec4 list[10];
};

这样就行了

vec4 testVec = vec4(listVec[0]);
float x = listVec[0].x;
float x = float(listVec[0].x);

都不行,访问listVec[0]也同样的报错.

uniform_报错2

声明可以,不用就没事,一旦使用就报错.

这样
uniform TARGET_PARAMS{
vec4 list[10];
};

不是下面这种声明

uniform TARGET_PARAMS{
vec4[10] list;
};

1赞

对,就是这样,看漏了

嗯嗯,看花眼很正常

解决了!感觉拯救了我至少好几根头发!谢谢.

谢谢帮助!

不客气,拯救程序员头发功德无量 :joy:

:} Shader写起来真头疼.

支持 但是有顺序的

又有了新问题,麻烦帮忙看下.

YAML代码

listTargetV4:
value:
- 0.1, 0.5, 0.5, 0.5
- 0.5, 0.2, 0.5, 0.5
- 0.5, 0.5, 0.3, 0.5
- 0.5, 0.5, 0.5, 0.4
- 0.6, 0.5, 0.5, 0.5
- 0.5, 0.6, 0.5, 0.5
- 0.5, 0.5, 0.6, 0.5
- 0.5, 0.5, 0.5, 0.6
editor:
tooltip: “xxxxx”

HLSL代码

uniform TARGET_PARAMS{
vec4 listTargetV4[8];
vec2 targetPos;
vec2 range;
};

发现一旦YAML部分,声明vec4数组长度超过4,就报错.

能否帮忙分析下,一开始数组长度从100,逐步降到4,4个是可行的,多的就报错了。

应该是编辑器本身对属性面版显示的限制,不在编辑器里设置这么长的数组参数,直接在代码里设置不就好了,可以不用在YAML里注册这个listTargetV4属性

还以为YAML里面的value数组长度必须跟uniform里的声明数组长度进行匹配。
竟然不用完全匹配!

listTargetV4: {value:[0.5, 0.5, 0.5, 0.5],[0.5, 0.5, 0.5, 0.5]}

数组里2个元素,要这么写,

数组里4个元素要按照上面那么写.

数组里更多元素就不能在YAML里初始化,可能编辑器不支持。
一个YAML变量声明,多种书写方式(文档里介绍YAML的语法,里面就没{}大括号标志,但官方eft打开好多大括号,也没做段落切分),还可能对声明数组有数量限制,但是官方文档里也没写。
YAML里对数组的初始化似乎可以跟uniform里的不用匹配,文档里也没写。

真是愁的,写个Shader感觉在测试黑盒,一点点各种尝试。

基本不用看文档,看引擎自带的effect,贴个vec4使用的链接,后续需要的可以参考
https://github1s.com/1226085293/mk_sdf_shadow/blob/main/assets/sdf_shadow.effect

是的,你的参考连接帮我解决了很多文档上没有说清楚的问题!
专业程序上来就是看范例代码跟别人代码的.
新手入门靠文档,文档内容详实度不够,就处处踩坑。