Контур / Силуэт рендеринга с OpenGL - PullRequest
5 голосов
/ 12 января 2012

Я знаю, что есть несколько методов для достижения этой цели, но ни один из них не кажется достаточным.

  • Использование фильтра sobel / laplace не находит все правильные края (и находит нежелательные края), медленно и не дает мне контроля над шириной контура.

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

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

Есть идеи?

edit Я даже сам пытался найти ребра с помощью геометрического шейдера, как описано в http://prideout.net/blog/?p=54,, но он страдает теми же пробелами, что и метод каркаса.

edit Мне удалось избавиться от артефактов рендеринга с помощью техники каркаса, отключив GL_DEPTH_TEST при рисовании контуров. К сожалению, я также потерял контуры перекрывающихся объектов ...

Моя цель - добиться того же эффекта, который они используют для персонажей в игре «Логово драконов 3». Кто-нибудь знает, как они это сделали?

1 Ответ

3 голосов
/ 13 января 2012

В случае, если вы после реального обнаружения края, я обнаружил, что вы можете получить довольно хорошие результаты с помощью сверточного ядра LoG (Laplacian over Gaussian) 5x5, примененного к буферу глубины и смешанного с визуализированным объектом (возможно, с приличным FSAA). Вам нужно немного настроить фрагментный шейдер, чтобы сжать смешанный контур, но результаты хорошие. (и это вопрос того, что вы действительно хотите, кстати)

обратите внимание, что:

1) Фильтрация по Лапласу и фильтрация журналов - разные вещи и дают разные результаты

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...