2017-10-30 11 views
0

1Dアレイバッファをメタルシェーダに渡すことは可能ですが、1Dアレイバッファに出力することは可能ですか?私はそれがテクスチャに書き込むことを望んでいません - 私はちょうど処理された値の配列が必要です。1Dデータバッファを搭載した金属計算シェーダ?

次のコードでシェーダで値を取得できますが、それらは一度に1つの値です。理想的には、配列全体を(入力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); 
) 

答えて

0

2つのこと:

  • あなたが望むようしかし、多くのfloat3の要素を保持するのに十分な大きさのバッファを作成する必要があります。しかし、実際には、.strideではなく、.sizeを計算する必要があります。特に、float3は16バイトのアライメントを持っているため、配列内の要素間にはパディングがあります。したがって、MemoryLayout<float3>.stride * desiredNumberOfElementsのようなものを使用します。

  • 次に、シェーダでは、outBufferの宣言をポインタからの参照に変更する必要があります。従って、device float3 *outBuffer [[buffer(6)]]。次に、要素にインデックスを作成して要素にアクセスできます(例:outBuffer[2] = ...;)。

+0

ありがとうございました。 'var out:float3'をどう定義するか教えてください。 SwiftではCスタイルの配列は許可されていないので、どのように見えるか分かりません。 –

+0

心配しないで - 私はそれが今働いていると思う - ありがとう! –

関連する問題