Неправильное выравнивание для массива с плавающей точкой - PullRequest
0 голосов
/ 24 октября 2019

Я передаю единый буфер для вычисления шейдера в 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?

1 Ответ

1 голос
/ 28 октября 2019

Для единообразных блоков требуется, чтобы элементы массива были выровнены по vec4 (16 байт).

Чтобы обойти это, вместо этого вы используете vec4, вы можете передать 52 числа с плавающей запятой и затем взять правильный компонент на основе index/4 и index%4.

...