Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在glsl struct中,我是否需要为vec2类型进行填充(使用布局std430)_Glsl_Compute Shader - Fatal编程技术网

在glsl struct中,我是否需要为vec2类型进行填充(使用布局std430)

在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语言中,我是否

我有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语言中,我是否需要在每个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:

见:

  • 如果成员是两分量或四分量向量,且分量消耗N个基本机器单元,则基本对齐分别为2N或4N
  • 如果成员是标量或向量数组,则根据规则(1)、(2)和(3)将基本对齐和数组跨距设置为与单个数组元素的基本对齐匹配,并向上舍入到
    vec4
    的基本对齐。数组的末尾可能有填充;阵列后面的杆件的基准偏移向上舍入到基准路线的下一个倍数
  • 如果构件是结构,则结构的基准对齐为N,其中N是其任何构件的最大基准对齐值,并向上舍入为a
    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],所以这回答了我的问题。