有没大佬通俗易懂的讲讲啊
和C C++的内存对齐大差不差,问AI比较通俗易懂
没有C C++基础是比较难理解
你整明白shader的基本语法和原理剩下的交给AI,AI特别适合写shader
OpenGL 有个规则(叫做 std140),这个规则可以让 GPU 在读取数据时更高效,这个规则(简略版)是:
- float 类型的数据,它的数据在显存中的地址(偏移量)必须是 4 的倍数;
- vec2 类型必须是 8 的倍数;
- vec3 或 vec4 必须是 16 的倍数。
假设有个 UBO 是这样定义:
uniform UBO {
float a;
vec2 b;
float c;
};
那么它们在显存里的分布为:
这张图最重要的地方,是红色的四个格子 —— float a 的数据后面「被迫」扩展出了 4 个没放任何数据的字节。
为什么要「被迫」浪费 4 字节的显存呢?
因为最前面提到的那个规则,要求 vec2 的地址偏移必须是 8 的倍数。你不扩展,那 vec2 b 的地址偏移只有 4 个字节,就不符合规定(扩展了就变成 8 字节,是 8 的 1 倍,符合规定)。
Cocos 引擎怕浪费显存,这种情况直接就给你报错(而不是像上图那样自动扩展、浪费掉 4 字节) 。
至于上面那个 UBO 对象,改成这样就不会报错了(b 和 c 换下顺序):
uniform UBO {
float a;
float c;
vec2 b;
};
因为它直接就符合规则,不需要扩展、浪费显存,就这么简单。
4赞

就是大数据放前面,小数据放后面,比如Vec4 > Vec2 > float
1赞
是的,简单点就是这样,而且float参数尽量使用vec4合并。全部是float,多个shader内存会受影响
弄明白了,哈哈。感谢各位大佬

