Передайте массив в структуре uniforms в шейдер Metal - PullRequest
0 голосов
/ 27 мая 2020

У меня есть структура Uniforms, определенная в Swift как:

struct Uniforms {
    var t = Float(0.0)
    var arr = [0.2, 0.2, 0.2, 0.2, 0.2]
}

Однако я не могу выделить для нее правильный MTLBuffer, потому что MemoryLayout<Uniforms>.stride возвращает 16. Это противоречит утверждению в спецификации Swift о том, что массив является типом значения. Фактически он рассматривается как ссылочный тип MemoryLayout.

Короче говоря, как я могу передать структуру Uniforms, содержащую массив, в шейдер (я использую постоянное пространство имен для передачи, все хорошо там). Нужно ли мне передавать массив отдельно с помощью отдельного аргумента [[buffer (n)]], в который я бы скопировал память из массива? Есть варианты попроще?

1 Ответ

1 голос
/ 27 мая 2020

Поскольку Swift не дает никаких гарантий относительно макета структуры, было бы опасно копировать содержимое такой структуры напрямую в буфер Metal (также, как написано, массив содержит Double s, которые в настоящее время не поддерживаются Metal. тем не мение). Есть несколько разных подходов, которые могут работать, в зависимости от формы реальной проблемы.

Если вы знаете максимальное количество элементов в массиве, вы можете добавить член структуры, указывающий фактическое количество, и сделать последний элемент структуры, ожидаемой вашим шейдером, представляет собой массив фиксированной длины:

#define MAX_VALUE_COUNT 1024
struct ShaderUniforms {
    float t;
    uint32_t valueCount;
    float values[MAX_VALUE_COUNT];
};

Затем в Swift вы можете выделить металлический буфер максимального размера (4104 байта в этом надуманном случае) и скопируйте необходимое количество элементов массива в буфер (которому, конечно же, предшествуют другие элементы структуры).

В качестве альтернативы, да, вы можете использовать отдельный параметр буфера типа указателя (например, constant float *values [[buffer(1)]]) . Это позволит вам иметь счетчик значений, который не ограничен ничем, явно закодированным в шейдере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...