我知道如何启用金属深度测试使用test。
只需像这样使用适当的MTLRenderCommandEncoder.setDepthStencilState()对象调用MTLDepthStencilState,它就能正常工作。
renderCommandEncoder.setDepthStencilState( state )为了关闭它,我认为这可以工作,但它在运行时给了我一个错误。
renderCommandEncoder.setDepthStencilState( nil )错误:
-[MTLDebugRenderCommandEncoder setDepthStencilState:]:3843: failed assertion `Set Depth Stencil State Validation
depthStencilState must not be nil.这很奇怪,因为苹果的文档说默认值为零,函数setDepthStencilState()采用可选值。
你知道如何关闭深度测试吗?还是我做错了什么?
环境:
发布于 2022-03-21 00:51:35
可以通过将MTLDepthStencilState设置为always从MTLDepthStencilDescriptor创建depthCompareFunction,从而禁用深度测试。
let descriptor = MTLDepthStencilDescriptor()
descriptor.depthCompareFunction = .always
let depthStencilState = device.makeDepthStencilState(descriptor: descriptor)
renderCommandEncoder.setDepthStencilState(depthStencilState)更新:只要将depthCompareFunction设置为always,就可以始终通过深度测试,但它仍然会写出所有片段的深度。如果希望保持深度缓冲区处于相同状态,则可以将isDepthWriteEnabled设置为false。
发布于 2022-03-20 15:24:56
我不使用,但是您会理解我的逻辑的。
在Metal中,您可以独立于呈现管道配置深度测试,以便混合和匹配渲染管道和深度测试的组合。深度测试由一个MTLDepthStencilState对象表示,就像处理呈现管道一样,您可以创建这个对象的多个变体。
创建一个新的MTLDepthStencilState对象并使用以下设置对其进行配置:
DepthStencilDescriptor* depthStencilDescriptor = DepthStencilDescriptor::alloc()->init();
depthStencilDescriptor->setDepthWriteEnabled(false); /* disable depth write */
_depthStencilStateNoWrite = _device->newDepthStencilState(depthStencilDescriptor);
depthStencilDescriptor->release();当您希望在深度测试中忽略对象时,请使用它,如下所示:
renderEncoder->setDepthStencilState(_depthStencilStateNoWrite);https://stackoverflow.com/questions/71545662
复制相似问题