Подтвердить что ты не робот

Отображение теней - артефакты на тонкой стенке, ортогональной свету

У меня проблема с обратными лицами (на свет) и теневым отображением, которые, похоже, не могут пройти. Я все еще на относительно ранних этапах оптимизации моего движка, но я не могу показаться, что он попадает туда, даже когда все настроено вручную для этой части геометрии, оно по-прежнему выглядит как мусор.

То, что это - тощая стена, которая "изогнута" через приблизительно 5 различных кусков стены. Когда я создаю свою карту глубины, я отбраковываю передние лица (к свету). Это определенно помогает, но передние лица на другой стороне стены, по-видимому, вызывают z-сражение/проективное затенение.

Artifacts on bent wall

Некоторые примечания на скриншоте:

  • Фронтальные поверхности отбираются при рисовании текстуры глубины (от света).
  • У меня есть ближняя и дальняя плоскости, настроенные только для этого куска геометрии (установлены соответственно на 20 и 25).
  • Один направленный источник света, спускающийся под небольшим углом к ​​правой стороне сцены, достаточно, чтобы указать, что стена должна быть затенена, но в основном прямо вниз.
  • Использование смехотворно большой текстуры теневой карты 4096x4096.
  • Все освещение отключено, но знайте, что я делаю мягкое освещение (и, следовательно, вершинные нормали для вершин) даже на этой стене

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

Обратите внимание, что у меня есть неприятный Perspective Aliasing, но я надеюсь, что мои следующие шаги будут работать над каскадные теневые карты, но, не исправляя это, я чувствую, что я просто откладываю неизбежное, поскольку я как можно лучше подтягиваю взгляд (или так я думаю).

В любом случае, я чувствую, что у меня что-то не хватает, поэтому, если у вас есть какие-то мысли или помощь, вы будете очень благодарны!

ИЗМЕНИТЬ

Чтобы быть ясным, стена технически НЕ должна находиться в тени, основываясь на том, откуда идет свет.

Overhead view

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

Without shadowing turned on

Так что да, стена СЛЕДУЕТ находиться в тени, но я надеюсь, что смогу улучшить работу сглаживания, чтобы края могли иметь рассеянное освещение. Если мне нужно, чтобы он был полностью в тени, тогда, если его теневая карта помещает его в тень или мой код специально помещает его в тень, потому что нормальное лицо отсутствует, я в порядке с этим, но проходя лицо нормально через для моего шейдера вершин/фрагментов не похоже на путь наименьшего сопротивления.

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

ИЗМЕНИТЬ № 2

Я добавил текстуру глубины ниже. Вы можете увидеть эту стенку внизу слева, а на скриншоте вы увидите, как я обрезал значения глубины до ~ 0.4- > 1. Это означает, что значения глубины этой стены начинаются в диапазоне 0,4. Таким образом, его НЕ СОВЕРШЕННО обрезается для него, но его близок. Это кажется разумным? Я уверен, что это полный 24 или 32-битный буфер глубины, расширение a la DEPTH_COMPONENT на iOS. Для @starmole это помогает определить, является ли его ошибка масштабирования в моей проекции? Считаете ли вы, что размер/область, покрытая моей картой, слишком велика, поэтому, если она фокусируется ближе, это может помочь?

enter image description here

4b9b3361

Ответ 1

Проблема заключается в том, что вы

  • Отбраковка лицевых поверхностей
  • Глядя на заднее лицо
  • Не снимает свет с заднего лица, потому что он фактически не освещен обычным - или есть некоторая неточность в вычислении
  • Вероятно, не добавляя некоторый epsilon

(1) и (2) означают, что между теневой картой и задними лицами будет Z-борьба.

Кроме того, разрешение теневой карты не поможет вам - просто взгляните на стену на теневой карте, она будет толщиной в один пиксель.

Рекомендации:

  • Epsilons. Убедитесь, что Z > lightZ + epsilon
  • Epsilons. Убедитесь, что стена обращена к свету (точка нормального > эпсилон), чтобы убедиться, что стена затенена, если она очень ортогональная.