Войти
ПрограммированиеФорумГрафика

Solid wireframe

Страницы: 1 2 Следующая »
#0
9:37, 28 сен. 2017

Сделал рендер сетки поверх поверхности меша по этому пейперу http://developer.download.nvidia.com/SDK/10/direct3d/Source/Solid… Wireframe.pdf. И есть проблема.

По пейперу есть случаи когда у треугольника одна или две вершина находятся вне NDC куба. Следствием таких случаев является невозможность рассчитать расстояния будущего пикселя полностью на этапе выполнения геометрического шейдера.

+ Показать


Для этого авторы техники предлагают рассчитать дополнительную информацию для фрагментного шейдера. Собственно, всё хорошо работает за исключением случаев, когда на экране видны две из трёх вершин треугольника. По пейперу это случаи #1, #2, #4.

+ Показать


Ниже код.

+ Показать

И ещё один момент:
formula | Solid wireframe

Что значит A’A в этой формуле? Это не dot-product точно, т. к. в пейперы они явно пишутся как dot().


#1
15:39, 28 сен. 2017
Изображение
#2
17:45, 28 сен. 2017

Алмаз
По моему, это тупо отрезок, в их обозначениях.

#3
20:09, 28 сен. 2017

Ну т. е. как я это осознал.
Если у нас обе точку по нужную сторону ближней плоскости, то проективная трансформация переводит отрезки в отрезки.
У нас A - в нужной стороне, а A' - в неправильной. Нам достаточно получить любой отрезок на прямой, которая проходит через них, чтобы по нему построить направление.
Если A - на нужной стороне, а A' - на неправильной, то ясно, что если отложить от A такой же отрезок в обратную сторону, то эта точка будет в нужной стороне.
Ну и это и будет A+A'A. Почему они не написали (2*A-A') - я хз.
Ну и так как направление теперь обратное, то берём не {эта точка минус A}, а {A минус эта точка}.

#4
0:15, 29 сен. 2017

Спасибо большое, добрый человек.

#5
5:10, 29 сен. 2017

Алмаз
я не в теме, что мешает просто рендерить меш ещё раз с GL_LINES и glDepthFunc(GL_EQUAL)?

#6
8:51, 29 сен. 2017

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

#7
11:33, 29 сен. 2017

Алмаз
> Эта техника рендерит сетку и меш за один проход, при этом сетка получается
> сглаженная и не z-файтит с мешем вообще. Опционально можно ещё задать
> расстояние, на котором сетка будет плавно исчезать.

Как получилось преодолеть случай, когда полигон полностью закрашивается?
http://www.gamedev.ru/files/images/trickycase.jpg

#8
20:34, 29 сен. 2017

0xc0de
Для этих случаев в геометрическом шейдере вычисляются дополнительные  вектора и точки, по которым во фрагментном шейдере считаются расстояния фрагмента до трех вершин. Т.  е. часть работы из геометрического шейдера переносится во фрагментый. По пейперу это случаи 2-6.

#9
0:12, 30 сен. 2017

Алмаз

Спасибо) Разобрался. У меня просто всегда срабатывал simple case, т.е Mask==0, забыл что у меня глубина инвертирована :) Нужно было так:

Mask = uint(gl_in[0].gl_Position.z > gl_in[0].gl_Position.w)*4 + uint(gl_in[1].gl_Position.z > gl_in[1].gl_Position.w)*2 + uint(gl_in[2].gl_Position.z > gl_in[2].gl_Position.w); 

#10
11:16, 30 сен. 2017

0xc0de
А шум на гранях как на втором скрине есть?

#11
13:36, 30 сен. 2017

Алмаз
> А шум на гранях как на втором скрине есть?

Есть, пока непонятно, как с этим бороться

#12
14:13, 30 сен. 2017

Я делал рендер сетки при помощи barycentric координат.
http://codeflow.org/entries/2012/aug/02/easy-wireframe-display-wi… -coordinates/

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

В WebGL в случае с индексированным мешем с этим - проблема. На Desktop возможно можно легко извернутся с геометрическим шейдером.

#13
15:12, 30 сен. 2017

Deamon
> Я делал рендер сетки при помощи barycentric координат.
> http://codeflow.org/entries/2012/aug/02/easy-wireframe-display-wi…
> -coordinates/
> Но там нужно дополнительно нумеровать вершины, а именно на каждую вершину
> передавать значение (1, 0, 0)\(0, 1, 0)\(0, 0, 1) и так, чтобы в каждом
> треугольнике не было повторяющихся значений.

Круто. Сделал только что по этой технике. Времени ушло минут 10. Кода в разы меньше, результат примерно такой же, как у техники от NVidia. Формирование барицентрических координат сделал в геометрическом шейдере. Артефактов почти нет.

#14
21:06, 30 сен. 2017

0xc0de
Да, метод проще для случая #0. Для других случаев как сделал?

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.