将SCNGeometry渲染为线框

Tom*_*ren 9 shader fragment-shader ios scenekit

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

我发现我可以使用shaderModifiersused 的属性SCNMaterial来实现这一点.着色器修改器的示例:

material.shaderModifiers = [
    SCNShaderModifierEntryPointFragment: "_output.color.rgb = vec3(1.0) - _output.color.rgb;"
]
Run Code Online (Sandbox Code Playgroud)

这个例子显然只是反转输出颜色.我对用于着色器片段的'GLSL'语言一无所知.

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

或者可能还有一种将几何体渲染为线框的方法.我很乐意听到它.

小智 13

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

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


ffe*_*rri 5

现在有可能(至少在可可中):

gameView.debugOptions.insert(SCNDebugOptions.ShowWireframe)
Run Code Online (Sandbox Code Playgroud)

或者您可以通过以下方式交互式地进行统计:

gameView.showsStatistics = true
Run Code Online (Sandbox Code Playgroud)

(gameView是的实例SCNView


ric*_*ter 3

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

\n\n

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

\n\n
\n

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

\n
\n\n

如果您确实想解决这个问题,您需要更多地了解 GLSL(OpenGL 着色语言)。有大量的书籍和教程。

\n\n

一旦您掌握了一些 GLSL,请查看一些问题(例如从相关侧边栏拉出的这个问题)以及人们写的其他内容有关该问题的其他内容。(请注意,当您寻找特定于移动设备的限制时,OpenGL ES 与桌面上的 WebGL 具有相同的限制。)

\n\n

使用 SceneKit,您可能会遇到额外的问题,即您可能没有SCNGeometrySource正在使用的几何体的重心坐标顶点属性(也称为 ),并且您可能不想进行生成的艰苦工作一。在 OS X 中,您可以使用SCNProgramgeometryShader来添加重心坐标,但随后您必须进行自己的着色(即您不能像您一样使用 SceneKit 着色)可以使用着色器修改器)。这在 iOS \xe2\x80\x94 中不可用,那里的硬件不支持几何着色器。如果纹理坐标恰好在几何体中对齐,您也许可以使用纹理坐标来伪造它。

\n\n
\n\n

使用线 \xe2\x80\x94 绘制对象可能会更容易,尝试SCNGeometry从原始(实体)几何体的源和元素中创建一个新对象,但是在重新创建时SCNGeometryElement,请使用SCNPrimitiveTypeLine.

\n