2017-10-30 3 views
0

Ich verstehe, dass es möglich ist, einen 1D-Array-Puffer an einen Metall-Shader zu übergeben, aber ist es möglich, ihn an einen 1D-Array-Puffer ausgeben zu lassen? Ich möchte nicht, dass es in eine Textur schreibt - ich brauche nur ein Array von verarbeiteten Werten.Metal Compute Shader mit 1D Datenpuffer rein und raus?

Ich kann Werte mit dem Shader mit dem folgenden Code abrufen, aber sie sind jeweils ein Wert. Im Idealfall könnte ich ein ganzes Array herausholen (in der gleichen Reihenfolge wie der Input-1D-Array-Puffer).

Alle Beispiele oder Hinweise würden sehr geschätzt werden!

var resultdata = [Float](repeating: 0, count: 3) 
let outVectorBuffer = device.makeBuffer(bytes: &resultdata, length: MemoryLayout<float3>.size, options: []) 
commandEncoder!.setBuffer(outVectorBuffer, offset: 0, index: 6) 

commandBuffer!.addCompletedHandler {commandBuffer in 
    let data = NSData(bytes: outVectorBuffer!.contents(), length: MemoryLayout<float3>.size) 
    var out: float3 = float3(0,0,0) 
    data.getBytes(&out, length: MemoryLayout<float3>.size) 
    print("data: \(out)") 
} 

//In the Shader: 
kernel void compute1d(
    ... 
    device float3 &outBuffer [[buffer(6)]], 
    outBuffer = float3(1.0, 2.0, 3.0); 
) 

Antwort

0

Zwei Dinge:

  • Sie müssen die Puffer groß genug, um schaffen, aber viele float3 Elemente zu halten, wie Sie wollen. Sie müssen jedoch wirklich .stride und nicht.size bei der Berechnung der Puffergröße verwenden. Insbesondere hat float3 eine 16-Byte-Ausrichtung, so dass zwischen den Elementen in einem Array ein Padding vorhanden ist. Also würden Sie etwas wie MemoryLayout<float3>.stride * desiredNumberOfElements verwenden.

  • Dann müssen Sie im Shader die Deklaration outBuffer von einer Referenz auf einen Zeiger ändern. Also, device float3 *outBuffer [[buffer(6)]]. Dann können Sie darin indizieren, um auf die Elemente zuzugreifen (z. B. outBuffer[2] = ...;).

+0

Vielen Dank für die Info. Kannst du mir zeigen, wie ich 'var out: float3' definieren würde? C-artige Arrays sind in Swift nicht erlaubt, daher bin ich mir nicht sicher, wie das aussehen würde. –

+0

Egal - denke, ich habe es jetzt funktioniert - danke !!! –

Verwandte Themen