Металлический шейдер в SceneKit для контура объекта - PullRequest
0 голосов
/ 20 ноября 2018

Я играю вокруг и пытаюсь реализовать металлический шейдер в SceneKit, который будет выделять объект.

Идея состоит в том, чтобы нарисовать контур (или силуэт), подобный этому изображению, найденному в этом посте (пост не содержит кода):

silhouette

Я новичок в SceneKit и Metal шейдерах, поэтому я могу просто нарисовать некоторую геометрию и написать простой вершинный или фрагментный шейдер.Мне интересно, как я могу достичь такого эффекта?Это сделано за несколько проходов?

Приветствия!

1 Ответ

0 голосов
/ 21 ноября 2018

Основная идея здесь состоит в том, чтобы клонировать «выбранный» узел и его геометрию, а затем использовать пользовательский вершинный и фрагментный шейдер, чтобы «вытолкнуть» геометрию вдоль нормалей вершин, рисуя только задние грани клонированной геометрии ссплошной цвет.

Я написал небольшой пример проекта, чтобы продемонстрировать это, и разместил его здесь .

Основной код 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;

Оттуда вы просто применяете свою типичную матрицу проекции модель-вид и возвращаете плоский фрагмент из фрагмента.шейдер.

Screenshot

...