繁体   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