Знаю, темя заезженная, но всё же, вот рисую я модельку с линиями на рёбрах:
линии имеют толщину, то есть они не в 1 пиксель (ну и MSAA всякий).
Сами линии генерю в геом шейдере по классике, то есть генерю прямоугольник (в 3d, в world space), повёрнутый своей плоскостью максимально возможным способом к камере.
В итоге на острых углах модели закономерно эти линии пропадают, т.к. почти весь прямоугольник оказывается внутри меша как бы:
ну то есть линия какая-то там есть, но там дикий z-файтинг за 1 единственный пиксель на ребре с мешем, разумеется, ни о какой толщине, да и вообще о качестве речи не идёт:
Хмм... ну конечно же можно отрубить тест глубины при рендере линий:
но мне такого не надо, мне нужно что бы невидимые линии не рисовались, а видимые рисовались нормально и с толщиной поверх меша.
Собственно вопрос, как вообще такое можно сделать?
Не, ну конечно можно линии рисовать с offset-ом от поверхности, но это бред, я так делать не буду... :)
THE_MASTER
> Не, ну конечно можно линии рисовать с offset-ом от поверхности, но это бред, я
> так делать не буду...
но это не бред. А еще линии можно рисовать в шейдере, в который передавать буфер нормалей.
как вариант генерить не прямоугольник а параллипипед растянутый. центрированный по линии.
будет самый честный вариант (ИМХО)
а так проще смещать конечно.
Noir
можно вместо параллелепипеда использовать призму с комфортным количеством сторон многогранника, начиная от трёх. Либо использовать все тот же "квад", но со смещением по центральной оси предварительно добавив доп. вершины для её формирования.
Можно в отдельную текстуру записывать ID квада, а потом постпроцессом обнаруживать грани.
хмм... пока что всё не то... У меня мысли такие были, рендерю сначала обычный меш, а затем рендерю линии, ну и так вот, если линия лежит +- на этом меше с какой-то дельтой, то нужно во что бы то ни стало оверлеем перекрасить пикселе старого меша на линию, как? Хмм... пока хз, нужно подумать, в шейдере же Z-test не отключишь... в общем буду думать, пока идей нет
upd: наверное чё-нить со стенсилом и вторым проходом можно замутить
С оффетом и рисуют
Не пробовал установить тест глубины в "меньше или равно"?
glDepthFunc(GL_LEQUAL)
Upd: Хотя да, иначе то линии и не нарисовать.
При расчете матрицы проекции near plane насколько отдалена? Помню у меня были проблемы с z fighting со значением 0.001. Если ее поставить подальше, например 0.1, то проблема исчезала. Точность float не бесконечна) Стоит попробовать, но не уверен что поможет в твоем случае. Лучше конечно рисовать с оффсетом.
THE_MASTER
Depth Bias не спасает?
если что я про аппаратный Depth Bias который тут: https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ns-d3d1… sterizer_desc
Sanya838
> При расчете матрицы проекции near plane насколько отдалена?
у меня near plane = -500000.0f, far = +500000.0f У меня ortho матрица, меня все эти перспективные штучки не касаются, у меня нет понятия "расстояние", есть только zoom.
innuendo
> С оффетом и рисуют
MrShoor
> Depth Bias не спасает?
Noir
> а так проще смещать конечно.
Super_inoy
> но это не бред.
короче, про offset. Короче, нужно в геом шейдере брать координаты линии и чуть чуть сдвигать их нормально к камере дабы избежать z-fighting-а как такового.
Далее, если после сдвига линия видима, ну как бы не перекрыта мешем и рисуется во фрагментнике, значит её там рисовать в основной кадр не надо, а надо рисовать в другую текстуру, где будут хранится полноценные квады линий без помех со стороны меша, ну а потом каким-нибудь вторым вторым саб пасом накладывать полученную текстуру квадов линий оверлеем на основной кадр, всё.
—-
Потом мне потребуется рисовать штрихпунктиром невидимые линии, а вот для уже нужно будет придумать что-то похитрее, что-то вроде G-Buffer-а, ну то есть основную сцену рендерить с глубиной в отдельную текстуру, затем отдельно рендерить линии с глубиной в другую текстуру, далее как-то сверять это по глубине и красить в зависимости от видимости, но тут опять будут проблемы с толстыми линиями... Короче, я пока ещё до этого не дошёл, потом подумаю :)
THE_MASTER
Геом шейдер для другого
При растеризации юзаетмя оффсет или депф биас
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.
А как пользоваться этим Depth Bias? Я разное выставлял вот в эти поля при создание пайплайна линий, на экране вообще ничё не меняется (по крайней мере в лучшую сторону), хрень какая-то :)
VkPipelineRasterizationStateCreateInfo: VkBool32 depthBiasEnable; //ну ок, включаем float depthBiasConstantFactor; //наверное добавляем константу к дефу, //непонятно в каком направление и не понятно в NDC или нет. float depthBiasClamp; //наверное можно прибавку к дефу ограничить, но зачем... float depthBiasSlopeFactor; //вот это что за хрень?
как была хрень - так и осталась... Может есть пример правильных значений биаса?