前言
在 Cocos Creator 3.3.0 版本中,在 builtin-sprite.effect 中有一句代码 layout (set = 2, binding = 10) uniform sampler2D cc_spriteTexture 。但是在 Cocos Creator 3.6.0 版本中,变成了 layout (set = 2, binding = 11) uniform sampler2D cc_spriteTexture。那么其中 layout(set = N, binding = M) 是什么,怎么设置其中的 N,M 值呢?
解析
在 GLSL 中:
layout (set = M, binding = N) uniform sampler2D variableName;
- M 指 pSetLayouts 管道布局成员中的第 M’ 个描述符集布局
- N 指的 pBindings 是描述符集布局的M的成员中的第N个描述符集(绑定)
您将使用的顶点着色器中统一缓冲区的布局代码如下所示:
layout (std140, binding = 0) uniform bufferVals {
mat4 mvp;
} myBufferVals;
这会将统一缓冲区内容映射到myBufferVals结构。未指定“set=M”,默认为 0。
“std140”是描述数据如何打包在统一块中的标准。
对应到 Cocos Effect 中
以 Cocos Creator 3.6.0 版本为例,我们可以从引擎源码找到一些蛛丝马迹。
类型 | 描述 |
---|---|
set = 2, binding = 0 | uniform CCLocalBatched 或 CCLocal 或 CCWorldBound |
set = 2, binding = 1 | uniform CCForwardLight |
set = 2, binding = 2 | uniform CCSkinningAnimation |
set = 2, binding = 3 | uniform CCSkinningTexture 或 CCSkinning |
set = 2, binding = 4 | uniform CCMorph |
set = 2, binding = 5 | |
set = 2, binding = 6 | uniform highp sampler2D cc_jointTexture 或 cc_realtimeJoint |
set = 2, binding = 7 | uniform sampler2D cc_PositionDisplacements |
set = 2, binding = 8 | uniform sampler2D cc_NormalDisplacements |
set = 2, binding = 9 | uniform sampler2D cc_TangentDisplacements |
set = 2, binding = 10 | uniform sampler2D cc_lightingMap |
set = 2, binding = 11 | uniform sampler2D cc_spriteTexture |
set = 2, binding = 12 | uniform sampler2D cc_reflectionTexture |
以上分析来源
- https://vulkan.lunarg.com/doc/view/1.2.154.1/windows/tutorial/html/08-init_pipeline_layout.html
- https://vulkan.lunarg.com/doc/view/1.2.154.1/windows/tutorial/html/07-init_uniform_buffer.html
- https://vulkan.lunarg.com/doc/view/1.2.154.1/windows/tutorial/html/index.html
- https://vulkan.lunarg.com/doc/view/1.2.154.1/windows/tutorial/html/09-init_descriptor_set.html