store.raywenderlich.com/products/metal-by-tutorials
세상에 내가 대체 뭘 공부하고 있는 거지? 2장인데 벌써 생각도 해본적 없는 신세계가 찾아오네요. 3D Model에 대해 알아보고, 샘플로 주어진 모델들을 MTKView에 그려봅니다. 여긴 어디... 난 누구...
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
모르는 개념이 너무 많이 나와서 책에 나오는 내용들을 도저히 정리하기가 어렵습니다. 깨달은 대로 나열해보면
객체를 생성할 때 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) |
모든 model은 origin을 갖고 있습니다. 다만 Metal NDC(Normalized Device Coordinate) 시스템은 2-unit wide, 2-unit high, 1-unit deep하다고 합니다. 왜죠.
뭔지도 모르면서 일단 튜토리얼을 따라하고 있습니다. 일단 MDLMesh가 있고 그에 1:1로 맵핑되는 MTKMesh가 있습니다. Mesh는 Submesh의 container로 Submesh 배열을 프로퍼티로 갖고 있으며, 각 Submesh는 triangle에 대응합니다.
즉, 3개의 vertex로 표현할 수 있는데, 이 때 vertex의 순서에 따라 Submesh의 방향이 결정됩니다. Winding order가 반시계 방향일 경우 해당 triangle은 우리를 향하고 있는 것이고, 시계 방향일 경우 반대쪽을 향하는 것입니다. 이후에 다시 다뤄진다고 하는데, GPU는 전달받은 triangle 중 우리를 향하지 않는 triangle을 추려냄으로써 프로세싱 타임을 아낄 수 있다고 합니다.
Metal. Ch 1. Hello, Metal! (0) | 2020.06.07 |
---|
댓글 영역