MSL - Как указать параметры единого массива в шейдере металла? - PullRequest
1 голос
/ 01 мая 2020

Я пытаюсь передать равномерный массив в металлический шейдер, например:

fragment vec4 fragment_func(constant float4& colors[3] [[buffer(0)]], ...) {...}

Я получаю сообщение об ошибке:

"NSLocalizedDescription" : "Compilation failed: \n\nprogram_source:2:1917: error: 'colors' declared as array of references of type 'const constant float4 &'\nprogram_source:2:1923: 
error: 'buffer' attribute cannot be applied to types\nprogram_source:2:1961:

Я понимаю, что буфер Атрибут может применяться только к указателям и ссылкам. В таком случае, как правильно передать одинаковые массивы в MSL?

Редактировать: Спецификации MSL утверждают, что для атрибутов буфера поддерживаются "массивы типов буферов". Я должен делать что-то синтаксически неправильно?

Ответы [ 2 ]

2 голосов
/ 01 мая 2020

Массивы ссылок не разрешены в C ++, и MSL не поддерживает их как расширение.

Однако вы можете взять указатель на тип, содержащийся в массиве:

fragment vec4 fragment_func(constant float4 *colors [[buffer(0)]], ...) {...}

При необходимости вы можете передать размер массива в качестве другого параметра буфера или просто убедиться, что ваша функция шейдера не читает больше элементов, чем присутствует в буфере.

Тогда доступ к элементам так же просто, как обычный разыменование:

float4 color0 = *colors;   // or, more likely:
float4 color2 = colors[2];
1 голос
/ 01 мая 2020

Вы также можете использовать:

fragment vec4 fragment_func(constant float4 colors [[buffer(0)]][3], ...) {...}

Это неприятный побочный эффект от того, как работает синтаксис атрибута в C ++. Преимущество этого способа заключается в том, что он сохраняет тип на colors более напрямую.

...