У меня проблема с обратными лицами (на свет) и теневым отображением, которые, похоже, не могут пройти. Я все еще на относительно ранних этапах оптимизации моего движка, но я не могу показаться, что он попадает туда, даже когда все настроено вручную для этой части геометрии, оно по-прежнему выглядит как мусор.
То, что это - тощая стена, которая "изогнута" через приблизительно 5 различных кусков стены. Когда я создаю свою карту глубины, я отбраковываю передние лица (к свету). Это определенно помогает, но передние лица на другой стороне стены, по-видимому, вызывают z-сражение/проективное затенение.
Некоторые примечания на скриншоте:
- Фронтальные поверхности отбираются при рисовании текстуры глубины (от света).
- У меня есть ближняя и дальняя плоскости, настроенные только для этого куска геометрии (установлены соответственно на 20 и 25).
- Один направленный источник света, спускающийся под небольшим углом к правой стороне сцены, достаточно, чтобы указать, что стена должна быть затенена, но в основном прямо вниз.
- Использование смехотворно большой текстуры теневой карты 4096x4096.
- Все освещение отключено, но знайте, что я делаю мягкое освещение (и, следовательно, вершинные нормали для вершин) даже на этой стене
Как упоминалось здесь, он заключает, что вы не должны теневать полигоны, которые снова обращены к свету. Я борюсь с этой конкретной проблемой, потому что я не хочу пропускать нормали лица до конца до фрагментарного шейдера, чтобы исключить истинные обратные лица к свету там - однако, если кто-то считает, что это лучшее/единственное решение для этой геометрии это то, что мне нужно сделать. Рассматривая, как трубопровод не делает его легким/очевидным, чтобы передать нормали лица через него, я чувствую, что это не путь наименьшего сопротивления. И обратите внимание, что нормали, которые я передаю, являются вершинными нормалями, чтобы обеспечить более мягкие световые эффекты вокруг краев (вероятно, будут включать как тени, так и тени).
Обратите внимание, что у меня есть неприятный Perspective Aliasing, но я надеюсь, что мои следующие шаги будут работать над каскадные теневые карты, но, не исправляя это, я чувствую, что я просто откладываю неизбежное, поскольку я как можно лучше подтягиваю взгляд (или так я думаю).
В любом случае, я чувствую, что у меня что-то не хватает, поэтому, если у вас есть какие-то мысли или помощь, вы будете очень благодарны!
ИЗМЕНИТЬ
Чтобы быть ясным, стена технически НЕ должна находиться в тени, основываясь на том, откуда идет свет.
Ниже приведено изображение с выключенным затенением. Это просто использование вершинных нормалей для расчета рассеянного освещения - его не очень (слишком много геометрии видно), но это показывает, что некоторые из краев несколько видны.
Так что да, стена СЛЕДУЕТ находиться в тени, но я надеюсь, что смогу улучшить работу сглаживания, чтобы края могли иметь рассеянное освещение. Если мне нужно, чтобы он был полностью в тени, тогда, если его теневая карта помещает его в тень или мой код специально помещает его в тень, потому что нормальное лицо отсутствует, я в порядке с этим, но проходя лицо нормально через для моего шейдера вершин/фрагментов не похоже на путь наименьшего сопротивления.
Возможно, это поможет лучше проиллюстрировать мою проблему или, возможно, выявить фундаментальное понимание, которое мне не хватает.
ИЗМЕНИТЬ № 2
Я добавил текстуру глубины ниже. Вы можете увидеть эту стенку внизу слева, а на скриншоте вы увидите, как я обрезал значения глубины до ~ 0.4- > 1. Это означает, что значения глубины этой стены начинаются в диапазоне 0,4. Таким образом, его НЕ СОВЕРШЕННО обрезается для него, но его близок. Это кажется разумным? Я уверен, что это полный 24 или 32-битный буфер глубины, расширение a la DEPTH_COMPONENT на iOS. Для @starmole это помогает определить, является ли его ошибка масштабирования в моей проекции? Считаете ли вы, что размер/область, покрытая моей картой, слишком велика, поэтому, если она фокусируется ближе, это может помочь?