如何 turn-off/disable 金属深度测试

How to turn-off/disable Metal depth testing

我知道如何使用 swift 在 Metal 中启用深度测试。

只需像这样使用适当的 MTLDepthStencilState 对象调用 MTLRenderCommandEncoder.setDepthStencilState() 即可正常工作。

renderCommandEncoder.setDepthStencilState( state )

关闭它,我认为这可以工作,但它在运行时给我一个错误。

renderCommandEncoder.setDepthStencilState( nil )

错误:

-[MTLDebugRenderCommandEncoder setDepthStencilState:]:3843: failed assertion `Set Depth Stencil State Validation
depthStencilState must not be nil.

这很奇怪,因为 Apple 的 documentation 说默认值为 nil 而函数 setDepthStencilState() 取可选值。

知道如何关闭深度测试还是我做错了什么?

环境:

我不用swift,但你会明白我的逻辑。

在 Metal 中,您可以独立于渲染管道配置深度测试,因此您可以混合和匹配渲染管道和深度测试的组合。深度测试由 MTLDepthStencilState 对象表示,就像使用渲染管线一样,您可以创建该对象的多个变体。

创建一个新的 MTLDepthStencilState 对象并使用以下设置对其进行配置:

DepthStencilDescriptor* depthStencilDescriptor = DepthStencilDescriptor::alloc()->init();
depthStencilDescriptor->setDepthWriteEnabled(false); /* disable depth write */
_depthStencilStateNoWrite = _device->newDepthStencilState(depthStencilDescriptor);
depthStencilDescriptor->release();

只要你想让你的对象被深度测试忽略,就像这样:

renderEncoder->setDepthStencilState(_depthStencilStateNoWrite);

您可以通过从 MTLDepthStencilDescriptor 创建一个 MTLDepthStencilState 并将 depthCompareFunction 设置为 always.

来禁用深度测试
let descriptor = MTLDepthStencilDescriptor()
descriptor.depthCompareFunction = .always
let depthStencilState = device.makeDepthStencilState(descriptor: descriptor)
renderCommandEncoder.setDepthStencilState(depthStencilState)

更新:只需将 depthCompareFunction 设置为 always 即可使深度测试始终通过,但它仍会写出所有片段的深度。如果想保持深度缓冲不变,可以设置isDepthWriteEnabledfalse