2017-10-30 10 views
0

메탈 쉐이더에 1D 배열 버퍼를 전달하는 것이 가능하지만 1D 배열 버퍼로 출력 할 수 있습니까? 텍스처에 쓰기를 원하지 않습니다. 단지 처리 된 값의 배열이 필요합니다.1D 데이터 버퍼가 들어갔다 나오는 금속 계산 쉐이더?

다음 코드를 사용하여 셰이더에서 값을 가져올 수 있지만 한 번에 하나의 값입니다. 이상적으로는 전체 배열을 (입력 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

두 가지 :

  • 당신은 당신이 원하는 그러나 많은 float3 요소를 저장하기에 충분히 큰 버퍼를 작성해야합니다. 버퍼 크기를 계산할 때는 .stride이 아닌.size을 사용해야합니다. 특히 float3에는 16 바이트 정렬이 있으므로 배열의 요소 사이에 패딩이 있습니다. 따라서 MemoryLayout<float3>.stride * desiredNumberOfElements과 같은 것을 사용하십시오.

  • 그런 다음 셰이더에서 포인터에 대한 참조에서 outBuffer의 선언을 변경해야합니다. 그래서 device float3 *outBuffer [[buffer(6)]]. 그런 다음 요소에 액세스하기 위해 색인을 생성 할 수 있습니다 (예 : outBuffer[2] = ...;).

+0

정보 주셔서 감사합니다. 'var out : float3'을 정의하는 방법을 보여줄 수 있습니까? C 스타일 배열은 Swift에서 허용되지 않으므로 어떻게 보이는지 확신 할 수 없습니다. –

+0

절대 신경 쓰지 마라. - 내가 지금 일하고 있다고 생각해. - 고마워! –