ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Fill the Yellow texture
    OpenGL/iOS_Metal 2018. 10. 7. 02:49

    안녕하세요 dely입니다:)


    raywenderlich를 참고하여 Metal로 색깔 texture를 출력하는 것을 만들어보려고 합니다.

    (참고영상: Getting Started with Metal)


    오늘의 목표!!




    지난번 공부한 Hello Metal에서 이미지 프로세싱 작업을 위한 몇가지 step을 따라 화면을 노란색으로 채우는 앱을 만들어 보려고 합니다.



    1. Device 생성


    Main.storyboard에서 View를 클릭한 후 Custom Class란에 MTKView를 써서 연결합니다. (MetalKit을 사용하여 작업한 결과를 화면에 출력해주기 위함)







    - ViewController.swift에서 MetalKit을 import 하고, MTKViewMTLDevice type 프로퍼티를 추가합니다. 또 viewDidLoad()에서 metalView.device를 초기화합니다.


    import UIKit

    import MetalKit


    class ViewController: UIViewController {

        

        var metalView: MTKView {

            return view as! MTKView

        }

        var device: MTLDevice!


        override func viewDidLoad() {

            super.viewDidLoad()

            metalView.device = MTLCreateSystemDefaultDevice()

        }

    }



    2. metalView color 설정 (이번 글에서는 shader를 쓰지않음 - pipeline state는 다음 글에서)


    enum Colors {

        static let myYellow = MTLClearColor(red: 1.0, green: 1.0, blue: 0.0, alpha: 1.0)

    }


    class ViewController: UIViewController {

        override func viewDidLoad() {

            metalView.clearColor = Colors.myYellow

        }

    }


    3. Command Queue 생성


    - GPU가 실행시킬 작업들을 담아둘 Command Buffer의 list인 CommandQueue를 생성하고, 초기화 합니다. (device 프로퍼티에 metalView.device를 초기화하여 사용)


    var commandQueue: MTLCommandQueue!

    override func viewDidLoad() {

    device = metalView.device

    commandQueue = device.makeCommandQueue()

    }



    4. Command Buffer 생성


    - 앞에서 초기화 한 commandQueue를 통해 commandBuffer 생성 및 초기화합니다.


    let commandBuffer = commandQueue.makeCommandBuffer()



    5. Command Encoder 생성


    - 지금까지 생성 및 초기화를 통해 만든 프레임을 렌더링하기 위해 Command Encoder를 생성한다. 텍스쳐로부터 작성된 render pass (현재 view의 values)를 가져오는 매개변수를 넘겨줍니다.


    let commandEncoder = commandBuffer?.makeRenderCommandEncoder(descriptor: metalView.currentRenderPassDescriptor!)



    6. Commit Command Buffer 


    - Encoder에서 모든 생성이 완료되었음을 선언합니다.


    commandEncoder?.endEncoding()



    - draw가 완료되자마자 새로운 텍스쳐가 표시되도록 합니다. 


    commandBuffer?.present(metalView.currentDrawable!)



    그 후에 트렌젝션을 커밋하여 GPU로 작업을 보냅니다.


    commandBuffer?.commit()



    그럼 완성!


    이제 디바이스에서 실행시키면 목표했던 노랑 화면이 나오게됩니다. 

    (시뮬레이터에서의 metal 지원은 아직 되지 않기 때문에 꼭 폰을 연결해야합니다.)



    반응형

    'OpenGL > iOS_Metal' 카테고리의 다른 글

    Drawing Primitives  (0) 2019.07.03
    Hello Again, Metal  (0) 2019.07.01
    Add red triangle  (0) 2018.10.13
    Refactoring Fill the Yellow texture  (0) 2018.10.12
    Hello Metal  (0) 2018.10.06

    댓글

Designed by Tistory.