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是什么的缩写?