我想要在时间增加的粒子。我得到了advice,它将缓冲值设置得更高,这样我就可以玩弄粒子的数量。我在想的是我将有一个最大计数大小设置为缓冲区,然后在shader
,我将有一个struct
与数组采取粒子属性。金属着色语言 - 缓冲区绑定
我有这个在我swift
:相应
vectBuffer = device!.makeBuffer(length: MemoryLayout<float3>.size * vectMaxCount, options: [])
和更新buffer
:
var vectMaxCount = 10
var metalvects = [float3(0.0,0.0,0.0),float3(1.0,0.0,0.0),float3(2.0,0.0,0.0)]
var vectBuffer: MTLBuffer!
然后我注册buffer
...
command_encoder.setBuffer(vectBuffer, offset: 0, at: 2)
var bufferPointer = vectBuffer.contents()
memcpy(bufferPointer, &metalvects, MemoryLayout<float3>.size * vectMaxCount)
let threadGroupCount = MTLSizeMake(8, 8, 1)
let threadGroups = MTLSizeMake(drawable.texture.width/threadGroupCount.width, drawable.texture.height/threadGroupCount.height, 1)
command_encoder.dispatchThreadgroups(threadGroups, threadsPerThreadgroup: threadGroupCount)
command_encoder.endEncoding()
command_buffer.present(drawable)
command_buffer.commit()
,并试图得到它metal
file:
struct Vects
{
float3 position[100];
};
kernel void compute(texture2d<float, access::write> output [[texture(0)]],
constant Vects &vects [[buffer(2)]],
uint2 gid [[thread_position_in_grid]]) {
...
}
,我得到了一个错误:
validateComputeFunctionArguments:727: failed assertion `(length - offset)(160) must be >= 1600 at buffer binding at index 2 for vects[0].'
它指示线command_encoder.dispatchThreadgroups(threadGroups, threadsPerThreadgroup: threadGroupCount)
给我的错误。我读了一些关于buffer binding
,我认为是我发送给我的问题threadGroupCounts
或ThreadGroup
的方式。
如果我将float3 position[100];
更改为float3 position[7];
,它仍然有效。超过7的任何东西都会得到类似的错误。
我该如何解决这个问题?
是否有一个很好的公式来估计threadGroups
和threadGroupCount
?即使经验法则做到这一点?
Update01
基于肯Thomases的答案,我在我的代码更改为:
迅速:
vectBuffer = device!.makeBuffer(length: MemoryLayout<float3>.stride * metalvects.count, options: [])
...
memcpy(bufferPointer, &metalvects, MemoryLayout<float3>.stride * metalvects.count)
...
金属:
struct Vects
{
float3 position[3];
};
...
它的工作现在。但是我如何分配更高的缓冲区内存,以便在后面提到的this post等应用中使用?
请检查update01。我从你回答的另一篇文章中引用了参考文献。 – sooon
当*分配缓冲区时,您可以并应该继续使用'vextMaxCount'。这只是对'memcpy()'的调用,你应该使用'metalvects.count'。 –
是的,它的工作原理。我需要阅读更多关于“内存布局”等内容。你有什么好的建议吗? – sooon