2017-11-01 6 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 동시 액세스를 피하기위한 조치를 취해야합니다.