我有glsl代码:
struct PStruct{
vec2 P1;
vec2 P2;
}
layout(std430) buffer MyList
{
PStruct list[];
}
在每个vec2 P1声明之后,我是否需要使用C语言进行填充以得到正确的对齐方式?
struct PStruct{
float P1[2];
float padding1[2];
float P2[2];
float padding2[2];
}
答案 0 :(得分:1)
在每个vec2 P1声明之后,我是否需要使用C语言进行填充以得到正确的对齐方式?
不,你不能那样做。
在GLSL中,结构PStruct
的大小为16个字节,P1
和P2
对齐为8个字节:
struct PStruct{
vec2 P1;
vec2 P2;
}
这将导致buffer MyList
会被紧紧包装
layout(std430) buffer MyList
{
PStruct list[];
}
这与C中的以下结构相对应,其大小为16个字节,P1
和P2
的大小为8个字节,并对齐为4个字节:
struct PStruct{
float P1[2];
float P2[2];
}
有关说明,请分别参见std140
布局std340
的规则2、4和9:
请参见OpenGL 4.6 API Core Profile Specification; 7.6.2.2 Standard Uniform Block Layout; page 144:
....
- 如果该成员是具有由N个基本机器单元组成的分量的二分量或四分量向量,则基本对齐方式分别为2N或4N。
...
- 如果成员是标量或向量的数组,则根据规则(1),(2)和(3)将基本对齐方式和数组跨度设置为匹配单个数组元素的基本对齐方式。四舍五入到
vec4
的基本对齐方式。数组的末尾可能有填充;数组后成员的基本偏移量将四舍五入到基本对齐方式的下一个倍数。...
- 如果成员是结构,则该结构的基本对齐方式为N,其中N是其任何成员的最大基本对齐方式值,并向上舍入为
li>vec4
的基本对齐方式。...
使用
std430
存储布局时,着色器存储块在缓冲区存储中的布局将与使用std140
布局的统一和着色器存储块相同,除了数组的基本对齐方式和步幅规则4中的标量和向量以及规则9中的结构没有四舍五入vec4
的基本对齐方式的倍数。