【问题标题】:Metal shader in SceneKit to outline an objectSceneKit 中的金属着色器来勾勒对象的轮廓
【发布时间】:2019-04-23 00:00:38
【问题描述】:

我正在尝试在 SceneKit 中实现金属着色器来勾勒对象。

这个想法是画一个类似于this blogpost中的这张图片的轮廓(或剪影)(博文不包含任何代码):

我是 SceneKit 和 Metal 着色器的新手,所以我只能绘制一些几何图形并编写简单的顶点或片段着色器。我很好奇我怎样才能达到这种效果?是否分多次完成?

干杯!

【问题讨论】:

  • 这不仅仅是一个剪影。这看起来更像是某种形式的“边缘检测”,您可以搜索这个术语来查找大量信息。

标签: ios shader scenekit metal fragment-shader


【解决方案1】:

这里的基本思想是克隆“选定”节点及其几何体,然后使用自定义顶点和片段着色器将几何体沿顶点法线“推”出,仅绘制克隆几何体的背面纯色。

我编写了一个小示例项目来演示这一点,并将其发布在here。

核心 Swift 代码如下所示:

let outlineProgram = SCNProgram()
outlineProgram.vertexFunctionName = "outline_vertex"
outlineProgram.fragmentFunctionName = "outline_fragment"

let outlineNode = duplicateNode(node)
scene.rootNode.addChildNode(outlineNode)
outlineNode.geometry?.firstMaterial?.program = outlineProgram
outlineNode.geometry?.firstMaterial?.cullMode = .front

顶点着色器中负责将顶点推向其法线的部分如下所示:

const float extrusionMagnitude = 0.05;
float3 modelPosition = in.position + normalize(in.normal) * extrusionMagnitude;

从那里,您只需应用典型的模型-视图-投影矩阵并从片段着色器返回一个平面颜色。

【讨论】:

  • 非常感谢!这就是我喜欢SO的原因。您总能找到乐于提供帮助的人!我最初的想法是用片段着色器做类似的事情,根据法线修改片段颜色,但这种方法看起来很有趣。如果需要,将发布另一个问题。再次感谢您。
  • 我担心如何在不克隆模型的情况下做到这一点。我遇到了本教程:in2gpu.com/2014/06/23/…,但我正在努力将其重写为 Metal。您介意我将我的卡通着色实现项目发送给您吗?你有时间检查我做错了什么吗?
  • 听起来像是一个单独的问题。此外,您的项目链接给出了 404 错误。
  • 好点。我创建了另一个问题:stackoverflow.com/questions/53658843/…
猜你喜欢
  • 1970-01-01
  • 2019-03-28
  • 2021-01-23
  • 2018-03-18
  • 2016-10-08
  • 1970-01-01
  • 2015-09-05
  • 1970-01-01
相关资源
最近更新 更多