#ios #swift #metal
#iOS #swift #Металлические
Вопрос:
Я разработал приложение для металлической камеры iOS, но у меня ошибка:
Compute Function(kernel_function): missing buffer binding at index 0 for timeDelta[0]
.
Код ядра выглядит следующим образом:
kernel void kernel_function(
texture2d<float, access::sample> inTexture [[texture(0)]],
texture2d<float, access::write> outTexture [[texture(1)]],
const device float *timeDelta [[buffer(0)]],
uint2 gid [[thread_position_in_grid]],
uint2 tpg [[threads_per_grid]])
{
float time = timeDelta[0];
.......
Кажется, что проблема заключается timeDelta
в том, чтобы пропустить привязку буфера. Если я удалю timeDelta[0]
и установлю
float time = 1.0
Ошибок нет, и приложение может работать бесперебойно. Но экранный эффект — это фиксированное изображение, а не анимация. Таким timeDelta
образом, эффект должен меняться со временем, чтобы быть видео. Кто-нибудь знает, как применить время к функции ядра или привязать буфер timeDelta в iOS Metal для устранения ошибки?. Большое спасибо.
Ответ №1:
В коде вашего приложения вы не вызывали setBuffer()
or setBytes()
с индексом 0 на MTLComputeCommandEncoder
. Ваше приложение не снабжает шейдер необходимым буфером.
Кстати, вы должны использовать constant
адресное пространство для timeDelta
, а не device
. Кроме того, предполагая, что существует только одно значение, не используйте синтаксис массива, используйте ссылочный синтаксис. Итак:
constant float amp;timeDelta [[buffer(0)]],
и просто используйте timeDelta
непосредственно в коде. (Нет необходимости [0]
или объявлять локальную копию, time
.)
Ответ №2:
Спасибо Кену Томасу за ваш ответ, и вы мне очень помогли. Я решил вопрос, добавив код
computeEncoder.setBytes(amp;timing, length: MemoryLayout<Float>.size, index: 0)
И timing
является случайным плавающим значением для изменения байтов computeEncoder каждый раз, чтобы создавать анимацию, как мне нравится. Надеюсь, мой вопрос поможет всем, у кого есть такой же вопрос. Спасибо всем.