w23 / xash3d-fwgs

Vulkan Ray Tracing fork of Xash3D FWGS engine. Intended to be merged into master at some point in the future.
160 stars 16 forks source link

Normalmaps are not smoothed according to smooth geometries #630

Closed 0x4E69676874466F78 closed 6 months ago

0x4E69676874466F78 commented 7 months ago

Есть проблема что карты нормалей не сглаживаются как нормали геометрии. Поэтому получается что с одной стороны геомерия выглядит гладкой, а вот картанормалей на ней словно геометрия не сглаживалась вовсе: image image

image image

Если это сравнительно легко решается то лучше решить, если сложно, то можно забить.

Возможный вариант решения через тесселяцию (на будущее).

LifeKILLED commented 7 months ago

Возможное решение может быть в правильном сглаживании тангентов и бинормалей. Сглаживаются ли тангенты там же, где сглаживаются нормали? Нормализуется ли все это в шейдере? Надо будет глянуть в коде.

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

Этот глитч воспроизводится в 3ds max, blender, doom 3 и т.д.. Единственное решение - применять сглаживание геометрии с добавлением полигонов. Это огромная сложная фича, которая не будет работать без ручного перемоделивания геометрии. В 3д-моделлинге есть термин "моделить под сглаживание". Геометрия уровней в halflife требованиям не отвечает, т.к. это набор треугольников, изрезанных bsp-деревом

0x4E69676874466F78 commented 7 months ago

Вот для сравнения эта же текстура (в сером виде) в качестве basecolor: image а вот если подложить только нормаль: image

0x4E69676874466F78 commented 7 months ago

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

w23 commented 7 months ago

Возможное решение может быть в правильном сглаживании тангентов и бинормалей. Сглаживаются ли тангенты там же, где сглаживаются нормали? Нормализуется ли все это в шейдере? Надо будет глянуть в коде.

:tada: Конечно же нет! :tada: :tada: :partying_face:

LifeKILLED commented 7 months ago

А еще, если моделька отзеркалена (правая и левая половины зомбяка), карта нормали выглядит отзеркаленной. Надо инвертировать бинормаль. Вместо того, чтобы передавать в шейдер цЕлую бинормаль, Unity кладет в w-координату тангента цифру 1 или -1, которые указывают на отзеркаливание бинормали. В шейдере обработать это не трудно. Трудно правильно рассчитать всë это на ЦПУ. Все примеры очень большие и трудные для понимания

w23 commented 7 months ago

А еще, если моделька отзеркалена (правая и левая половины зомбяка), карта нормали выглядит отзеркаленной. Надо инвертировать бинормаль. Вместо того, чтобы передавать в шейдер цЕлую бинормаль, Unity кладет в w-координату тангента цифру 1 или -1, которые указывают на отзеркаливание бинормали. В шейдере обработать это не трудно. Трудно правильно рассчитать всë это на ЦПУ. Все примеры очень большие и трудные для понимания

Мы там на вчерашнем стриме добавили просто флипанье знака тангента, если ориентация текстурных координат не та. Вроде починило косяки, которые мы видели. Хз, насколько это правильное/полное решение.

w23 commented 7 months ago

Чёт я призадумался. Вот эта строчка как раз должна тангент поправлять под сглаженную нормаль. Минуя явное сглаживание тангента. https://github.com/w23/xash3d-fwgs/blob/365fffacca2c4527f33cd356661226015e8f37df/ref/vk/shaders/ray_primary_hit.glsl#L47

w23 commented 7 months ago

А что если сравнить с одной и той же позиции скриншоты со сглаживанием и без?

w23 commented 7 months ago

Там ещё может быть момент, что для освещения мы берём geometry_normal, потому что shading может давать семплирование вглубь геометрии. (надо спать идти, я уже сам мало понимаю, что пишу)

0x4E69676874466F78 commented 6 months ago

@w23

T = normalize(T - dot(T, geom.normal_shading) * geom.normal_shading);

Вообще похеру.

image Закомментировал: image

Но это же только баунсов касается.

Я думаю здесь просто тень мешает.

w23 commented 6 months ago

Произведено исследование. Всё у нас нормально гнётся тангент. Однако, это гнутие никак не влияет на данную конкретную нормалмапу, потому что она порождает исключительно "вертикальные" изменения нормали, тогда когда тангент влияет только на "горизонтальную" компоненту. Поэтому сглаживание нормалей и тангентов на картинку для этой конкретно текстуры и геометрии влиять не может.

0x4E69676874466F78 commented 6 months ago

Закрыто: без тесселяции проблема не решаема.