алгоритм — динамическое отбрасывание теней

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

1

Решение

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

Есть много способов получить тени, но многое зависит от ваших потребностей и вычислительной мощности. Два метода, которые я бы сказал, являются наиболее популярными / распространенными:

  1. Raytraced Shadows
  2. Карты теней

Raytraced тени На мой взгляд, способ легче понять и реализовать. Обычно, когда вы затеняете пиксель, вы направляете луч к источнику света, где максимальная длина луча — это расстояние до света. Если луч ничего не поражает, то точка, которую вы затеняете, считается не находящейся в тени. Если расстояние попадания луча меньше расстояния до источника света, оно находится в тени. Говоря простым языком, вы можете думать об этом так, как если бы мой глаз находился в этом положении в мире, имею ли я прямую видимость света?

Этот подход даст вам идеально жесткие тени. Это потому, что источник света считается бесконечно малым. Это может быть немного сложнее, если вам нужны мягкие тени или спад угла конуса прожектора.

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

Вот учебник о Shadow Mapping в OpenGL, но концепция такая же, как и в любой другой системе рендеринга.
http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-16-shadow-mapping/

В двух словах, карта теней — это всего лишь рендеринг вашей 3D-сцены с точки зрения источника света, но вместо того, чтобы сохранять цвет для ваших объектов в сцене, вы сохраняете значения глубины. Затем, когда вы выполняете рендеринг с точки зрения камеры, вы используете карту теней для поиска значений глубины. Точка, которую вы затеняете с точки зрения камеры, должна быть преобразована в пространство той же матрицы вида / проекции, которая использовалась для создания карты теней (или изображения глубины), чтобы вы знали, где будет затененный пиксель, если визуализируется с точки зрения света.

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

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

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]