由于纹理使用问题,Apple的延迟渲染示例无法在Metal 2上运行

时间:2017-12-26 23:56:00

标签: ios metal

我目前正试图找出如何以并行友好的方式执行以下过程。它可以归结为以下步骤:

  1. 将三角形绘制为小纹理
  2. 将小纹理绘制到框架上,允许线性采样以“模糊”三角形。
  3. 如果我能做到那么我应该能够渲染我的场景。问题是纹理不能同时具有读写访问权限。我不确定是否一直都是这种情况,或者它是否仅仅属于金属。

    所以我转向Apple的deferred rendering example知道延迟渲染的工作原理是写入多个纹理并将这些相同的纹理一起读取,以便为可绘制的屏幕生成最终图像。然而,运行它我得到了与我当前的渲染代码colorAttachment[0] does not have usage that specifies _相同的错误。

    我假设这是由于Metal或iOS的变化。

    有一点需要注意的是,当它连接到XCode时会立即崩溃,但如果从主屏幕打开,它可以在冻结之前自行完成几秒钟。

    如何使用纹理进行读写访问?为什么示例代码不起作用?

1 个答案:

答案 0 :(得分:2)

示例代码无效,因为Apple选择在不更新示例的情况下进行重大更改。它发生了。

以下是您可以使样本运行的最小变化集:

AAPLRenderer.mm第204行,添加:

shadowTextureDesc.usage = MTLTextureUsageRenderTarget | MTLTextureUsageShaderRead;

AAPLView.mm第130行,添加:

desc.usage = MTLTextureUsageRenderTarget;

在第153和178行重复上述步骤。

对于您的用例,您需要在屏幕外渲染目标上使用MTLTextureUsageRenderTarget | MTLTextureUsageShaderRead。这将允许您在一次传递中渲染它,并在后续传递中从中进行采样。