SceneKit中的金属着色器勾勒出一个对象

Mar*_*lch 3 shader fragment-shader ios scenekit metal

我正在玩游戏并尝试在SceneKit中实现Metal Shader,它将勾勒出一个对象.

想法是绘制一个与此博客文章中的图像类似的轮廓(或轮廓)(博客文章不包含任何代码):

轮廓

我是SceneKit和Metal着色器的新手,所以我只能绘制一些几何体并编写简单的顶点或片段着色器.我很好奇我怎么能达到这种效果呢?它是在多次通过中完成的吗?

干杯!

war*_*enm 7

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

我写了一个小样本项目来演示并在此处发布.

核心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
Run Code Online (Sandbox Code Playgroud)

负责沿正常方向推顶点的顶点着色器部分如下所示:

const float extrusionMagnitude = 0.05;
float3 modelPosition = in.position + normalize(in.normal) * extrusionMagnitude;
Run Code Online (Sandbox Code Playgroud)

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

截图