iOS-Metal:如何清除深度缓冲区?类似于OpenGL中的glClear(GL_DEPTH_BUFFER_BIT)

Viv*_*vam 5 opengl-es objective-c depth-buffer ios metal

我需要清除glClear(GL_DEPTH_BUFFER_BIT)在OpenGL中使用的深度缓冲区,在金属中怎么做?我浏览了Apple的文档,没有任何提示。

Muz*_*zza 7

简短的回答是,要清除深度缓冲区,您可以在开始渲染通道之前添加这两行: mRenderPassDescriptor.depthAttachment.loadAction = MTLLoadActionClear; mRenderPassDescriptor.depthAttachment.clearDepth = 1.0f; 如果不结束并重新启动渲染通道,就无法清除。

长答案:

在 Metal 中,您必须定义在开始渲染到MTLTexture. 没有像 OpenGL 那样清晰的函数。

要做到这一点,在你的MTLRenderPassDescriptor,一套depthAttachment.loadActionMTLLoadActionCleardepthAttachment.clearDepth1.0f。您也可以设置colorAttachments[0].loadAction,以MTLLoadActionClear清除颜色缓冲区。

然后将此渲染过程描述符传递给您对MTLCommandBuffer::renderCommandEncoderWithDescriptor.

如果你想通过渲染你必须调用清理的深度或颜色缓冲区中途endEncodingMTLRenderCommandEncoder,然后开始重新编码depthAttachment.loadAction设置为MTLLoadActionClear

  • 为了回答您之前的评论(现已删除),Apple 这样做并不是为了让“开发人员的工作难度增加 1400%”。他们这样做是因为在平铺 GPU 上,清晰的操作与启动渲染通道有内在联系。Metal 就是将代码和硬件联系在一起,而不是隐藏幕后发生的事情。 (3认同)
  • 如果你已经到了这一步,你已经有了 MTLRenderPassDescriptor、MTLCommandBuffer、renderCommandEncoderWithDescriptor 和 endEncoding。在现有的描述符上设置四个参数并不是真的“无法理解” (2认同)