在glsl struct中,我是否需要为vec2类型进行填充(使用布局std430)
我有glsl代码:在glsl struct中,我是否需要为vec2类型进行填充(使用布局std430),glsl,compute-shader,Glsl,Compute Shader,我有glsl代码: struct PStruct{ vec2 P1; vec2 P2; } layout(std430) buffer MyList { PStruct list[]; } 在C语言中,我是否需要在每个vec2 P1声明之后进行填充以获得正确的对齐方式: struct PStruct{ float P1[2]; float padding1[2]; float P2[2]; float padding2[2]; } 在C语言中,我是否
struct PStruct{
vec2 P1;
vec2 P2;
}
layout(std430) buffer MyList
{
PStruct list[];
}
在C语言中,我是否需要在每个vec2 P1声明之后进行填充以获得正确的对齐方式:
struct PStruct{
float P1[2];
float padding1[2];
float P2[2];
float padding2[2];
}
在C语言中,我是否需要在每个vec2 P1声明之后进行填充以获得正确的对齐方式:
struct PStruct{
float P1[2];
float padding1[2];
float P2[2];
float padding2[2];
}
不,你不能那样做
在GLSL中,结构PStruct
的大小为16个字节,P1
和P2
对齐为8个字节:
struct PStruct{
vec2 P1;
vec2 P2;
}
这将导致缓冲区MyList
被紧密打包
layout(std430) buffer MyList
{
PStruct list[];
}
这对应于C中的以下结构,其大小为16个字节,P1
和P2
的大小为8个字节,并与4个字节对齐:
struct PStruct{
float P1[2];
float P2[2];
}
有关说明,请参见
std140
布局的规则2、4和9:
见:
vec4
的基本对齐。数组的末尾可能有填充;阵列后面的杆件的基准偏移向上舍入到基准路线的下一个倍数vec4
的基准对齐std430
存储布局时,着色器存储块将以与使用std140
布局的统一和着色器存储块相同的方式放置在缓冲存储器中,除了第4条规则中标量和向量数组以及第9条规则中结构数组的基本对齐方式和跨距没有向上舍入vec4
的基本对齐方式的倍数
不清楚你在问什么。什么是C数据结构?
std140
和std340
布局之间的区别在于,数组的基本对齐和跨距没有向上舍入为vec4
的基本对齐的倍数,即16字节PStruct
的大小为16字节,所以没有区别。我正在将CPU内存中的C语言结构映射到GPU内存中的相同结构。我在问是否需要添加padding1和padding2,或者如果C中与vec2
对应的数据类型类似于float[2]
,则不需要任何填充。注意,在C中,类型struct PStruct{float P1[2],P2[2];}
的大小是16。谢谢。vec2类型在我的代码中定义为float[2],所以这回答了我的问题。