상세 컨텐츠

본문 제목

Metal. Ch 2. 3D Models

TIL/Metal

by box-jeon 2020. 6. 8. 23:22

본문

store.raywenderlich.com/products/metal-by-tutorials

세상에 내가 대체 뭘 공부하고 있는 거지? 2장인데 벌써 생각도 해본적 없는 신세계가 찾아오네요. 3D Model에 대해 알아보고, 샘플로 주어진 모델들을 MTKView에 그려봅니다. 여긴 어디... 난 누구...

What are 3D models?

3D model은 3차원 공간의 점들로 이루어집니다. MDLMesh의 생성자를 이용하면 box, sphere, cone 등 간단한 도형을 코드로 그리는 게 가능하며, 3D file format으로 작성된 모델을 import해서 MDLMesh를 생성할 수도 있습니다. 여기서는 Wavefront Technologies에서 만든 .obj format을 사용하고, 3D modeling app으로 Blender를 사용합니다. 무료인데다 RayWenderlich에서 튜토리얼도 제공한다고 하네요. www.raywenderlich.com/2622-blender-tutorial-for-beginners-how-to-make-a-mushroom

 

Blender Tutorial for Beginners: How To Make A Mushroom

Learn how to make a 3D mushroom in this Blender tutorial for beginners!

www.raywenderlich.com

모르는 개념이 너무 많이 나와서 책에 나오는 내용들을 도저히 정리하기가 어렵습니다. 깨달은 대로 나열해보면

  • Vertex: X, Y, Z 값을 갖는 점입니다. 좌표 뿐 아니라 texture, surface normal(?) 정보들로 구성됩니다.
  • Edge: Vertex를 연결하는 선입니다. 모델에 명시적으로 표현되지는 않습니다.
  • Face: Vertex와 edge로 구성된 면입니다. diffuse color, ambient color, specular color 정보를 가집니다.
  • Triangle: 3개의 vertex로 이루어진 face입니다. 왜 삼각형일까...싶은데 아무래도 모든 면이 삼각형으로 구성된 게 아닌가 싶습니다. 평평한 사각형도 삼각형 두개를 이어 붙여서 구현하고 있는 것 같아요. 아마도 점 3개로 면 하나의 위치를 정의하는 건 가능하지만, 점 4개는 한 면에 있지 않을 수도 있으니까?
  • Material: MDLMesh의 생성자를 이용해 그린 cone이 하나의 material이라고 말하고 있습니다.
  • Material groups: Blender에서 열어본 train의 경우, 여러 개의 material groups으로 이루어져있다고 합니다. 색깔당 하나라고 하는데, Blender에서 표시되는 material list가 wheel, body, chassis, cabin, hub, chimney로 되어 있는 걸 보면 모델을 만들 때 지정하는 단위 요소가 아닌가 싶습니다. Material 당 한 가지 색 밖에 지정을 못하는지도 모르죠.

Vertex descriptors

객체를 생성할 때 descriptor를 사용하는 것은 Metal에서 아주 일반적으로 사용하는 패턴이라고 합니다. 읽어들일 모델 데이터 포맷을 descriptor에 정의해야 합니다. 데이터 포맷을 동적으로 처리해야하는 이유는 아마도 3D file format이 다양하기 때문...이겠죠?

guard let assetURL = Bundle.main.url(forResource: "train", withExtension: "obj") else {
fatalError()
}
let vertexDescriptor = MTLVertexDescriptor()
vertexDescriptor.attributes[0].format = .float3
vertexDescriptor.attributes[0].offset = 0
vertexDescriptor.attributes[0].bufferIndex = 0
vertexDescriptor.layouts[0].stride = MemoryLayout<SIMD3<Float>>.stride
let meshDescriptor = MTKModelIOVertexDescriptorFromMetal(vertexDescriptor)
(meshDescriptor.attributes[0] as! MDLVertexAttribute).name = MDLVertexAttributePosition
let asset = MDLAsset(url: assetURL, vertexDescriptor: meshDescriptor, bufferAllocator: allocator)
let mdlMesh = asset.childObjects(of: MDLMesh.self).first as! MDLMesh
let mesh = try MTKMesh(mesh: mdlMesh, device: device)

Metal coordination system

모든 model은 origin을 갖고 있습니다. 다만 Metal NDC(Normalized Device Coordinate) 시스템은 2-unit wide, 2-unit high, 1-unit deep하다고 합니다. 왜죠.

Submeshes

뭔지도 모르면서 일단 튜토리얼을 따라하고 있습니다. 일단 MDLMesh가 있고 그에 1:1로 맵핑되는 MTKMesh가 있습니다. Mesh는 Submesh의 container로 Submesh 배열을 프로퍼티로 갖고 있으며, 각 Submesh는 triangle에 대응합니다.

즉, 3개의 vertex로 표현할 수 있는데, 이 때 vertex의 순서에 따라 Submesh의 방향이 결정됩니다. Winding order가 반시계 방향일 경우 해당 triangle은 우리를 향하고 있는 것이고, 시계 방향일 경우 반대쪽을 향하는 것입니다. 이후에 다시 다뤄진다고 하는데, GPU는 전달받은 triangle 중 우리를 향하지 않는 triangle을 추려냄으로써 프로세싱 타임을 아낄 수 있다고 합니다.

'TIL > Metal' 카테고리의 다른 글

Metal. Ch 1. Hello, Metal!  (0) 2020.06.07

관련글 더보기

댓글 영역