在SceneKit中使用金属着色器来勾勒一个物体

3
我正在尝试在SceneKit中实现Metal着色器,来给物体加上轮廓线。这个想法类似于这篇博客中的这张图片(该博客没有任何代码):

silhouette

我对SceneKit和Metal着色器都不是很熟悉,所以只能画一些几何图形并编写简单的顶点或片段着色器。我很好奇如何实现这种效果?这是通过多次处理来完成的吗?

谢谢!


那不仅仅是一个轮廓。看起来更像是某种形式的“边缘检测”,这是一个你可以搜索以找到大量信息的术语。 - Ken Thomases
1个回答

11

这里的基本思路是克隆“选定”的节点及其几何形状,然后使用自定义的顶点和片段着色器沿着顶点法线向外“推”几何形状,并仅绘制克隆几何形状的背面并填充实心颜色。

我编写了一个小示例项目来演示并发布在 这里

核心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;

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

截图


1
非常感谢!这就是我喜欢 Stack Overflow 的原因。你总能找到乐于助人的人!我的原始想法是使用片段着色器做类似的事情,根据法线修改片段颜色,但这种方法看起来很有趣。如果需要,我会再发一个问题。再次感谢。 - Martin Pilch
我担心如何在不克隆模型的情况下完成它。我遇到了这个教程:http://in2gpu.com/2014/06/23/toon-shading-effect-and-simple-contour-detection/,但我正在努力将其重写为Metal。你介意我发送带有我的卡通着色实现的项目吗?你有时间检查我做错了什么吗? - Martin Pilch
听起来像是一个单独的问题。另外,您的项目链接显示404错误。 - warrenm
好的,我创建了另一个问题:https://stackoverflow.com/questions/53658843/implementing-toon-effect-with-metal-shader-and-scenekit - Martin Pilch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接