我有一個從Blender導出的動畫模型(collada)。根據我的理解,着色器會在動畫過程中嘗試插入法線,並且我想防止發生這種情況。我的模型很笨重,但Scenekit使它像Apple產品一樣平滑。我希望它看起來像我的世界。Scenekit Shader - 關閉平滑着色和任何正常插值
3
A
回答
3
我假設你正在尋找一種類似於左下方所示的扁平陰影低聚類外觀。
這個例子使用SCNSphere
作爲幾何源,但它也應該在你從DAE文件中加載的幾何工作。
您加載的模型以及默認的SCNSphere由多個面組成。在光滑模型的情況下,頂點通常在面間共享,每個頂點只能有一個法線。我們需要做的是確保每個面不與相鄰面共享頂點,並且每個頂點上使用的法線僅根據面的法線方向計算。
SceneKit本身沒有任何本地功能,但是另一個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的模型以這種方式出口的(唯一的頂點,非平滑法線)。這會使您的應用程序不必在加載資源時執行比所需更多的處理。不幸的是,我的Blender知識缺乏一些。
相關問題
- 1. opengl中的平滑着色
- 2. 着色關閉點
- 3. SceneKit平滑相機運動
- 4. Fragment Shader GLSL中的顏色插值?
- 5. 自定義着色器SCNProgram iOS 9 Scenekit
- 6. 光滑着色之間切換到平面着色在Opengles 2.0
- 7. WPF Shader效果與PS 3.0着色器
- 8. DirectX 9 +着色器效果:禁用顏色的平滑過渡
- 9. 在ggplot2下手動着色平滑線
- 10. 正常化和平滑鼠標移動?
- 11. 在SceneKit中使用金屬着色器
- 12. 金屬着色器與SceneKit SCNProgram
- 13. SharpGL和幾何着色器
- 14. 如何正常關閉procrun?
- 15. 關閉cleartype /字體平滑和平移@贏CE 7
- 16. iOS + SceneKit:如何將紋理着色器應用於紋理?
- 17. 如何抵消Unity着色器中的正常UV?
- 18. 圖形與滾動平均值數據不平滑正常
- 19. 平滑關閉導航抽屜
- 20. 關閉鍵盤的平滑過渡
- 21. Openlayers 3關閉平滑滾動
- 22. 在OpenLayers中關閉圖像平滑3
- 23. OpenGL着色器:不插值顏色
- 24. OpenGL着色器和常量
- 25. 如何撤消平滑着色 - 攪拌機
- 26. 如何使用像素着色器來實現平滑文本?
- 27. three.js在平滑着色時保持摺痕定製幾何
- 28. 如何正常關閉任何WSGI服務器?
- 29. 平鋪渲染計算着色器光剔除和着色
- 30. SceneKit着色器根據基於節點的世界座標覆蓋顏色
如果希望每個面都是平坦的表面,這是一個很好的簡單方法,但請注意,如果您想要不是三角形的多邊形曲面,此方法雖然看起來很好,但也會生成比頂點更多的頂點它需要。此外,SceneKit有支持此功能的方法,但它需要使用GeometrySource進行法線處理,程序員需要做更多的工作。我會舉一個例子,如果我得到第二個。另請注意,如果您的幾何圖形具有常規來源,則將其轉換爲MDLMesh也將使用這些法線,並且您可能會丟失銳利邊緣。 – Ash