首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SSBO中数组对齐的设置

SSBO中数组对齐的设置
EN

Stack Overflow用户
提问于 2018-09-14 08:42:13
回答 1查看 1.5K关注 0票数 1

在计算着色器中,我有一个粒子的结构:

代码语言:javascript
复制
struct Particle {
    float delta;
    float start_posx;
    float start_posy;
    float start_posz;
    float restart;
    uint max_textures;
    float max_lifetime;
};

现在,我想在SSBO中使用这个结构:

代码语言:javascript
复制
layout (std430, binding = 12) buffer particleBlock {
    Particle particles[];
};

我假设我的粒子在ssbo中被紧密地压缩,因为所有的结构成员都是4。如果我将对齐设置为16:

代码语言:javascript
复制
layout (std430, binding = 12) buffer particleBlock {
    layout(align = 16) Particle particles[];
};

particles1是否会被抵消32?我不知道数组是如何对齐的,这似乎不适用于我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-14 12:30:39

单个数组元素不能由align限定符对齐。只能对齐数组的开始。

GLSL - OpenGL阴影语言4.6;4.4.5。统一和着色存储块布局限定符;第85页

对齐限定符使每个块成员的开始具有最小字节对齐。它不影响每个成员的内部布局,而内部布局仍将遵循std140或std430规则。 ..。 当应用于数组时,它只影响数组的开始,而不影响数组的内部步长.

如果要使用std140限定符,那么struct Particle的数组将具有32的步长,因为该步长被舍入到vec4的基对齐倍数,即16。

注意,std140 std430 标准之间的一个主要区别是,在std430情况下,数组元素的跨距不会舍入到16个字节的倍数。

如果struct Particle应该有32个字节的大小,那么可以在末尾添加一个虚拟成员:

代码语言:javascript
复制
struct Particle {
    float delta;        //  0
    float start_posx;   //  4
    float start_posy;   //  8
    float start_posz;   // 12
    float restart;      // 16
    uint  max_textures; // 20
    float max_lifetime; // 24
    float dummy;        // 28: dummy member for the alignment
};
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52328129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档