iOS SceneKit - 为材质透明度添加菲涅尔效果

T-R*_*Rex 5 ios scenekit

我有一个描绘人体的几何节点。物体的材质是透明的

let node = newScene.rootNode.childNode(withName: "man_mesh", recursively: true)
let nodeMaterial = node?.geometry?.firstMaterial
nodeMaterial?.emission.contents = UIColor(red: 0.0, green: 0.0, blue: 1.0, alpha: 1.0)
nodeMaterial?.transparencyMode = .rgbZero
nodeMaterial?.transparent.contents = UIColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)
Run Code Online (Sandbox Code Playgroud)

我试图获得的效果是对象在面向相机的区域完全透明,但当多边形面向侧面时变得更加不透明......这会产生一种闪亮的蓝色边缘。像这样:

边缘效果

知道如何创建这种效果吗?

谢谢

编辑:另一个有趣的点:看起来 SceneKit 确实支持菲涅耳效应。该效果会影响反射贴图 - 然而,一旦将透明度应用于对象,它也会影响反射率(完全透明也会使反射率消失) - 我相信这是 Apple 的一个概念错误 - 一种材料可以是透明的,仍然反射光!

Eug*_*ene 4


\n我做了一些研究并找到了答案。为了达到这个效果,可以使用下面的代码。

\n\n
func ghostEffect(scene: SCNScene) {\n\n    let sphere = SCNSphere(radius: 3)\n\n    let material = SCNMaterial()\n    material.diffuse.contents = UIColor.black\n    material.reflective.contents = UIColor(red: 0, green: 0.764, blue: 1, alpha: 1)\n    material.reflective.intensity = 3\n    material.transparent.contents = UIColor.black.withAlphaComponent(0.3)\n    material.transparencyMode = .default\n    material.fresnelExponent = 4\n\n    sphere.materials = [material]\n\n    let node = SCNNode(geometry: sphere)\n\n    scene.rootNode.addChildNode(node)\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

解释来自:SCNMaterial

\n
\n\n

透明-确定材质中每个点的不透明度的对象

\n\n

反射-定义表面上每个点的反射颜色的对象

\n\n

菲森塞尔指数-影响材质\xe2\x80\x99s反射率的因素

\n\n

这种方法可以应用于任何 3D 对象。

\n\n

结果

\n\n

PS 希望它会有用。

\n