将 SCNGeometry 渲染为线框
Posted
技术标签:
【中文标题】将 SCNGeometry 渲染为线框【英文标题】:Render an SCNGeometry as a wireframe 【发布时间】:2015-05-01 20:55:16 【问题描述】:我在 ios 上使用 SceneKit,并且我想要将几何图形渲染为线框。所以基本上我只想画线条,所以没有纹理。
我发现我可以使用 SCNMaterial
的 shaderModifiers
属性来完成此操作。着色器修改器示例:
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 中,您可以使用 SCNProgram
和 geometryShader
在顶点/片段着色器运行之前添加重心坐标 - 但是您必须自己进行着色(即,您不能像您一样搭载 SceneKit 着色可以使用着色器修改器)。这在 iOS 中是不可用的——那里的硬件不做几何着色器。如果纹理坐标恰好排列在您的几何图形中,您也许可以使用纹理坐标来伪造它。
仅使用线条绘制对象可能更容易 - 尝试从原始(实体)几何体的源和元素创建一个新的 SCNGeometry
,但在重新创建 SCNGeometryElement
时,请使用 SCNPrimitiveTypeLine
。
【讨论】:
感谢您的详尽回答! 是的,你是对的。重新创建几何图形可能是更好的方法。我已经在某个地方看到了这个建议,但是当我尝试它时,我一无所获。我从简单地从 SCNSphere 中提取源和元素并用它构建一个新的 SCNGeometry 开始。但是当我这样做时,球体就消失了。所以我不确定我做错了什么。您能否尝试帮助我提供一些示例代码,如何使用另一个几何图形的相同源和元素构建新几何图形? @TomvanZummeren - 你有没有写过这段代码?如果是这样,是否可以分享作为答案?以上是关于将 SCNGeometry 渲染为线框的主要内容,如果未能解决你的问题,请参考以下文章