我正在尝试在 SceneKit 中渲染 3D 模型,但它看起来不正确。例如这个模型(它是一个带有纹理的 SCN 文件,您可以在 Xcode 中重现它):
在 Xcode 场景编辑器中,它呈现如下:
Transparency -> Mode -> Dual Layer
Double Sided = true
如果我关闭“写入深度”选项,它将如下所示: 但也有一些问题,因为我只看到“最底层”的理发。
我认为这应该是可能的。怎么做才对?
我正在尝试在 SceneKit 中渲染 3D 模型,但它看起来不正确。例如这个模型(它是一个带有纹理的 SCN 文件,您可以在 Xcode 中重现它):
在 Xcode 场景编辑器中,它呈现如下:
Transparency -> Mode -> Dual Layer
Double Sided = true
如果我关闭“写入深度”选项,它将如下所示: 但也有一些问题,因为我只看到“最底层”的理发。
我认为这应该是可能的。怎么做才对?
在您的 3D 模型中,从不同角度观看时会弹出一些头发的原因对于 SceneKit 来说很常见:您的模型具有半透明材质,由于某些内部引擎渲染技术,SceneKit 无法正确渲染(时间 49:35 )应用于深度缓冲区。
为了解决这个问题,有两种解决方案:
解决方案 1:
您的 3D 模型必须具有完全不透明的纹理(完全没有半透明部分)。在这种情况下使用.dualLayer
属性。
let scene = SCNScene(named: "art.scnassets/Hair.scn")!
let hair = scene.rootNode.childNode(withName: "MDL_OBJ", recursively: true)!
hair.geometry?.firstMaterial?.transparencyMode = SCNTransparencyMode.dualLayer
解决方案 2:
发束不能是单一几何体,而必须是复合几何体(由几个统一为一组的几何体层组成)。
hair.geometry?.firstMaterial?.colorBufferWriteMask = SCNColorMask.all
hair.geometry?.firstMaterial?.readsFromDepthBuffer = false
hair.geometry?.firstMaterial?.writesToDepthBuffer = false
hair.geometry?.firstMaterial?.blendMode = SCNBlendMode.alpha