我正在尝试在SceneKit中实现Metal着色器,来给物体加上轮廓线。这个想法类似于这篇博客中的这张图片(该博客没有任何代码):
我对SceneKit和Metal着色器都不是很熟悉,所以只能画一些几何图形并编写简单的顶点或片段着色器。我很好奇如何实现这种效果?这是通过多次处理来完成的吗?
谢谢!
这里的基本思路是克隆“选定”的节点及其几何形状,然后使用自定义的顶点和片段着色器沿着顶点法线向外“推”几何形状,并仅绘制克隆几何形状的背面并填充实心颜色。
我编写了一个小示例项目来演示并发布在 这里。
核心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;
接下来,您只需应用典型的模型-视图-投影矩阵,并从片段着色器返回一个平面颜色。