Metal为什么不呈现我简单的透明窗口代码?

时间:2019-03-21 07:02:38

标签: xcode gpu metal metalkit

我一直在关注this教程。我下载了源代码,并尝试将其“翻译”为Swift。这是我的“翻译”代码:

import Cocoa
import AppKit
import MetalKit

import simd


class MetalViewController: NSViewController {

    @IBOutlet var inview: MTKView!
    override func viewDidLoad() {
        super.viewDidLoad()
        let _view: MTKView = self.inview
        _view.device = MTLCreateSystemDefaultDevice()
        let _renderer: Renderer=initView(view: _view)
        _view.delegate=_renderer as? MTKViewDelegate
        _view.preferredFramesPerSecond=60
    }
}
class Renderer: NSObject {
    init(device: MTLDevice){
        self._device=device
        self._commandQueue=_device.makeCommandQueue()!
        super.init()
    }
    func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {

    }
    func draw(in view: MTKView) {
        let color = Color(red: 1.0,green: 0.0,blue: 0.0,alpha: 0.0)
        view.clearColor = MTLClearColorMake(color.red, color.green, color.blue, color.alpha)
        let commandbuffer = _commandQueue.makeCommandBuffer()
        let renderpassdescriptor: MTLRenderPassDescriptor = view.currentRenderPassDescriptor!
        let renderencoder: MTLRenderCommandEncoder = (commandbuffer?.makeRenderCommandEncoder(descriptor: renderpassdescriptor))!
        renderencoder.endEncoding()
        commandbuffer!.present(view.currentDrawable!)
        commandbuffer!.commit()
    }

    var _device: MTLDevice
    var _commandQueue: MTLCommandQueue

}

struct Color{
    var red, green, blue, alpha: Double
}

func initView(view: MTKView) -> Renderer{
    var renderer: Renderer
    renderer=Renderer(device: view.device!)
    return renderer
}

因此,我将AAPLRenderer和AAPLViewControllers放在一个文件中,并使其没有头文件。我将@IBOutlet的视图链接到视图控制器,因为该视图是NSView,并且在没有编译时错误的情况下无法将其强制转换为MTKView。 AppDelegate是原始版本,我没有主文件。

我最终看到一个不显示红色但不显示任何内容的窗口。我不明白为什么会这样。请帮助我,谢谢。

2 个答案:

答案 0 :(得分:1)

我看到两个问题。

1)import { Component, OnInit } from '@angular/core'; import { MapService } from '../map.service'; @Component({ selector: 'app-map', templateUrl: './map.component.html', styleUrls: ['./map.component.css'] }) export class MapComponent implements OnInit { constructor(private serv: MapService) { } ngOnInit() { } onSubmit(){ console.log("submit map component") this.serv.create().subscribe(res => console.log(res)) } } 的{​​{1}}属性是MTKView,这意味着如果不保留渲染器的实例,它将立即被初始化,并且永远不会接收任何委托回调。保留对渲染器的引用作为视图控制器上的属性。

delegate

2)由于weak var类未明确声明符合class MetalViewController: NSViewController { @IBOutlet var inview: MTKView! var renderer: Renderer! override func viewDidLoad() { // ... let view: MTKView = self.inview // ... renderer = initView(view: view) view.delegate = renderer // ... } } 协议,因此在将其分配为视图的委托时,条件转换将失败。使Renderer明确符合协议,并删除条件转换,如上所示。

MTKViewDelegate

答案 1 :(得分:0)

嗯,可能是任何东西。但是,我要检查的第一件事是您对红色的alpha设置应为alpha = 1.0,而不应为alpha = 0.0。