30Days of Metal - 2.Buffer

Martin Kim·2022년 12월 6일

30DaysOfMetal

목록 보기
2/3

Data

  • 대부분의 그래픽 API에서는 선을 그리려는 경우 drawLine() 같은 선분을 그리기 위해 호출되는 함수가 있거나 선이 시작하고 끝나는 위치를 지정하는 메서드가 제공됨
  • Metal에는 이러한 API가 존재하지 않음. 대신 선을 그리려면 선의 끝점을 Buffer에 저장한 다음 해당 버퍼의 데이터를 기반으로 선을 그리도록 GPU에 명령을 내려야 함.

Buffer

  • 그래픽 프로그래밍에서 필수
  • GPU가 수행할 데이터를 가지고 있음

Buffer 생성하기

  • device 객체로부터 makeBuffer(length:options:) 메서드를 호출해서 Metal의 Buffer를 생성할 수 있음.
let buffer = device.makeBuffer(length: 16, options: [])!
  • length: 버퍼 메모리 바이트 크기, options: buffer 생성 시 추가 옵션 지정

Buffer에 Data 복사하여 2차원 line의 양 끝점을 넣기

  • 먼저, buffer의 메모리의 포인터를 얻기 위해 contents() 메서드를 호출, 이 메서드는 UnsafeMutableRawPointer 타입을 리턴
  • 이 뜻은, Swift 언어가 버퍼가 어떤 유형인지, 얼마나 많은 메모리를 보유하고 있는지 전혀 모른다는 뜻을 의미.
  • 포인터에 타입 정보를 추가하기 위해 포인터를 특정 타입에 바인딩 할 수 있음.
  • 2차원 점을 저장하는 가장 자연스러운 Swift 유형은 2개의 부동소수점 좌표를 포함하는 벡터 타입인 SIMD2<Float>임.
  • buffer를 이 타입에 바인딩하여, 두 지점에 대한 공간이 있음을 나타냄
let points = buffer.contents().bindMemory(to: SIMD2<Float>.self,
                                          capacity: 2)
  • 메모리를 바인딩하면 점(point)을 일반적인 Swift 배열 요소처럼 처리할 수 있다는 의미
  • 다음과 같이 array 요소를 즉시 버퍼에 할당
points[0] = SIMD2<Float>(10, 10)
points[1] = SIMD2<Float>(100, 100)
  • 버퍼에 성공적으로 기록되었는지 확인하기 위해서 두번째 점를 검색하고 해당 값을 출력해 보기
let p1 = points[1]
print("p1 is \(p1)")
// 출력: p1 is SIMD2<Float>(100.0, 100.0)

출처: https://medium.com/@warrenm/thirty-days-of-metal-day-2-buffers-ec8c81040e3e

profile
학생입니다

0개의 댓글