Определить расстояние от каждой вершины в шейдерном фрагменте glsl - PullRequest
0 голосов
/ 27 апреля 2020

Скажем, у меня есть простой треугольник OpenGL, подобный этому:

//1
glColor3f(1, 0, 0);
glVertex3f(0.5, 0, 0);
//2
glColor3f(0, 1, 0);
glVertex3f(0, 1, 0);
//3
glColor3f(0, 0, 1);
glVertex3f(1, 1, 0);

enter image description here

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

Есть ли способ определить эти расстояния в шейдере, не пропуская данные вершин, такие как координаты текстуры или цвета?

1 Ответ

1 голос
/ 27 апреля 2020

Не в стандартном OpenGL. Существуют два расширения c, определяемые поставщиком:

  1. AMD_shader_explicit_vertex_parameter
  2. NV_fragment_shader_barycentric

, который даст вам доступ к барицентрическим c координатам в примитиве. Но без таких расширений есть только очень неуклюжие способы передачи этих данных в ФС, и у каждого будут существенные недостатки. Вот некоторые идеи:

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

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

  • Вы можете сделать ваши данные вершин доступными для FS (например, через SSBO) и в основном вычислить барицентрические c координаты на основе gl_FragCoord и соответствующих конечных точек. Но для этого требуется, чтобы вы получили информацию о том, какие вершины использовались в FS, для чего могут потребоваться дополнительные структуры данных (например, некоторая таблица поиска индексов треугольников и / или вершин на основе gl_PrimitiveID).

...