рендеринг силуэта с помощью webgl/opengl

Я пытался визуализировать силуэты на моделях САПР с помощью webgl. Ближе всего к желаемому результату я получил fwidth и точку между нормалью и вектором глаза. Однако мне было трудно контролировать ширину.

Я видел другую веб-программу просмотра, и она способна делать что-то вроде этого:

силуэты

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

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

Есть ли такой подход, который уже где-то задокументирован?

изменить 15.08.17

Я не нашел никаких документов или задокументированных методов по этому поводу. Но он получил пару голосов.

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


person pailhead    schedule 05.05.2017    source источник


Ответы (2)


Традиционным методом, основанным на шейдерах, является затенение Гуча. Оригинал статьи здесь:

http://artis.imag.fr/~Cyril.Soler/DEA/NonPhotoRealisticRendering/Papers/p447-gooch.pdf

person solidpixel    schedule 05.05.2017
comment
Я наткнулся на это, но не смог найти код, который выглядел бы так, как если бы он делал края, в основном он говорит о цвете? В любом случае, что конкретно происходит на изображении выше, так это то, что линии вычисляются там, где отрезок линии должен быть силуэтом. Это противоречит снимкам экрана в статье, это нельзя применить к спиральной пружине? Кроме того, если этот просмотрщик использует что-то подобное для произвольных форм для protives, он определенно дополняет его линиями. - person pailhead; 05.05.2017

Старый модный метод OpenGL от Джеффа Ландера

person icebeat    schedule 10.04.2020
comment
В конечном итоге я делаю это, обнаруживая края, в основном я добавляю еще пару атрибутов, содержащих нормаль двух треугольников, которым принадлежит край, и проверяю в шейдере, обращен ли один из них в сторону от камеры, а другой - в сторону. - person pailhead; 12.04.2020