我开发了一个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缓冲区以解决错误?非常感谢。
答案 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的字节以创建我喜欢的动画。希望我的问题对任何有相同问题的人有所帮助。谢谢大家。