渲染一个SCNGeometry作为一个线框

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

我想通过使用SCNMaterialshaderModifiers属性来实现这一点。 着色器修改器的示例:

 material.shaderModifiers = [ SCNShaderModifierEntryPointFragment: "_output.color.rgb = vec3(1.0) - _output.color.rgb;" ] 

这个例子显然简单地反转了输出的颜色。 我不知道这个“GLSL”语言,我不得不使用shader片段。

任何人都可以告诉我,我应该使用什么代码作为着色器片段,只在边缘附近绘制,使几何看起来像一个线框?

或者也许有一个完整的方法来渲染一个几何线框。 我很想听到它。

现在有可能(至less在cocoa)有:

 gameView.debugOptions.insert(SCNDebugOptions.ShowWireframe) 

或者,如果启用统计信息,则可以交互式地执行此操作:

 gameView.showsStatistics = true 

(gameView是SCNView的一个实例)

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

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

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

在着色器代码中完全执行线框渲染要比看上去要困难得多,特别是在没有几何着色器的移动设备上。 问题是顶点着色器(和随后的片段着色器)没有知道多边形的边界所需要的信息。

我不知道这个“GLSL”语言,我不得不使用shader片段。

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

一旦你得到了一些GLSL,看看一些问题(比如从相关的边栏中提取的一些问题)以及其他一些关于这个问题的文章。 (请注意,当您寻找移动特定的限制时,OpenGL ES与桌面上的WebGL具有相同的限制。)

使用SceneKit,您可能会遇到额外的皱纹,您可能没有重心坐标顶点属性(又名SCNGeometrySource ),但您可能不希望生成一个几何体。 在OS X中,您可以使用带有geometryShaderSCNProgram在顶点/片段着色器运行之前添加重心坐标 – 但是您必须执行自己的着色(即不能像使用着色器修改器那样搭载SceneKit着色)。 这在iOS中不可用 – 那里的硬件不会做几何着色器。 如果这些坐标正好排列在几何体中,则可以使用纹理坐标来伪造它。


使用线绘制对象可能会更容易 – 尝试从原始(实体)几何体的源和元素中创build一个新的SCNGeometry ,但在重新创buildSCNGeometryElement ,请使用SCNPrimitiveTypeLine