Есть ли простой способ получить тени в OpenGL?

Недавно я создал некоторый ландшафтный код и добавил немного рассеянного освещения на сцену, однако, к моему разочарованию, нет теней. Я оглядывался по Сети часами и искал способы получить тени в OpenGL, однако все они казались ужасно сложными; и очень уникальны для своих собственных демонстрационных программ.

Есть ли какие-либо простые способы создания теней?

Ответы

Ответ 1

Нет. Растеризация очень плоха в этом (даже в недавних играх AAA есть заметные теневые артефакты), но каждый живет с ним.

Решения включают (примерно от самых простых/самых бедных до лучших/самых сложных):

  • Нет теней. Просто загладьте с более темными цветами. xNormal, Blender.
  • Если вы хотите приблизительную тень для персонажа, сделайте простой плоский многоугольник на земле с прозрачной и размытой текстурой. Например, скриншоты Zelda. Даже некоторые недавние игры все еще используют это.
  • Lightmaps. Только статическая геометрия, но идеальное освещение (предварительно вычисленное). Разумно просто реализовать. Существует множество инструментов.
  • Теневые тома, популяризированные Кармаком. Pixel идеально, разумно просто реализовать, довольно медленно. Хорошо для нескольких объектов. Нет мягких теней.
  • Теневые карты. Немного сложно реализовать, если вы никогда не открывали OpenGL. Трудно поправиться. Пиксельные тени. Сделки с большим количеством полигонов. Не имеет дело с большими мирами.
  • Варианты карт Myriads of Shadow. В последние годы много исследований. Лучше всего это каскадные карты теней: сложно, все еще сложно сделать это хорошо, но быстро, имеет дело с множеством полигонов и огромных миров.
  • Raytraced shadows: Это может быть следующий ген. Никто не использует это, за исключением некоторых научных работ. Очень сложно, не очень хорошо работает с динамическими мирами (пока), огромные статические сцены в порядке. Пиксельные идеальные или мягкие тени, в зависимости от того, сколько у вас запасных GPU. Несколько вариантов; с 2014 года это все еще не производилось в любой игре по причинам производительности.

Таким образом, обычный трюк состоит в том, чтобы смешивать только красивые, но статичные подходы с динамическими, но не очень хорошими подходами. Например, см. Мои руководства по lightmapping и shadowmapping.

Ответ 2

Нет.

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