Как раскрасить вершины в виде сетки (например, в режиме каркаса) с помощью шейдеров? - PullRequest
1 голос
/ 22 июня 2019

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

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

Моя местность и как она выглядит в режиме каркаса: My terrain, and how it looks in wireframe mode

Как можно поступить в пиксельном шейдере или иным образом?

Ответы [ 2 ]

0 голосов
/ 23 июня 2019

Учитывая, что у вас есть буфер вершин, содержащий все вершины вашей сетки, создайте индексный буфер, который использует буфер вершин, но вместо создания групп по 3 для треугольников используйте пары из 2 для сегментов линии.Это будет список строк, который должен содержать все пары, составляющие квадраты сетки.Вы можете создать этот список автоматически в вашей программе.

Грубый алгоритм рендеринга:

  1. Рендеринг вашей местности как обычно
  2. Переключите вашу примитивную топологию на Line List
  3. Назначить новый индексный буфер
  4. Отключить выборку по глубине (или добавить небольшое значение высоты для каждой точки в вершинном шейдере, чтобы сетка отображалась над ландшафтом)
  5. Отображение списка линий

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

0 голосов
/ 22 июня 2019

См. «Твердый каркас» - бумага NVIDIA, выпущенная несколько лет назад.

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

Учитывая грань с вершинами A, B, C, вы бы сгенерировали барицентрические значения:

А: 1,0,0

B: 0,1,0

С: 0,0,1

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

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

Обратите внимание, что бумаге также ~ 10 лет. В настоящее время в некоторых ситуациях есть способы получить барированные координаты без геометрического шейдера, и я уверен, что есть и другие обходные пути. (Геометрические шейдеры имеют свое место, но не лучший друг производительности.)

Кроме того, хотя шейдеры geom идут с идеальным ударом, они значительно быстрее, чем второй проход, рисуют каркас. Рисование в каркасном режиме в GL (или DX) влечет за собой значительное снижение производительности, поскольку вы просите растеризатор смоделировать алгоритм линий Брезенхэма. Это не то, как работают растеризаторы, и это чертовски медленно.

Этот подход также решает любые проблемы z-боя, которые могут возникнуть при двух проходах.

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

Или, для развлечения: сделайте это как шаг постобработки. Ищите высокие значения ddx () / ddy () (или dFdx () / dFdy (), в зависимости от вашего API) в вашем фрагментном шейдере. Это также позволяет создавать интересные эффекты.

...