2017-11-01 20 views
0

私はMTLBufferを定義して、バッファに直接(またはできるだけ効率的に)データを取り込みたいと考えています。作成後のMTLBufferの値を変更する

シェイダーで使用される値は、MTLBufferの作成後に設定される3.0と4.0ではなく、1.0と2.0(それぞれXとY)です。私はセレクタを認識していないようだが、didModifyRange:pointDataBufferを呼び出す必要がありますように

int bufferLength = 128 * 128; 

float pointBuffer[bufferLength * 2]; // 2 for X and Y 

//Populate array with test values 
for (int i = 0; i < (bufferLength * 2); i += 2) { 
    pointBuffer[i] = 1.0;  //X 
    pointBuffer[i + 1] = 2.0; //Y 
} 

id<MTLBuffer> pointDataBuffer = [device newBufferWithBytes:&pointBuffer length:sizeof(pointBuffer) options:MTLResourceOptionCPUCacheModeDefault]; 

//Populate array with updated test values  
for (int i = 0; i < (bufferLength * 2); i += 2) { 
    pointBuffer[i] = 3.0;  //X 
    pointBuffer[i + 1] = 4.0; //Y 
} 

//In the (Swift) class with the pipeline: 
commandEncoder!.setBuffer(pointDataBuffer, offset: 0, index: 4) 

は、ドキュメントに基づいて、それはそうです。

MTLBufferを再作成することなくアレイを更新する方法はありますか?

答えて

0

-newBufferWithBytes:...は、渡されたバイトのコピーを作成します。それはそれらを参照し続けることはありません。したがって、その後の変更はpointBufferに影響しません。

ただし、このようなバッファ(そのストレージモードはプライベートではない)は、-contentsメソッドを使用してストレージにアクセスします。ですから、次のようなことができます:

float *points = pointDataBuffer.contents; 
for (int i = 0; i < (bufferLength * 2); i += 2) { 
    points[i] = 3.0;  //X 
    points[i + 1] = 4.0; //Y 
} 

注意してください。 CPUとGPUは、互いに非同期に動作します。バッファを参照するGPUによって処理されているコマンドがある場合、CPUから変更すると、それらのコマンドの動作が妨げられる可能性があります。したがって、バッファへのアクセスを同期させるための手順を取ったり、CPUとGPUの同時アクセスを避けたりする必要があります。

関連する問題