公众号Cocos Shader基础入门遇到的关于layout问题求助

公众号地址:https://mp.weixin.qq.com/s?__biz=MjM5ODAxNTM2NA==&mid=2659672628&idx=1&sn=d394b51e0d245bf187dd1597ff8cd478&chksm=bda2fadf8ad573c943404722c49d3a04f31da71e76ba1e11a05ed94daf6b6e5a4af6dd29fa40&scene=178&cur_album_id=2083238880157188100#rd

layout 布局限定符
这部分内容是属于 GLSL 的部分,既然这里有使用到,就简单地提一下。这里我特地做说明的理由是针对需要在原有的内置 shader 基础上做改造,了解什么部分需要保留而存在。在 Cocos Creator 3.0 里,用户新增的 uniform 或顶点属性都无需写这部分内容,而是由渲染底层自行处理。对于初学者来说,了解即可。

// 在之前 WebGL 里的内容,我们有提及在访问输入属性的时候,需要调用 gl.getAttribLocation 获取当前顶点属性的位置,然后再激活属性 gl.enableVertexAttribArray
// 这个位置默认是由着色器分配,当然我们也可以自己指定。
// 可以通过 gl 指令 gl.bindAttribLocation 按照指定的位置绑定,然后直接根据位置值激活属性 gl.enableVertexAttribArray
// 或者也可以通过 layout 布局限定符指定,location 就代表属性要设定位置。在两者同时设定的情况下,layout 优先级更高
layout(location = 2) in vec3 position;
// 这里只是简单列举了顶点属性的内存分配,uniform 那些也是可以指定内存分配
// Cocos Creator 内置两大数据内存结构,一个是 CCLocal 一个是 CCGlobal
// #pragma builtin(local) 代表申请 CCLocal 内存
// layout(set = 2, binding = 10) 代表绑定到 CCLocal 内存指定位置,跟 location 类似,只不过这是 GLSL 更高版本的使用方式,比低版本在指定上更加灵活
#pragma builtin(local)
layout(set = 2, binding = 10) uniform sampler2D cc_spriteTexture;

遇到这个layout(set = 2, binding = 10),layout大致意思明白,应该是以下代码:

const location = gl.getAttribLocation(program, vertexAttribName)
gl.enableVertexAttribArray(location)
gl.bindBuffer(gl.ARRAY_BUFFER,vertexBuffer)
glvertexAttribPointer(positionAttributeLocation, size, type, normalize, stride, offset);

随着版本提升,新的替代写法。但是里面的"set = 2",set是什么含义,网上翻资料,找遍了也没找到,这行代码里的“2”跟"11"是怎么来的,也不清楚,虽然教程里说了这块不用管,但是看着还是心里发虚,毕竟不知道这个数字是怎么计算来的,前面代码例子是这样的

// 告诉属性怎么从postionBuffer读取数据(ARRAY_BUFFER)
var size = 2; // 每次迭代读取2个单位数据,x,y
var type = gl.FLOAT // 每个单位数据是32位浮点数
var normalize = false; // 不需要归一化
var stride = 0; // 主要表达数据存储的方式,单位是字节。0 表示属性数据是连续存放的,通常在只有一个属性的数据里这么用
var offset = 0; // 属性在缓存中每间隔的偏移值,单位是字节byte
gl.vertexAttribPointer(positionAttributeLocation, size, type, normalize, stride, offset);

还解释了各个数字的由来和计算方式,GL版本升级用layout,缺了这块数字计算由来,看的一头雾水。
从昨晚到今晚,自行查阅了一些资料比如:
https://blog.csdn.net/hankern/article/details/89325452
还翻看了官方opegl shader中,找打了这么一句

Geometry Input Primitives
Primitives input:
• points
• lines
• lines_adjacency
• triangles
• triangles_adjacency
Input type set in layout

还是一脸懵,从昨晚到今晚,查的头都大了,实在找不到答案,还请大佬能讲一下layout怎么用的,以及set和里面数字具体含义。

再问一句,SAMPLE_FROM_RT,RT是什么的缩写?

1赞

RT 是 RenderTexture 的缩写。

谢谢!太感动了. 终于有官方人员回复了,麻烦先别走再往下看看

从上午谷歌到现在,终于Layout大概明白什么意思,竟然还是在一篇写Vulkan的文章上找到的Layout(set=m)是什么意思.

builtin-sprite.effect中的

layout(set = 2, binding = 11) uniform sampler2D cc_spriteTexture;

按照上面的解释,这个2跟11是pipeline中的第二个descriptor set layout的pBinding成员里的第11个descriptor set

新问题来了,我应该去哪查看pipeline中的descriptor set layout跟pBind?
目前在看论坛文章:深入理解Cocos渲染管线,还没看完,即使看了原理,也不知道这个数字怎么来。。

担心以后自己用shader的时候,会遇到需要写layout(set =x,binding=y)时,而不了解pipeline导致无从下手。

希望未来官方的.effect能完善下注释,遇到这种硬编码数字,真的完全不知道怎么下手。

目前这一块不需要用户关心,没有文档。

你可以在引擎源码下,搜索一下 layout(set = 2 。

cocos/core/pipeline/define.ts

谢谢!还是最好具备查看源代码的能力.
先跳过这块.