본문 바로가기
🍎/Metal

[Thirty Days of Metal] Day2-Buffers

by venniek 2022. 12. 31.

원문: Thirty Days of Metal-Day 2: Buffers

위 글을 공부하고 요약했습니다.

 

버퍼는 그래픽 프로그래밍에서 필수적이다. GPU가 작동하는 데이터를 가지고 있기 때문이다.

Data

Metal에서 선을 그리려면 버퍼에 선의 정점을 저장하고 해당 버퍼 안에 데이터를 기반으로 선을 그리도록 GPU에게 명령해야 한다.

 

Creating a Buffer

devicemakeBuffer(length:options:) 메서드를 사용해 버퍼를 만든다.

let buffer = device.makeBuffer(length: 16, options: [])!
  • length: 바이트 단위로 버퍼 메모리의 크기
  • option: 버퍼를 만들 때 조절할 수 있는 것들. 여기서는 비워둔다.

 

Copying Data into a Buffer

2D 선의 정점을 버퍼에 넣어보자.

buffercontents() 메서드로 버퍼의 메모리를 가리키는 포인터를 받아온다. 이 메서드는 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

댓글