金属内核功能缺少缓冲区绑定以随时间变化吗?

时间:2019-04-16 03:22:19

标签: ios swift metal

我开发了一个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是为了让效果随时间变化成为视频。有谁知道如何在内核函数上应用时间或如何在iOS Metal中绑定timeDelta缓冲区以解决错误?非常感谢。

2 个答案:

答案 0 :(得分:1)

在您的应用代码中,您没有在setBuffer()上以索引0调用setBytes()MTLComputeCommandEncoder。您的应用程序没有为着色器提供所需的缓冲区。

顺便说一句,您应该为constant使用timeDelta地址空间,而不是device。另外,假设只有一个值,请不要使用数组语法,而应使用引用语法。所以:

     constant float &timeDelta [[buffer(0)]],

,只需直接在代码中使用timeDelta。 (无需[0]或声明本地副本time。)

答案 1 :(得分:0)

感谢Ken Thomases的回答,您对我有很大帮助。我已经通过添加代码解决了这个问题

computeEncoder.setBytes(&timing, length: MemoryLayout<Float>.size, index: 0)

timing是一个随机浮点数,它每次更改一次都会更改computeEncoder的字节以创建我喜欢的动画。希望我的问题对任何有相同问题的人有所帮助。谢谢大家。