[英]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.