簡體   English   中英

帶1D數據緩沖區的金屬計算着色器?

[英]Metal compute shader with 1D data buffer in and out?

我知道可以將一維數組緩沖區傳遞給金屬着色器,但是可以將其輸出到一維數組緩沖區嗎? 我不希望它寫入紋理-我只需要一組處理后的值即可。

我可以使用以下代碼使用着色器獲得值,但它們一次是一個值。 理想情況下,我可以取出整個數組(與輸入1D數組緩沖區的順序相同)。

任何例子或指針將不勝感激!

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);
 )

兩件事情:

  • 您需要創建足夠大的緩沖區以容納float3元素。 你真的需要使用.stride不是 .size計算緩沖區大小的時候,雖然。 特別是, float3具有16個字節的對齊方式,因此數組元素之間存在填充。 因此,您將使用諸如MemoryLayout<float3>.stride * desiredNumberOfElements類的東西。

  • 然后,在着色器中,您需要將outBuffer的聲明從引用更改為指針。 因此, device float3 *outBuffer [[buffer(6)]] 然后,您可以對其進行索引以訪問元素(例如outBuffer[2] = ...; )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM