【问题标题】:Metal Shader Debugging - Capture GPU FrameMetal Shader 调试 - 捕获 GPU 帧
【发布时间】:2019-01-27 22:58:09
【问题描述】:

我想调试我的金属着色器,但“捕获 GPU 帧”按钮在调试菜单中不可见且不可用。

我的方案最初是这样设置的:

  • 捕获 GPU 帧:自动启用
  • Metal API 验证:已启用

当我将 Capture GPU Frame 选项更改为 Metal 时,我确实看到了捕获按钮,但当我尝试制作渲染命令编码器时,我的应用程序崩溃了:

commandBuffer.makeRenderCommandEncoder(descriptor: ...)

validateRenderPassDescriptor:644: 断言失败 `Texture at colorAttachment[0] has usage (0x01) which doesn't specify MTLTextureUsageRenderTarget (0x04)'

问题一:为什么要指定用途? (它在自动启用模式下工作)

问题二:如何指定MTLTextureUsageRenderTarget

运行测试版; Xcode 10 和 iOS 12。

【问题讨论】:

  • 您只是在MTKView 的可绘制对象中绘制一个通道吗?如果是这样,请尝试将视图的framebufferOnly 属性设置为false。这应该在启用捕获时自动发生,但听起来您可能遇到了错误。
  • Short awnser,是的,虽然我已经设置了一个允许后台渲染的流程。谢谢,我试试看。

标签: ios debugging metal


【解决方案1】:

指定使用目的

textureDescriptor.usage = [.renderTarget , .shaderRead]

textureDescriptor.usage = MTLTextureUsage(rawValue: MTLTextureUsage.renderTarget.rawValue | MTLTextureUsage.shaderRead.rawValue)

【讨论】:

    【解决方案2】:

    对于较新版本的 Xcode,您需要显式设置 MTLTextureDescriptor.usage,对于我的情况(渲染目标),如下所示:

    textureDescriptor.usage = MTLTextureUsageRenderTarget|MTLTextureUsageShaderRead;
    

    上面的设置表明纹理可以用作渲染目标,之后也可以被另一个着色器读取。正如上面提到的,您可能还想设置 framebufferOnly 属性,我是这样做的:

    if (isCaptureRenderedTextureEnabled) {
      mtkView.framebufferOnly = false;
    }
    

    请注意,对于优化的情况 (isCaptureRenderedTextureEnabled = false),此 framebufferOnly 设置保留为默认值 true,这样可以轻松检查将在视图中呈现的数据(着色器的输出)。

    【讨论】:

    • 酷,没想到我可以使用或运算符,亲爱的。我试试看,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 2015-12-19
    • 1970-01-01
    相关资源
    最近更新 更多