为什么 Metal 不渲染我简单清晰的 window 代码?
Why doesn't Metal render my simple clear window code?
我一直在关注 this 教程。我下载了源代码并尝试 "translating" 到 Swift。这是我的 "translated" 代码:
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是原版的,我没有主文件。
我最终得到一个 window,它不显示红色,而是什么都不显示。我不明白为什么会这样。请帮帮我,谢谢。
好吧,它可以是任何东西。但是,我要检查的第一件事是你的红色 alpha 设置应该有 alpha = 1.0 而不是 alpha = 0.0.
我看到两个问题。
1) MTKView
的 delegate
属性 是一个 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
// ...
}
}
2) 因为 Renderer
class 没有明确声明符合 MTKViewDelegate
协议,所以将其分配为视图委托时的条件转换失败。使 Renderer
明确符合协议,并删除如上所示的条件转换。
class Renderer: NSObject, MTKViewDelegate
我一直在关注 this 教程。我下载了源代码并尝试 "translating" 到 Swift。这是我的 "translated" 代码:
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是原版的,我没有主文件。
我最终得到一个 window,它不显示红色,而是什么都不显示。我不明白为什么会这样。请帮帮我,谢谢。
好吧,它可以是任何东西。但是,我要检查的第一件事是你的红色 alpha 设置应该有 alpha = 1.0 而不是 alpha = 0.0.
我看到两个问题。
1) MTKView
的 delegate
属性 是一个 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
// ...
}
}
2) 因为 Renderer
class 没有明确声明符合 MTKViewDelegate
协议,所以将其分配为视图委托时的条件转换失败。使 Renderer
明确符合协议,并删除如上所示的条件转换。
class Renderer: NSObject, MTKViewDelegate