金属。为什么将MTLCullMode设置为无关闭深度比较?

时间:2016-10-26 18:12:26

标签: ios metal depth-buffer

我渲染一个简单的框:

MDLMesh(boxWithExtent: ...)

当我关闭背面剔除时,在我的绘制循环中:

renderCommandEncoder.setCullMode(.none)

所有深度比较都被禁用,并且正面朝前的背面四边形完全错误地绘制了框的两侧。

咦?

我的目的是在深度比较中包含背面曲面忽略它们。例如,当我有一个半透明纹理的形状来揭示具有不同着色风格的形状内部时,这很重要。如何强制深度比较?

更新

所以沃伦的建议是改进,但仍然不正确。

我的depthStencilDescriptor

let depthStencilDescriptor = MTLDepthStencilDescriptor()
depthStencilDescriptor.depthCompareFunction = .less
depthStencilDescriptor.isDepthWriteEnabled = true

depthStencilState = device.makeDepthStencilState(descriptor: depthStencilDescriptor)

在我的绘制循环中,我设置深度模板状态:

renderCommandEncoder.setDepthStencilState(depthStencilState)

结果渲染 enter image description here

描述。这是一个盒子网格。每个框面使用着色器绘制磁盘纹理。纹理在磁盘主体外部是透明的。着色器在前面四边形四边形上绘制红色/白色螺旋纹理,在背面四边形上绘制蓝色/黑色螺旋纹理。这个盒子位于相机四边形的前面,带有一个mobil图像纹理。

请注意其中一个纹理如何使用背景纹理颜色在后部背面四边形上绘制。另请注意,最后面的后向四边形根本没有绘制。

1 个答案:

答案 0 :(得分:1)

实际上不可能达到我想要的效果。我基本上想做一个简单的复合 - 波特/达夫 - 这里但是依赖于顺序。订单无法保证在这里,所以我基本上都没有。