-
Refactoring Fill the Yellow textureOpenGL/iOS_Metal 2018. 10. 12. 14:13
안녕하세요 dely입니다:)
저번 시간에 만든 Fill the Yellow texture 을 리펙토링 해보려합니다.
기존 코드는 viewController에 모든 것을 두었는데
renderer class를 하나 만들어 렌더링 관련 코드들을 따로 분리할 예정입니다.
1. Renderer.swift 파일 생성
- 먼저, 프로젝트에서 Renderer.swift라는 파일을 하나 생성합니다.
MetalKit을 import 하고, NSObject를 상속받는 Renderer class를 작성합니다.
import MetalKit
class Renderer: NSObject {
}
- Renderer class 내부에 관련 프로퍼티와 init()을 작성합니다.
viewController에서 device와 commandQueue 프로퍼티를 분리하여 가져옵니다.
init(device: MTLDevice) 를 생성하여 device와 commandQueue를 초기화시키려 합니다.
var device: MTLDevice
var commandQueue: MTLCommandQueue
init(device: MTLDevice) {
}
2. 프로퍼티 초기화 및 draw() 메소드 생성
- init() 안에 device, commandQueue 초기화 코드를 작성합니다.
self.device = device
commandQueue = device.makeCommandQueue()!
super.init()
- MTKViewDelegate를 이용하여 draw(), mtkView() 메소드를 작성합니다.
extension Renderer: MTKViewDelegate {
func draw(in view: MTKView) {
}
func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {
}
}
3. draw() 메소드 작성하기
- draw 메소드 매개변수로 받아오는 view를 이용하여 descriptor와 drawable를 가져옵니다.
guard let drawable = view.currentDrawable,
let descriptor = view.currentRenderPassDescriptor else {
return
}
- 위의 코드 아래에 기존 viewController에서 작성했던 코드를 가져옵니다.
viewController에서 렌더링 했던 것을 draw()에서 대체하여 그려줄 예정입니다.
let commandBuffer = commandQueue.makeCommandBuffer()
let commandEncoder = commandBuffer?.makeRenderCommandEncoder(descriptor: metalView.currentRenderPassDescriptor!)
commandEncoder?.endEncoding()
commandBuffer?.present(metalView.currentDrawable!)
commandBuffer?.commit()
- descriptor와 drawable을 사용하여 가져온 코드를 수정합니다.
그래서 완성된 draw() 는 다음과 같습니다.
func draw(in view: MTKView) {
guard let drawable = view.currentDrawable,
let descriptor = view.currentRenderPassDescriptor else {
return
}
let commandBuffer = commandQueue.makeCommandBuffer()
let commandEncoder = commandBuffer?.makeRenderCommandEncoder(descriptor: descriptor)
commandEncoder?.endEncoding()
commandBuffer?.present(drawable)
commandBuffer?.commit()
}
4. viewController에서 Renederer의 draw() 호출하기
device = metalView.device
guard let renderer = Renderer(device: device) else {
return
}
renderer.draw(in: metalView)
반응형'OpenGL > iOS_Metal' 카테고리의 다른 글
Drawing Primitives (0) 2019.07.03 Hello Again, Metal (0) 2019.07.01 Add red triangle (0) 2018.10.13 Fill the Yellow texture (0) 2018.10.07 Hello Metal (0) 2018.10.06