Металлический вершинный шейдер расширяет отдельные треугольники - PullRequest
0 голосов
/ 28 января 2019

Я работаю над 2D-приложением для рисования.Я хотел бы создать эффект, когда линии расширяются, например:

Expanded lines

Это для анимации, где линии расширяются и появляются как воздушные шары.

Линии нарисованы в виде треугольных полос.Моя идея состоит в том, чтобы заставить их расширяться, увеличивая каждый треугольник в вершинном шейдере.Каждая вершина должна быть отодвинута от других вершин в треугольнике.

Чтобы сделать это, мне нужно было бы получить доступ к другим вершинам в треугольнике.Это возможно в металле?

vertex Vertex vertex_expand(device float2 *vertices [[buffer(0)]],
                          constant VertexUniforms *uniforms [[buffer(1)]],
                          uint vid [[vertex_id]]) {

// is vertices[vid - 1] and vertices[vid + 1] the previous and next vertices? 
// is vid=0 the first vertex?

}

1 Ответ

0 голосов
/ 28 января 2019

Да, вы можете получить доступ к другим вершинам, в зависимости от того, как вы выполняете рисование.Если вы делаете индексированное рисование, то связь между идентификаторами вершин и треугольниками регулируется вашим индексным буфером.Проблема, однако, в том, что вы не знаете, какой индекс используется для данного вызова вершинного шейдера (и он может быть вызван один раз для нескольких индексов, если все эти индексы ссылаются на одну и ту же вершину).

Таким образом, вам следует избегать индексированного рисования.

В этом случае, да, vertices[vid - 1] и vertices[vid + 1] - это предыдущие и следующие вершины.

Однако обратите внимание, что с треугольникомполоса, каждая вершина является членом нескольких треугольников.Таким образом, для каждой вершины нет одного уникального треугольника, от центра которого вы можете переместить эту вершину, чтобы расширить ее.Я ожидаю, что вы захотите, чтобы две вершины, которые являются соседями вдоль того же края полосы, что и обрабатываемая вами, используют их для вычисления нормали для сегмента, содержащего текущую вершину, и перемещаете вершину вдоль нее.

Поскольку вы анимируете и, следовательно, собираетесь делать это неоднократно, вы можете заранее рассчитать эти нормали и передать их как данные для каждой вершины.Вы можете использовать вычислительный шейдер для этих вычислений, хотя выполнение этого на процессоре может быть достаточно быстрым.Если вы предварительно вычислите нормали таким образом, вершинному шейдеру не нужно будет ссылаться на соседние вершины.

...