将 SCNGeometry 渲染为线框

Posted

技术标签:

【中文标题】将 SCNGeometry 渲染为线框【英文标题】:Render an SCNGeometry as a wireframe 【发布时间】:2015-05-01 20:55:16 【问题描述】:

我在 ios 上使用 SceneKit,并且我想要将几何图形渲染为线框。所以基本上我只想画线条,所以没有纹理。

我发现我可以使用 SCNMaterialshaderModifiers 属性来完成此操作。着色器修改器示例:

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

这个例子显然只是简单地反转了输出颜色。我对必须用于着色器片段的这种“GLSL”语言一无所知。

谁能告诉我应该使用什么代码作为着色器片段以仅在边缘附近绘制,以使几何图形看起来像线框?

或者也许还有另一种方法可以将几何图形渲染为线框。我很想听。

【问题讨论】:

你有没有整理过这个?在 3D 设计应用程序中,一种方法是通过使用顶点位置来“伪造”它,在顶点之间创建细长的盒子或管子/管道,这些看起来像线框。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

gameView.debugOptions.insert(SCNDebugOptions.showWireframe)

或者,如果启用统计信息,您可以交互地进行:

gameView.showsStatistics = true

(gameView 是SCNView 的一个实例)

【讨论】:

gameView.debugOptions = .ShowWireframe【参考方案3】:

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

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

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

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

一旦您掌握了一些 GLSL,请查看一些关于该问题的问题(例如 this one pulled from the Related sidebar)和 other stuff people have written。 (请注意,当您在寻找特定于移动设备的限制时,OpenGL ES 与桌面上的 WebGL 具有相同的限制。)

使用 SceneKit,您可能没有针对您正在使用的几何图形的重心坐标顶点属性(又名SCNGeometrySource),而且您可能不想努力生成一个的工作。在 OS X 中,您可以使用 SCNProgramgeometryShader 在顶点/片段着色器运行之前添加重心坐标 - 但是您必须自己进行着色(即,您不能像您一样搭载 SceneKit 着色可以使用着色器修改器)。这在 iOS 中是不可用的——那里的硬件不做几何着色器。如果纹理坐标恰好排列在您的几何图形中,您也许可以使用纹理坐标来伪造它。


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

【讨论】:

感谢您的详尽回答! 是的,你是对的。重新创建几何图形可能是更好的方法。我已经在某个地方看到了这个建议,但是当我尝试它时,我一无所获。我从简单地从 SCNSphere 中提取源和元素并用它构建一个新的 SCNGeometry 开始。但是当我这样做时,球体就消失了。所以我不确定我做错了什么。您能否尝试帮助我提供一些示例代码,如何使用另一个几何图形的相同源和元素构建新几何图形? @TomvanZummeren - 你有没有写过这段代码?如果是这样,是否可以分享作为答案?

以上是关于将 SCNGeometry 渲染为线框的主要内容,如果未能解决你的问题,请参考以下文章

渲染管道几何阶段四“几何着色器”

SCNGeometry / SCNCylinder 仅渲染边缘/边框(存储颜色,清除内容)

渲染管道几何阶段四“几何着色器”

在 SceneKit 中镜像 SCNGeometry

OpenGL:调试“单通道线框渲染”

场景视图控制栏