ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Refactoring Fill the Yellow texture
    OpenGL/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

    댓글

Designed by Tistory.