如何 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() 取可选值。
知道如何关闭深度测试还是我做错了什么?
环境:
- Xcode 13.2
- Swift 5
- 部署目标:MacOS 11.1
我不用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
即可使深度测试始终通过,但它仍会写出所有片段的深度。如果想保持深度缓冲不变,可以设置isDepthWriteEnabled
为false
。
我知道如何使用 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() 取可选值。
知道如何关闭深度测试还是我做错了什么?
环境:
- Xcode 13.2
- Swift 5
- 部署目标:MacOS 11.1
我不用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
即可使深度测试始终通过,但它仍会写出所有片段的深度。如果想保持深度缓冲不变,可以设置isDepthWriteEnabled
为false
。