Основная идея здесь состоит в том, чтобы клонировать «выбранный» узел и его геометрию, а затем использовать пользовательский вершинный и фрагментный шейдер, чтобы «вытолкнуть» геометрию вдоль нормалей вершин, рисуя только задние грани клонированной геометрии ссплошной цвет.
Я написал небольшой пример проекта, чтобы продемонстрировать это, и разместил его здесь .
Основной код 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;
Оттуда вы просто применяете свою типичную матрицу проекции модель-вид и возвращаете плоский фрагмент из фрагмента.шейдер.