MetalKit - Drawable.texture 断言错误

Posted

技术标签:

【中文标题】MetalKit - Drawable.texture 断言错误【英文标题】:MetalKit - Drawable.texture assertion error 【发布时间】:2017-01-05 12:36:16 【问题描述】:

我是 MetalKit 的新手,正在尝试将 this tutorial 从 playground 转换回 OSX 应用程序:

    import MetalKit

public class MetalView: MTKView 

    var queue: MTLCommandQueue! = nil
    var cps: MTLComputePipelineState! = nil

    required public init(coder: NSCoder) 
        super.init(coder: coder)
        device = MTLCreateSystemDefaultDevice()
        registerShaders()
    


    override public func drawRect(dirtyRect: NSRect) 
        super.drawRect(dirtyRect)
        if let drawable = currentDrawable 
            let command_buffer = queue.commandBuffer()
            let command_encoder = command_buffer.computeCommandEncoder()
            command_encoder.setComputePipelineState(cps)
            command_encoder.setTexture(drawable.texture, atIndex: 0)
            let threadGroupCount = MTLSizeMake(8, 8, 1)
            let threadGroups = MTLSizeMake(drawable.texture.width / threadGroupCount.width, drawable.texture.height / threadGroupCount.height, 1)
            command_encoder.dispatchThreadgroups(threadGroups, threadsPerThreadgroup: threadGroupCount)
            command_encoder.endEncoding()
            command_buffer.presentDrawable(drawable)
            command_buffer.commit()
        
    

    func registerShaders() 
        queue = device!.newCommandQueue()
        do 
            let library = device!.newDefaultLibrary()!
            let kernel = library.newFunctionWithName("compute")!
            cps = try device!.newComputePipelineStateWithFunction(kernel)
         catch let e 
            Swift.print("\(e)")
        
    

我在线路上遇到错误:

command_encoder.setTexture(drawable.texture, atIndex: 0)

失败的断言`frameBufferOnly 纹理不支持计算。'

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

如果你想从一个计算函数写入一个drawable的纹理,你需要告诉MTKView它应该将它的层配置为不是framebuffer-only:

metalView.framebufferOnly = false

将此值设置为 false 时,您的可绘制对象将为您提供一个设置了 shaderWrite 使用标志的纹理,这是从着色器函数写入纹理时所必需的。

【讨论】:

我们应该在哪里设置这个?在MetalView 类中? 好的,我明白了。我设置了self.frameBufferOnly = false,它可以工作。 这很奇怪,我发现如果我在操场上运行代码,我不需要设置这一行,但是如果我将代码应用到一个应用程序中,我需要添加这个。跨度> 我必须将self.framebufferOnly = false 放入init。在绘图调用中设置它为时已晚,无法避免断言。【参考方案2】:

即使我将 frameBufferOnly 设置为 false 并在使用可绘制对象之前打印布尔值以进行仔细检查,我也遇到了同样的问题。

但是当我关闭GPU frame capture 时,不会再出现断言(至少现在是这样)。还是不知道为什么。

Menu > Scheme > Edit Scheme > Run > Options > GPU Frame Capture已禁用

【讨论】:

以上是关于MetalKit - Drawable.texture 断言错误的主要内容,如果未能解决你的问题,请参考以下文章

Metalkit:MTLBuffer和swift 3中的指针

CVMetalTextureCacheCreateTextureFromImage 总是返回 null

如何在 iOS 中从 MTKView 制作屏幕截图?

将 SwiftUI View 录制到视频和播放中

Swiftui - Apple Watch 上的金属渲染

MTKView 显示广色域 P3 色彩空间