Mac에서 Swift를 사용하여 Metal 초기화

12387 단어 SwiftMetalMac
최근에 iOs에서 Metal을 만들었기 때문에 Mac에서 Metal의 비망록을 만들었어요.

■ Step1: 프로젝트 제작


프로젝트를 만들면.

의 화면이 나타나므로 "Applocation"은 "Cocoa App"을 선택하고 "Next"를 누르십시오.

다음은 Product Name, 이번에는 Test01 입니다.
언어 설정 언어를 변환으로 설정하십시오.
그리고 "Storyboards 사용"체크도 잊지 마세요.
"Next"를 눌러 디렉토리를 지정하고 "Create"를 눌러 항목을 작성합니다.

이런 화면이 나온다.
■ Step2: MetalRender 클래스 만들기
프로젝트에 MetalRender.swift 추가

MetalRenderer.swift
import MetalKit

let maxBuffersInFlight = 3

class MetalRenderer: NSObject, MTKViewDelegate {
    let _device: MTLDevice
    let _command_queue: MTLCommandQueue
    let _in_flight_semaphore = DispatchSemaphore(value: maxBuffersInFlight)

    init?(metalKitView: MTKView) {
        _device = metalKitView.device!
        guard let queue = _device.makeCommandQueue() else { return nil }
        _command_queue = queue

        metalKitView.colorPixelFormat = MTLPixelFormat.bgra8Unorm;

        super.init()
    }

    func draw(in view: MTKView) {
        _ = _in_flight_semaphore.wait(timeout: DispatchTime.distantFuture)
        if let command_buffer = _command_queue.makeCommandBuffer() {

            let semaphore = _in_flight_semaphore
            command_buffer.addCompletedHandler { (_ command_buffer)-> Swift.Void in
                semaphore.signal()
            }
            let render_pass_descriptor = view.currentRenderPassDescriptor
            render_pass_descriptor?.colorAttachments[0].loadAction=MTLLoadAction.clear
            render_pass_descriptor?.colorAttachments[0].storeAction=MTLStoreAction.store
            render_pass_descriptor?.colorAttachments[0].clearColor=MTLClearColorMake(1.0, 0.0, 0.0, 1.0)

            if let render_pass_descriptor = render_pass_descriptor, let render_encoder = command_buffer.makeRenderCommandEncoder(descriptor: render_pass_descriptor) {
                render_encoder.endEncoding()
                if let drawable = view.currentDrawable {
                    command_buffer.present(drawable)
                }
            }
            command_buffer.commit()
        }
    }

    func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {
    }
}

■Step3:ViewController.swift 편집


ViewController.swift
import Cocoa
import MetalKit

class ViewController: NSViewController {
    var renderer: MetalRenderer!
    var mtkView: MTKView!

    override func viewDidLoad() {
        super.viewDidLoad()

        guard let mtkView = self.view as? MTKView else {
            print("View attached to GameViewController is not an MTKView")
            return
        }

        // Select the device to render with.  We choose the default device
        guard let defaultDevice = MTLCreateSystemDefaultDevice() else {
            print("Metal is not supported on this device")
            return
        }

        mtkView.device = defaultDevice

        guard let newRenderer = MetalRenderer(metalKitView: mtkView) else {
            print("Renderer cannot be initialized")
            return
        }

        renderer = newRenderer
        renderer.mtkView(mtkView, drawableSizeWillChange: mtkView.drawableSize)
        mtkView.delegate = renderer
    }
}

■ Step4: View 설정



ain.storyboad에서 View 를 선택합니다.
그리고 오른쪽에 Class를 설정한 곳이 나타나므로 MTKView를 지정하십시오.

■ Step5: 실행


빨간색 화면 나와요.

좋은 웹페이지 즐겨찾기