浮动数组对齐错误
Wrong alignment for floats array
我将统一缓冲区传递给 vulkan 中的计算着色器。缓冲区包含一个由 49 个浮点数组成的数组(高斯矩阵)。一切都很好,但是当我在着色器中读取数组时,它只给出了 13 个值,其他的是 0 或 gunk,它们对应于初始数组的 0、4、8 等。我认为这是某种对齐问题
着色器布局
struct Pixel
{
vec4 value;
};
layout(push_constant) uniform params_t
{
int width;
int height;
} params;
layout(std140, binding = 0) buffer buf
{
Pixel imageData[];
};
layout (binding = 1) uniform sampler2D inputTex;
layout (binding = 2) uniform unf_t
{
float gauss[SAMPLE_SIZE*SAMPLE_SIZE];
};
会不会是绑定 0 影响绑定 2?如果是这样,我如何将数组复制到具有所需对齐方式的缓冲区?目前我使用
vkCmdUpdateBuffer(a_cmdBuff, a_uniform, 0, a_gaussSize, (const uint32_t *)gauss)
或者分成不同的集合可能更好?
编辑:通过扩展缓冲区和数组,我设法以 16 对齐传递它,一切都很好,但它看起来像是在浪费内存。如何将浮点数对齐 4?
统一块要求数组元素与 vec4(16 字节)对齐。
要解决此问题,您可以改用 vec4,您可以传递 52 个浮点数,然后根据 index/4
和 index%4
.
获取正确的组件
我将统一缓冲区传递给 vulkan 中的计算着色器。缓冲区包含一个由 49 个浮点数组成的数组(高斯矩阵)。一切都很好,但是当我在着色器中读取数组时,它只给出了 13 个值,其他的是 0 或 gunk,它们对应于初始数组的 0、4、8 等。我认为这是某种对齐问题
着色器布局
struct Pixel
{
vec4 value;
};
layout(push_constant) uniform params_t
{
int width;
int height;
} params;
layout(std140, binding = 0) buffer buf
{
Pixel imageData[];
};
layout (binding = 1) uniform sampler2D inputTex;
layout (binding = 2) uniform unf_t
{
float gauss[SAMPLE_SIZE*SAMPLE_SIZE];
};
会不会是绑定 0 影响绑定 2?如果是这样,我如何将数组复制到具有所需对齐方式的缓冲区?目前我使用
vkCmdUpdateBuffer(a_cmdBuff, a_uniform, 0, a_gaussSize, (const uint32_t *)gauss)
或者分成不同的集合可能更好?
编辑:通过扩展缓冲区和数组,我设法以 16 对齐传递它,一切都很好,但它看起来像是在浪费内存。如何将浮点数对齐 4?
统一块要求数组元素与 vec4(16 字节)对齐。
要解决此问题,您可以改用 vec4,您可以传递 52 个浮点数,然后根据 index/4
和 index%4
.