gpt4 book ai didi

Scenekit Shader - 关闭平滑着色和任何正常插值

转载 作者:行者123 更新时间:2023-12-01 00:33:50 26 4
gpt4 key购买 nike

我有一个从 Blender 导出的动画模型(collada)。根据我的理解,着色器尝试在动画期间插入法线,我想防止这种情况发生。我的模型非常块状,但 Scenekit 使它像 Apple 产品一样流畅。我希望它看起来像我的世界。

最佳答案

我假设您正在寻找类似于下图左侧所示的平面阴影低多边形外观。

Flat and smooth shaded

此示例使用 SCNSphere作为几何源,但它也应该适用于您从 dae 文件加载的几何。

您加载的模型和默认的 SCNSphere 由许多面组成。在平滑模型的情况下,顶点通常跨面共享,每个顶点只能有一个法线。我们需要做的是确保每个面不与相邻面共享顶点,并且每个顶点上使用的法线仅根据面的法线方向计算。

SceneKit 本身没有任何 native 功能来执行此操作,但是 Apple 的另一个框架具有... ModelIO。

您需要导入 ModelIO。

import ModelIO
import SceneKit.ModelIO

我用来生成上面两个球体的代码如下所示。
let geom = SCNSphere(radius: 0.5)

// convert SceneKit geometry to ModelIO mesh object
let modelMesh = MDLMesh(scnGeometry: geom)
// ensure vertices are not shared with neighbouring faces
modelMesh.makeVerticesUnique()
// replace existing 'smooth' normal definition with an 'non-smoothed' normal
modelMesh.addNormals(withAttributeNamed: "normal", creaseThreshold: 1.0)

// create SceneKit geometry from ModelIO mesh object
let flattenedGeom = SCNGeometry(mdlMesh: modelMesh)
let flattenedNode = SCNNode(geometry: flattenedGeom)
scene.rootNode.addChildNode(flattenedNode)

// smooth sphere for comparison only
let sphereNodeSmooth = SCNNode(geometry: SCNSphere(radius: 0.5))
sphereNodeSmooth.position = SCNVector3Make(0, 1.2, 0)
scene.rootNode.addChildNode(sphereNodeSmooth)

当然,我可能会建议您修改 Blender 中的模型以这种方式导出(唯一顶点、非平滑法线)。这将使您的应用程序不必在加载 Assets 时进行比所需更多的处理。不幸的是,我的 Blender 知识有点缺乏。

关于Scenekit Shader - 关闭平滑着色和任何正常插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42688892/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com