См. «Твердый каркас» - бумага 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) в вашем фрагментном шейдере. Это также позволяет создавать интересные эффекты.