Closed 0x4E69676874466F78 closed 6 months ago
Возможное решение может быть в правильном сглаживании тангентов и бинормалей. Сглаживаются ли тангенты там же, где сглаживаются нормали? Нормализуется ли все это в шейдере? Надо будет глянуть в коде.
Проблема с резкими тенями и формой объектов у низкополигональных объектов в рейтрейсинге к сожалению не решаемы. Карта нормалей и сглаживание нормалей - это костыли. При сильной разнице между запеченными нормалями и реальной геометрией такие глитчи будут возникать естественным образом
Этот глитч воспроизводится в 3ds max, blender, doom 3 и т.д.. Единственное решение - применять сглаживание геометрии с добавлением полигонов. Это огромная сложная фича, которая не будет работать без ручного перемоделивания геометрии. В 3д-моделлинге есть термин "моделить под сглаживание". Геометрия уровней в halflife требованиям не отвечает, т.к. это набор треугольников, изрезанных bsp-деревом
Вот для сравнения эта же текстура (в сером виде) в качестве basecolor: а вот если подложить только нормаль:
Я не призываю этим заморачиваться. Таких моментов на карте не много, фактическая нормаль будет более приглушённой. Решать эту проблему можно только если в контексте vector displacement mapping, не более. То есть можно в рамках vector displacement mapping (если мы до него вообще доберёмся, а я надеюсь, ибо крутая дорого-богатая фишка) можно добавить механизм тесселяции по какой оси (в данном случае X) для энтитей или выделенных вручную граней.
Возможное решение может быть в правильном сглаживании тангентов и бинормалей. Сглаживаются ли тангенты там же, где сглаживаются нормали? Нормализуется ли все это в шейдере? Надо будет глянуть в коде.
:tada: Конечно же нет! :tada: :tada: :partying_face:
А еще, если моделька отзеркалена (правая и левая половины зомбяка), карта нормали выглядит отзеркаленной. Надо инвертировать бинормаль. Вместо того, чтобы передавать в шейдер цЕлую бинормаль, Unity кладет в w-координату тангента цифру 1 или -1, которые указывают на отзеркаливание бинормали. В шейдере обработать это не трудно. Трудно правильно рассчитать всë это на ЦПУ. Все примеры очень большие и трудные для понимания
А еще, если моделька отзеркалена (правая и левая половины зомбяка), карта нормали выглядит отзеркаленной. Надо инвертировать бинормаль. Вместо того, чтобы передавать в шейдер цЕлую бинормаль, Unity кладет в w-координату тангента цифру 1 или -1, которые указывают на отзеркаливание бинормали. В шейдере обработать это не трудно. Трудно правильно рассчитать всë это на ЦПУ. Все примеры очень большие и трудные для понимания
Мы там на вчерашнем стриме добавили просто флипанье знака тангента, если ориентация текстурных координат не та. Вроде починило косяки, которые мы видели. Хз, насколько это правильное/полное решение.
Чёт я призадумался. Вот эта строчка как раз должна тангент поправлять под сглаженную нормаль. Минуя явное сглаживание тангента. https://github.com/w23/xash3d-fwgs/blob/365fffacca2c4527f33cd356661226015e8f37df/ref/vk/shaders/ray_primary_hit.glsl#L47
А что если сравнить с одной и той же позиции скриншоты со сглаживанием и без?
Там ещё может быть момент, что для освещения мы берём (надо спать идти, я уже сам мало понимаю, что пишу)geometry_normal
, потому что shading может давать семплирование вглубь геометрии.
@w23
T = normalize(T - dot(T, geom.normal_shading) * geom.normal_shading);
Вообще похеру.
Закомментировал:
Но это же только баунсов касается.
Я думаю здесь просто тень мешает.
Произведено исследование. Всё у нас нормально гнётся тангент. Однако, это гнутие никак не влияет на данную конкретную нормалмапу, потому что она порождает исключительно "вертикальные" изменения нормали, тогда когда тангент влияет только на "горизонтальную" компоненту. Поэтому сглаживание нормалей и тангентов на картинку для этой конкретно текстуры и геометрии влиять не может.
Закрыто: без тесселяции проблема не решаема.
Есть проблема что карты нормалей не сглаживаются как нормали геометрии. Поэтому получается что с одной стороны геомерия выглядит гладкой, а вот картанормалей на ней словно геометрия не сглаживалась вовсе:
Если это сравнительно легко решается то лучше решить, если сложно, то можно забить.
Возможный вариант решения через тесселяцию (на будущее).