원문: Thirty Days of Metal-Day 2: Buffers
위 글을 공부하고 요약했습니다.
버퍼는 그래픽 프로그래밍에서 필수적이다. GPU가 작동하는 데이터를 가지고 있기 때문이다.
Data
Metal
에서 선을 그리려면 버퍼에 선의 정점을 저장하고 해당 버퍼 안에 데이터를 기반으로 선을 그리도록 GPU에게 명령해야 한다.
Creating a Buffer
device
의 makeBuffer(length:options:)
메서드를 사용해 버퍼를 만든다.
let buffer = device.makeBuffer(length: 16, options: [])!
length
: 바이트 단위로 버퍼 메모리의 크기option
: 버퍼를 만들 때 조절할 수 있는 것들. 여기서는 비워둔다.
Copying Data into a Buffer
2D 선의 정점을 버퍼에 넣어보자.
buffer
의 contents()
메서드로 버퍼의 메모리를 가리키는 포인터를 받아온다. 이 메서드는 UnsafeMutableRawPointer
를 반환하는데, 버퍼가 어떤 타입을 가지고 있는지, 메모리를 얼마 가지고 있는지 모른다.
포인터에 타입 정보를 넣기 위해 특정 타입을 bind
해야 한다. 스위프트에서 보통 2D 포인트를 저장하는 타입은 두 실수형 좌표를 가진 벡터 타입인 SIMD2<Float>
이다.
let points = buffer.contents().bindMemory(to: SIMD2<Float>.self, capacity: 2)
points
는 점 2개를 저장할 수 있는 공간을 가지게 됐다.
메모리를 bind
하면 배열처럼 사용할 수 있다. points
에 원소를 할당하면 버퍼에 바로 데이터가 복사된다.
points[0] = SIMD2<Float>(10, 10)
points[1] = SIMD2<Float>(100, 100)
전체 코드, 출력 결과
import Metal
let device = MTLCreateSystemDefaultDevice()!
let buffer = device.makeBuffer(length: 16, options: [])!
print("Buffer is \(buffer.length) bytes in length")
let points = buffer.contents().bindMemory(to: SIMD2<Float>.self, capacity: 2)
points[0] = SIMD2<Float>(10, 10)
points[1] = SIMD2<Float>(100, 100)
let p1 = points[1]
print("p1 is \(p1)")

'🍎 > Metal' 카테고리의 다른 글
[Thirty Days of Metal] Day3-Commands (0) | 2023.01.01 |
---|---|
[Thirty Days of Metal] Day1-Devices (0) | 2022.12.31 |
댓글