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

Как правильно рисовать толстые линии на поверхности без z-файтинга и косяков?

Страницы: 1 2 Следующая »
#0
19:27, 12 мар 2023

Знаю, темя заезженная, но всё же, вот рисую я модельку с линиями на рёбрах:
Изображение
линии имеют толщину, то есть они не в 1 пиксель (ну и MSAA всякий).
Сами линии генерю в геом шейдере по классике, то есть генерю прямоугольник (в 3d, в world space), повёрнутый своей плоскостью максимально возможным способом к камере.
В итоге на острых углах модели закономерно эти линии пропадают, т.к. почти весь прямоугольник оказывается внутри меша как бы:
Изображение
ну то есть линия какая-то там есть, но там дикий z-файтинг за 1 единственный пиксель на ребре с мешем, разумеется, ни о какой толщине, да и вообще о качестве речи не идёт:
Изображение
Хмм... ну конечно же можно отрубить тест глубины при рендере линий:
Изображение
но мне такого не надо, мне нужно что бы невидимые линии не рисовались, а видимые рисовались нормально и с толщиной поверх меша.

Собственно вопрос, как вообще такое можно сделать?
Не, ну конечно можно линии рисовать с offset-ом от поверхности, но это бред, я так делать не буду... :)

#1
19:40, 12 мар 2023

THE_MASTER
> Не, ну конечно можно линии рисовать с offset-ом от поверхности, но это бред, я
> так делать не буду...
но это не бред. А еще линии можно рисовать в шейдере, в который передавать буфер нормалей.

#2
19:43, 12 мар 2023

как вариант генерить не прямоугольник а параллипипед растянутый. центрированный по линии.
будет самый честный вариант (ИМХО)

#3
19:45, 12 мар 2023

а так проще смещать конечно.

#4
(Правка: 20:06) 20:03, 12 мар 2023

Noir
можно вместо параллелепипеда использовать призму с комфортным количеством сторон многогранника, начиная от трёх. Либо использовать все тот же "квад", но со смещением по центральной оси предварительно добавив доп. вершины для её формирования.

#5
20:13, 12 мар 2023

Можно в отдельную текстуру записывать ID квада, а потом постпроцессом обнаруживать грани.

#6
(Правка: 21:07) 20:52, 12 мар 2023

хмм... пока что всё не то... У меня мысли такие были, рендерю сначала обычный меш, а затем рендерю линии, ну и так вот, если линия лежит +- на этом меше с какой-то дельтой, то нужно во что бы то ни стало оверлеем перекрасить пикселе старого меша на линию, как? Хмм... пока хз, нужно подумать, в шейдере же Z-test не отключишь... в общем буду думать, пока идей нет

upd: наверное чё-нить со стенсилом и вторым проходом можно замутить

#7
21:10, 12 мар 2023

С оффетом и рисуют

#8
(Правка: 22:15) 22:10, 12 мар 2023

Не пробовал установить тест глубины в "меньше или равно"?

glDepthFunc(GL_LEQUAL)

Upd: Хотя да, иначе то линии и не нарисовать.

#9
(Правка: 2:08) 1:43, 13 мар 2023

При расчете матрицы проекции near plane насколько отдалена? Помню у меня были проблемы с z fighting со значением 0.001. Если ее поставить подальше, например 0.1, то проблема исчезала. Точность float не бесконечна) Стоит попробовать, но не уверен что поможет в твоем случае. Лучше конечно рисовать с оффсетом.

#10
2:08, 13 мар 2023

THE_MASTER
Depth Bias не спасает?

если что я про аппаратный Depth Bias который тут: https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ns-d3d1… sterizer_desc

#11
10:21, 13 мар 2023

Sanya838
> При расчете матрицы проекции near plane насколько отдалена?
у меня near plane = -500000.0f, far = +500000.0f  У меня ortho матрица, меня все эти перспективные штучки не касаются, у меня нет понятия "расстояние", есть только zoom.

innuendo
> С оффетом и рисуют
MrShoor
> Depth Bias не спасает?
Noir
> а так проще смещать конечно.
Super_inoy
> но это не бред.
короче, про offset.  Короче, нужно в геом шейдере брать координаты линии и чуть чуть сдвигать их нормально к камере дабы избежать z-fighting-а как такового.
Далее, если после сдвига линия видима, ну как бы не перекрыта мешем и рисуется во фрагментнике, значит её там рисовать в основной кадр не надо, а надо рисовать в другую текстуру, где будут хранится полноценные квады линий без помех со стороны меша, ну а потом каким-нибудь вторым вторым саб пасом накладывать полученную текстуру квадов линий оверлеем на основной кадр, всё.

—-
Потом мне потребуется рисовать штрихпунктиром невидимые линии, а вот для уже нужно будет придумать что-то похитрее, что-то вроде G-Buffer-а, ну то есть основную сцену рендерить с глубиной в отдельную текстуру, затем отдельно рендерить линии с глубиной в другую текстуру, далее как-то сверять это по глубине и красить в зависимости от видимости, но тут опять будут проблемы с толстыми линиями... Короче, я пока ещё до этого не дошёл, потом подумаю :)

#12
10:45, 13 мар 2023

THE_MASTER
Геом шейдер для другого
При растеризации юзаетмя оффсет или депф биас

#13
(Правка: 13:45) 12:04, 13 мар 2023

THE_MASTER
> короче, про offset.  Короче, нужно в геом шейдере брать координаты линии и чуть
> чуть сдвигать их нормально к камере дабы избежать z-fighting-а как такового.
Просто попробуй depth bias. Он делает именно то, что тебе нужно, без оффсета позиций.

https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html… alar%20factor,slope%20in%20depth%20bias%20calculations.

#14
15:46, 13 мар 2023

А как пользоваться этим Depth Bias? Я разное выставлял вот в эти поля при создание пайплайна линий, на экране вообще ничё не меняется (по крайней мере в лучшую сторону), хрень какая-то :)

VkPipelineRasterizationStateCreateInfo:
VkBool32 depthBiasEnable; //ну ок, включаем

float depthBiasConstantFactor; //наверное добавляем константу к дефу,
//непонятно в каком направление и не понятно в NDC или нет.

float depthBiasClamp; //наверное можно прибавку к дефу ограничить, но зачем...
float depthBiasSlopeFactor; //вот это что за хрень?

как была хрень - так и осталась... Может есть пример правильных значений биаса?
Изображение

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