SceneKit 中用于勾勒对象轮廓的金属着色器

Metal shader in SceneKit to outline an object

我正在玩弄并尝试在 SceneKit 中实现 Metal 着色器,该着色器将勾勒出一个对象。

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

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

干杯!

这里的基本思想是克隆 "selected" 节点及其几何图形,然后使用自定义顶点和片段着色器 "push" 沿顶点法线绘制几何图形,仅绘制背面具有纯色的克隆几何图形。

我写了一个小示例项目来演示这一点并发布了它 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;

从那里,您只需应用典型的 model-view-projection 矩阵和 return 来自片段着色器的平面颜色。