在我的顶点着色器中,我有一个SSBO,用于访问每个对象的各个数据部分。
struct Object
{
vec2 vertices[4];
uint index;
vec2 position;
};
layout(set = 0, binding = 0) buffer ObjectBuffer
{
Object objects[];
};我没有问题访问前两个元素vertices和index。然而,当我访问position.x时,它给出了position.y中的值,当我访问position.y时,它给了我一些胡言乱语。
为了解决这个问题,我交换了index和position在Object结构中的顺序。
使用我有限的知识,我假设由于内存对齐规则,它接受了结构中最大的数据类型,即vec2 (假设浮点数=4字节,4*2=8字节)。假设uint也是4个字节,那么接下来的4个字节(也就是position.x)作为填充吗?
虽然我能够解决这个问题(目前)通过改变顺序,我还能做什么来确保适当的内存对齐?
发布于 2022-02-23 19:40:10
你能用字节偏移来确定你的物理内存布局吗?
我希望每个对象对齐8字节,包括:
32 bytes (vec2 vertices[4])
4 bytes (index)
4 bytes (padding, as position needs to be 8 byte aligned)
8 bytes (position),我还能做些什么来确保正确的内存对齐?
仔细阅读std430布局规则(对于存储缓冲区)。注意,统一缓冲区默认为std140布局,而不是std430。
https://stackoverflow.com/questions/71216090
复制相似问题