Можно ли получить доступ ко всем вершинам многоугольника в вершинном шейдере? - PullRequest
5 голосов
/ 18 января 2012

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

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

Чего мне не хватает? Разве невозможно получить доступ к соседним вершинам в вершинном шейдере? Разве то, что я пытаюсь сделать, невозможно без геометрических шейдеров?

1 Ответ

2 голосов
/ 18 января 2012

Вы, кажется, действительно перечитали абзац в 2.1, в котором написано

Шаг G1 обычно всегда выполняется в вершинном шейдере.Шаг G2 должен выполняться в геометрическом шейдере, поскольку геометрический шейдер имеет доступ ко всем вершинам многоугольника (при условии, что это треугольник).Следовательно, если геометрический шейдер не используется, вершинный шейдер должен получить другие вершины в качестве атрибутов для вычисления расстояний.Это влечет за собой то, что код приложения не является инвариантным относительно того, используется ли каркасный метод, что необходимо передавать дополнительные данные и, наконец, использование индексированных примитивов исключается, поскольку атрибуты вершины зависят от того, какой треугольник нарисован.

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

...