Ios 以线框形式渲染SCNGeometry

Ios 以线框形式渲染SCNGeometry,ios,shader,fragment-shader,scenekit,Ios,Shader,Fragment Shader,Scenekit,我在iOS上使用SceneKit,我有一个几何体要渲染为线框。所以基本上我只想画线,所以没有纹理 我发现我可以使用usedscnmatary的shaderModifiers属性来实现这一点。着色器修改器的示例: material.shaderModifiers = [ SCNShaderModifierEntryPointFragment: "_output.color.rgb = vec3(1.0) - _output.color.rgb;" ] 此示例显然只是简单地反转输出颜色。我

我在iOS上使用SceneKit,我有一个几何体要渲染为线框。所以基本上我只想画线,所以没有纹理

我发现我可以使用used
scnmatary
shaderModifiers
属性来实现这一点。着色器修改器的示例:

material.shaderModifiers = [
    SCNShaderModifierEntryPointFragment: "_output.color.rgb = vec3(1.0) - _output.color.rgb;"
]
此示例显然只是简单地反转输出颜色。我对着色器片段必须使用的“GLSL”语言一无所知

有人能告诉我应该使用什么代码作为着色器片段来仅绘制边缘附近的区域,以使几何体看起来像线框吗

或者,可能有另一种方法将几何体渲染为线框。我很想听。

这不是(完全)答案,因为这是一个没有简单答案的问题

完全在着色器代码中进行线框渲染比看起来要困难得多,尤其是在没有几何体着色器的移动设备上。问题是顶点着色器(以及随后的片段着色器)没有知道多边形边在哪里所需的信息

我对着色器片段必须使用的“GLSL”语言一无所知

如果你真的想解决这个问题,你需要学习更多关于GLSL(OpenGL着色语言)的知识。有很多关于这方面的书籍和教程

一旦你有了一些GLSL,看看一些问题(比如)和关于这个问题的问题。(请注意,当您查找特定于移动设备的限制时,OpenGL ES与桌面上的WebGL具有相同的限制。)

有了SceneKit,您就有了一个额外的褶皱,对于您正在使用的几何体,您可能没有重心坐标顶点属性(aka
SCNGeometrySource
),并且您可能不想做生成一个的艰苦工作。在OS X中,您可以使用
SCNProgram
geometryShader
在顶点/碎片着色器运行之前添加重心坐标,但之后您必须自己进行着色(即,您不能像使用着色器修改器那样,背靠SceneKit着色)。而这在iOS中是不可用的——那里的硬件没有几何体着色器。如果纹理坐标恰好在几何体中对齐,则可以使用纹理坐标对其进行伪造


使用线条绘制对象可能更容易-尝试从原始(实心)几何体的源和元素创建新的
SCNGEOmetricy
,但在重新创建
SCNGEOmetricyElement
时,请使用
SCNPrimitiveTypeLine

,现在可以(至少在Cocoa中)使用:

gameView.debugOptions.insert(SCNDebugOptions.showWireframe)
或者,如果通过以下方式启用统计信息,则可以交互执行此操作:

gameView.showsStatistics = true
(gameView是SCNView的一个实例)

尝试将材质设置为.line(iOS 11+和macOS 10.13+):


sphereNode.geometry?.firstMaterial?.fillMode=.lines

感谢您详尽的回答!是的,你说得对。重新创建几何体可能是更好的方法。我已经在某个地方看到了这个建议,但当我尝试它时,我一无所获。我从简单地从SCNSphere中提取源和元素开始,并用它构建一个新的SCNGeometry。但当我这么做的时候,球体就消失了。所以我不确定我做错了什么。你能帮我写一些示例代码吗?如何用另一个几何体的相同源和元素构建一个新的几何体?@TomvanZummeren-你曾经写过这个代码吗?如果是这样的话,有没有可能分享一个答案?你有没有整理过?在3D设计应用程序中,一种方法是通过使用顶点位置在顶点之间创建细长的长方体或管状体/管道来“伪造”,这些看起来像线框。gameView.debugOptions=.ShowWireframe