首页 文章

将SCNGeometry渲染为线框

提问于
浏览
6

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

我发现我可以使用 SCNMaterial 使用的 shaderModifiers 属性来完成此任务 . 着色器修改器的示例:

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

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

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

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

3 回答

  • 4

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

    gameView.debugOptions.insert(SCNDebugOptions.ShowWireframe)
    

    或者如果启用统计信息,您可以以交互方式执行以下操作:

    gameView.showsStatistics = true
    

    (gameView是 SCNView 的一个实例)

  • 2

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

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

  • 10

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

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

    我对用于着色器片段的'GLSL'语言一无所知 .

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

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

    使用SceneKit,你可能没有一个额外的皱纹,你可能没有一个重心坐标顶点属性(也就是 SCNGeometrySource ),你想要做一个生成一个的几何体 . 在OS X中,你可以使用带有 geometryShaderSCNProgram 在顶点/片段着色器运行之前添加重心坐标 - 但是你必须自己进行着色(即你可以在iOS中使用 - 硬件不能做几何着色器 . 如果碰巧在几何体中排成一行,您可能可以使用纹理坐标伪造它 .


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

相关问题