0

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

基本上我所做的只是设置一个 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,它也会快速耗尽内存

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

提前致谢!

4

1 回答 1

1

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

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

于 2020-02-02T17:28:03.620 回答