首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何关闭/禁用金属深度测试

如何关闭/禁用金属深度测试
EN

Stack Overflow用户
提问于 2022-03-20 09:46:00
回答 2查看 330关注 0票数 0

我知道如何启用金属深度测试使用test。

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

代码语言:javascript
复制
renderCommandEncoder.setDepthStencilState( state )

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

代码语言:javascript
复制
renderCommandEncoder.setDepthStencilState( nil )

错误:

代码语言:javascript
复制
-[MTLDebugRenderCommandEncoder setDepthStencilState:]:3843: failed assertion `Set Depth Stencil State Validation
depthStencilState must not be nil.

这很奇怪,因为苹果的文档说默认值为零,函数setDepthStencilState()采用可选值。

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

环境:

  • Xcode 13.2
  • Swift 5
  • 部署目标: MacOS 11.1
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-21 00:51:35

可以通过将MTLDepthStencilState设置为alwaysMTLDepthStencilDescriptor创建depthCompareFunction,从而禁用深度测试。

代码语言:javascript
复制
let descriptor = MTLDepthStencilDescriptor()
descriptor.depthCompareFunction = .always
let depthStencilState = device.makeDepthStencilState(descriptor: descriptor)
renderCommandEncoder.setDepthStencilState(depthStencilState)

更新:只要将depthCompareFunction设置为always,就可以始终通过深度测试,但它仍然会写出所有片段的深度。如果希望保持深度缓冲区处于相同状态,则可以将isDepthWriteEnabled设置为false

票数 3
EN

Stack Overflow用户

发布于 2022-03-20 15:24:56

我不使用,但是您会理解我的逻辑的。

在Metal中,您可以独立于呈现管道配置深度测试,以便混合和匹配渲染管道和深度测试的组合。深度测试由一个MTLDepthStencilState对象表示,就像处理呈现管道一样,您可以创建这个对象的多个变体。

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

代码语言:javascript
复制
DepthStencilDescriptor* depthStencilDescriptor = DepthStencilDescriptor::alloc()->init();
depthStencilDescriptor->setDepthWriteEnabled(false); /* disable depth write */
_depthStencilStateNoWrite = _device->newDepthStencilState(depthStencilDescriptor);
depthStencilDescriptor->release();

当您希望在深度测试中忽略对象时,请使用它,如下所示:

代码语言:javascript
复制
renderEncoder->setDepthStencilState(_depthStencilStateNoWrite);
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71545662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档