Ich möchte Partikel haben, die mit der Zeit zunehmen werden. Ich habe advice, die den Pufferwert höher einstellen, damit ich mit der Menge der Partikel herumspielen kann. Was ich denke ist, dass ich eine maximale Zählgröße auf den Puffer gesetzt habe, dann werde ich in shader
eine struct
mit Array haben, um das Partikel-Attribut zu nehmen.Metal Shading Language - Pufferbindung
Ich habe dies in meinem swift
:
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!
Dann melde ich mich an die buffer
:
vectBuffer = device!.makeBuffer(length: MemoryLayout<float3>.size * vectMaxCount, options: [])
und aktualisieren Sie die buffer
entsprechend:
...
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()
und versuchen, es zu bekommen aus metal
Datei:
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]]) {
...
}
und ich habe einen Fehler:
validateComputeFunctionArguments:727: failed assertion `(length - offset)(160) must be >= 1600 at buffer binding at index 2 for vects[0].'
Sie die Linie angezeigt command_encoder.dispatchThreadgroups(threadGroups, threadsPerThreadgroup: threadGroupCount)
mir Fehler geben. Ich lese ein wenig über buffer binding
und ich denke, ist die Art, wie ich die threadGroupCounts
oder ThreadGroup
senden, die mir Problem geben.
Wenn ich float3 position[100];
zu float3 position[7];
ändere, funktioniert es immer noch. Irgendetwas mehr als 7 wird den ähnlichen Fehler bekommen.
Wie kann ich das beheben?
Und gibt es eine gute Formel zu schätzen threadGroups
und threadGroupCount
? Auch Faustregel, das zu tun?
swift:
Update01
Basierend auf Ken Thomases Antwort, ich meinen Code ändern
vectBuffer = device!.makeBuffer(length: MemoryLayout<float3>.stride * metalvects.count, options: [])
...
memcpy(bufferPointer, &metalvects, MemoryLayout<float3>.stride * metalvects.count)
...
Metall:
struct Vects
{
float3 position[3];
};
...
Es funktioniert jetzt . Aber wie kann ich höheren Pufferspeicher zuweisen, der später in der App noch zu verwenden ist wie this post?
Bitte überprüfen update01. Ich nehme Bezug auf einen anderen Beitrag, den Sie beantwortet haben. – sooon
Sie können und sollten weiterhin 'vextMaxCount' verwenden, wenn * der * Puffer zugewiesen wird. Es ist nur der Aufruf von 'memcpy()', wo Sie 'metalvects.count' verwenden sollten. –
Yup, es funktioniert. Ich muss mehr über das "Memory Layout" und so lesen. Haben Sie gute Empfehlungen? – sooon