Shader中uniform块声明变量必须类型一致?【求助,快被折磨挂了】

前言

这两天学习Shader真是被折磨的死去活来,拿引擎内置的builtin-sprite改,都能改的错误百出,各种变量生命报错,还报路径错误等等,完全摸不到头脑,后来网上找了别人的Shader例子研究里面的2D结构,还是遇到了新的问题。

问题

拦路虎一直没解决掉,uniform里声明各种出错。
放空的教程跟麒麟子的教程看了多遍,chrome里tab数量都快炸了,还是没搞定。
后来发现,uniform块里变量生命,把vec2跟float放在一起就报错!!!
尝试拆开就没有问题,下面截图是报错截图,eft_block_01是拆开,eft_block_01是放一个uniform块里。
(upload://63a1LWBWCm8TJeWP2jSNxqz8toP.jpeg)


求助

已经是翻遍查找各种改动Shader,终于定位到了这个错误,还请各位大佬看看,是不是这个地方的错?
但是麒麟子的Shader教程五里是混着声明的啊!(虽然基础教程五很难找,我还是在知乎找到了!)

感想

觉得自己干什么不好,花将近一周时间研究Shader,没有学到完整的HLSL基础,也没能成功运行一个Shader,太折磨人了啊

PS:想上传shader的effect,提示没有权限.

Cocos的effect不允许padding,UBO块内按照从大到小的顺序排列就不会有padding,你把同一个块内的vec2声明在float之前就行了

https://docs.cocos.com/creator/manual/zh/shader/effect-syntax.html#关于-ubo-内存布局

1赞


非常感谢!问题解决了!你说的话我也能看的很明白能理解!今晚能够睡好觉了!

查了下文章,里面一段话不是很理解,看起来似乎是应该从小向大排序,不过经常验证果然是从大往小排即可!
这段文字模糊记得看过一遍,有一点印象,但是没理解。
再参考麒麟子的那段截图,可能是后面cocos从3.0到3.6版本升级做了改动了?

坑真多,一个不小心就掉坑里了,DB错误偶尔出现,绝大部分显示的是

2
[Window] The “path” argument must be of type string or an instance of Buffer or URL. Received undefined
TypeError [ERR_INVALID_ARG_TYPE]: The “path” argument must be of type string or an instance of Buffer or URL. Received undefined

根据这个提示完全不知道怎么排查错误的!

不知道什么时候官网能再出个人版便宜的小秘书,自己啃真是太折磨人了,不知道哪里一个坑,很多时间就扔进去了,哎.

从小到大也是可以的,但是需要满足规则才不会出现padding,所以从大到小排比较省事。
std140布局规则,规范了每个变量的对齐基准,一个float对齐基数是N(4字节),vec2对齐基数是2N。如果是1个float,1个vec2的排列,就会在float和vec2之间添加额外的字节(padding)使之对齐;如果是2个float,1个vec2是满足字节对齐的,就不会有padding。
详细的你去搜搜std140布局

好的,我去看看,再次感谢!