SceneKit 中的平滑着色

Smooth Shading in SceneKit

我目前正在开发一个使用 SceneKit 渲染一些 3D 模型的 iPadOS 应用程序,没什么特别的,但是在为这些模型着色时我遇到了很大的障碍...

基本上我所做的只是设置一个 SceneKit 场景(使用几乎所有默认设置,我什至没有相机)并从我拥有的一些 .obj 文件中实例化 3D 对象,就像这样。

let url =  <URL of my .obj file>
let asset = MDLAsset(url: url)
let object = asset.object(at: 0)
let node = SCNNode(mdlObject: object)
let texture = UIImage(data: try Data(contentsOf: <URL of the texture>))
let material = SCNMaterial()
material.diffuse.contents = texture
node.geometry!.materials = [material]
self.sceneView.scene!.rootNode.addChildNode(node)

纹理是手动加载的,因为不幸的是,这是客户端设置文件供我使用的方式。代码运行良好,我可以看到网格及其纹理,但它看起来也像这样

如您所见,阴影一点也不平滑...我不知道如何修复它。

客户一直困扰我实现 Phong 着色,根据 Apple 的文档,您就是这样做的。

material.lightingModel = .phong

不幸的是,这仍然是启用 Phong 后的样子。在 3D 渲染方面,我绝对是初学者,所以这可能简单得可笑,但我发誓我不知道如何在这个模型上获得更平滑的阴影。

我试过左右看,唯一有任何明显结果的是使用 subdivisionLevel 来增加几何体中的实际面,但这并不能很好地缩放,因为实际的应用程序需要加载一个大量的这些网格,即使细分设置为 1

,它也会很快耗尽内存

肯定有一种方法可以在不改善实际几何形状的情况下平滑这些阴影吗?

提前致谢!

着色需要为您的几何体设置正确的法线。您是否尝试过使用 Model IO 来生成它们?

https://developer.apple.com/documentation/modelio/mdlmesh/1391284-addnormals