【Cocos Creator 3.x】 Shader 中的 layout(set = N, binding = M) 是什么意思?

前言
在 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

猜你喜欢

转载自blog.csdn.net/u014206745/article/details/126584694
今日推荐