我知道如何使用 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 的檔案說默認值為 nil 并且函式setDepthStencilState()采用可選值。
知道如何關閉深度測驗還是我做錯了什么?
環境:
- Xcode 13.2
- 斯威夫特 5
- 部署目標:MacOS 11.1
uj5u.com熱心網友回復:
您可以通過創建MTLDepthStencilStatefromMTLDepthStencilDescriptor并depthCompareFunction設定為來禁用深度測驗always。
let descriptor = MTLDepthStencilDescriptor()
descriptor.depthCompareFunction = .always
let depthStencilState = device.makeDepthStencilState(descriptor: descriptor)
renderCommandEncoder.setDepthStencilState(depthStencilState)
更新:只需設定depthCompareFunctiontoalways將使深度測驗始終通過,但它仍會寫出所有片段的深度。如果要保持深度緩沖區處于相同狀態,可以設定isDepthWriteEnabled為false.
uj5u.com熱心網友回復:
我不使用swift,但您會理解我的邏輯。
在 Metal 中,您可以獨立于渲染管道配置深度測驗,因此您可以混合和匹配渲染管道和深度測驗的組合。深度測驗由MTLDepthStencilState物件表示,就像您使用渲染管道一樣,您可以創建此物件的多個變體。
創建一個新的 MTLDepthStencilState物件并使用以下設定對其進行配置:
DepthStencilDescriptor* depthStencilDescriptor = DepthStencilDescriptor::alloc()->init();
depthStencilDescriptor->setDepthWriteEnabled(false); /* disable depth write */
_depthStencilStateNoWrite = _device->newDepthStencilState(depthStencilDescriptor);
depthStencilDescriptor->release();
每當您希望深度測驗忽略您的物件時使用它,如下所示:
renderEncoder->setDepthStencilState(_depthStencilStateNoWrite);
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/447164.html
上一篇:Redis Pipeline
下一篇:Java多執行緒【三種實作方法】
