SceneKit 中的平滑着色

Posted

技术标签:

【中文标题】SceneKit 中的平滑着色【英文标题】:Smooth Shading in SceneKit 【发布时间】:2020-05-04 14:40:46 【问题描述】:

我目前正在开发一个 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,它也会很快耗尽内存

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

提前致谢!

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于SceneKit 中的平滑着色的主要内容,如果未能解决你的问题,请参考以下文章

SceneKit - 在着色器修改器中访问目标颜色以进行混合

金属着色器中的线条更宽更平滑

iOS10 + SceneKit:使用自定义着色器渲染视频

如何为溶解效果编写 sceneKit 着色器修改器

带有 SceneKit SCNProgram 的金属着色器

为啥金属着色器渐变作为 SCNProgram 应用于 SceneKit 节点比作为 MTKView 更轻?