将SCNGeometry渲染为线框

时间:2015-03-01 13:17:32

标签: ios shader fragment-shader scenekit

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

我发现我可以使用所使用的shaderModifiers的{​​{1}}属性来完成此任务。着色器修改器的示例:

SCNMaterial

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

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

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

3 个答案:

答案 0 :(得分:11)

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

function download(filename, text) { var element = document.createElement('a'); element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)); element.setAttribute('download', filename); element.style.display = 'none'; document.body.appendChild(element); element.click(); document.body.removeChild(element); window.close(); }

答案 1 :(得分:4)

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

gameView.debugOptions.insert(SCNDebugOptions.ShowWireframe)

或者如果使用以下命令启用统计信息,则可以以交互方式执行:

gameView.showsStatistics = true

(gameView是SCNView)的实例

答案 2 :(得分:2)

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

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

  

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

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

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

使用SceneKit,您可能没有为您正在使用的几何体设置重心坐标顶点属性(又名SCNGeometrySource)的额外皱纹,您可能不想这样做生成一个人的艰苦工作。在OS X中,您可以使用带有SCNProgram的{​​{1}}在顶点/片段着色器运行之前添加重心坐标 - 但是您必须自己进行着色(即您无法搭载使用着色器修改器就像使用SceneKit着色一样。这在iOS中不可用 - 硬件没有几何着色器。如果碰巧在几何体中排成一行,您可以使用纹理坐标伪造它。


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