HLFX.Ru Forum
Показать все 14 сообщений этой темы на одной странице

HLFX.Ru Forum (http://hlfx.ru/forum/index.php)
- OpenGL (http://hlfx.ru/forum/forumdisplay.php?forumid=7)
-- Эффект контура ребра (http://hlfx.ru/forum/showthread.php?threadid=5119)


Отправлено ILZM 16-05-2018 в 13:15:

Эффект контура ребра

Привет всем.

Потребовалось создать эффект обводки ребра полигона, но только квадрата. Как здесь.



Движок libgdx на java. Можно писать вершинный и фрагментный шейдер.
Как я понял, есть 2 варианта:
1. Нарисовать на текстуре. Только вот материал генерируется в коде. Как достать текстуру, и как выглядит UV развертка пока что неясно. Скорее всего у такого подхода есть минус. При масштабировании линия будет нечетка видна, плюс алиасинг
2. Написать свой GLSL шейдер. В libgdx весь рендеринг завязан на стандартных шейдерах.
DefaultShader.java
fragment_shader
default_vertex

Как называется такой эффект?
Техники написания шейдеров отличаются на разных движках?

Спасибо


Отправлено FiEctro 16-05-2018 в 13:26:

>> Как называется такой эффект?

Похоже на cell shading. Но там не обводится каждое ребро.


Наверное нужно искать ребра где пересекаются плоскости. И уже что то делать с ними.

__________________
Для организации коллектива надо уметь ссать в уши виртуозно (с) Raid


Отправлено ILZM 16-05-2018 в 13:42:

FiEctro его первым делом нашел, но это не он. Этот эффект во всех 3Д-редакторах используется


Отправлено nemyax 16-05-2018 в 14:56:

ILZM
Я для такого отдельно вызываю glDrawArrays(GL_LINES, otkuda1, skoka1); и glDrawArrays(GL_TRIANGLES, otkuda2, skoka2);
В шейдере держу uniform int для обозначения режима отображения. А перед каждым из этих вызовов устанавливаю униформу в соответствующее значение, типа glUniform1i(comp_uniform, DRAW_EDGES);
Только вершинам рёбер придётся слегка подвинуть gl_Position.
Если хочешь, можешь генерить рёбра геометрическим шейдером в виде узких прямоугольников рожей в экран. Я пробовал, но мне не понравилось. И уж в Wings оно точно рисуется без геомки.

Добавлено 16-05-2018 в 17:56:

Цитата:
ILZM писал:
Нарисовать на текстуре

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


Отправлено ILZM 17-05-2018 в 12:28:

nemyax спасибо. Если дополнительно рендерить тот же самый меш с GL_LINES, вместо GL_TRIANGLES, то выходит то, что нужно


Отправлено nemyax 17-05-2018 в 15:17:

Цитата:
ILZM писал:
Если дополнительно рендерить тот же самый меш с GL_LINES, вместо GL_TRIANGLES, то выходит то, что нужно

Ну это тебе повезло. Так-то GL_LINES берёт вершины парами. Поменяется порядок вершин в треугольниках, и появятся у тебя пробелы.


Отправлено Дядя Миша 17-05-2018 в 15:38:

nemyax там не нужен GL_LINES. Там достаточно

glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );

и в конце отрисовки вернуть обратно на GL_FILL. Треугольники через GL_LINES рисовать довольно дурацкая идея.

__________________
В действительности всё может оказаться иначе, чем оно есть на самом деле

My Projects: download page


Отправлено nemyax 17-05-2018 в 15:51:

Дядя Миша
Но ему-то четырёхугольники нужны, а glPolygonMode обведёт треугольники, не?


Отправлено Дядя Миша 17-05-2018 в 17:00:

nemyax у тебя какое-то странное представление об OpenGL.
PLOYGON_MODE всего лишь определяет как именно мы рисуем полигоны - закрашенные или проволочные. А рисуем через тот же самый glBegin( GL_ЧТОТО_ТАМ )

__________________
В действительности всё может оказаться иначе, чем оно есть на самом деле

My Projects: download page


Отправлено nemyax 17-05-2018 в 17:11:

Дядя Миша
Ну я начал, когда уже рисовали не через глбегин =)
Но да, если данные выложены под GL_TRIANGLE_STRIP или GL_TRIANGLE_FAN, то GL_LINE сделает контуры.


Отправлено Garux 27-05-2018 в 20:17:

А возможно ли рисовать полигон и проволоку разом? Два прохода по сцене жирно получается.


Отправлено nemyax 27-05-2018 в 23:49:

Геометрическим только.


Отправлено Garux 13-07-2018 в 19:26:

тут: https://tommyhinks.com/2011/02/10/s...rame-rendering/
говорят, что можно без геомки, но им лутшы


Отправлено nemyax 13-07-2018 в 22:45:

Можно, но тебе придётся предрасчитывать и хранить барицентрические координаты двух соседей на каждой вершине.


Временная зона GMT. Текущее время 04:44.
Показать все 14 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Chain Studios © 2005-2018