В функции металлического ядра отсутствует привязка буфера для изменения со временем?

#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 каждый раз, чтобы создавать анимацию, как мне нравится. Надеюсь, мой вопрос поможет всем, у кого есть такой же вопрос. Спасибо всем.