Мне было интересно, как реализовать это с помощью openGL:

У меня есть карта, с ровным полом и стенами. Все здесь двухмерное, трехмерной геометрии нет, только двухмерные полигоны, из которых состоит карта.
Используя вершины полигонов, я отбрасываю тени, чтобы определить видимую область.
Тени определяют поле зрения, но поскольку клетки со стенками препятствуют обзору, они также затемняются. Я могу нарисовать стены поверх теней, но при этом будут видны даже стены за пределами поля зрения.
Мне предложили решить эту проблему с помощью карты теней. Я должен визуализировать 2D-сцену в 4 разных 1D-текстуры, которые содержат глубину расстояния до первой сталкивающейся поверхности. Проблема в том, что я понятия не имею, как визуализировать проекцию 2D-сцены в 1D-текстуру. Если я использую, например: gluLookAt (x, y, 0.0, 0.0, x , y+1, 0.0, 0.0, 1.0);
Для рендеринга вида сверху результат по-прежнему 2D. Кроме того, ничего не будет визуализировано, поскольку все вершины будут находиться в одной плоскости, поэтому все поверхности будут ортогональны камере.
Есть ли у вас какие-либо советы или идеи о том, как сделать эти 2D-проекции в 1D? Я искал подобные сценарии в Google, но все они в 3D-среде.
Ответ 1 · Andreas Haferburg
Отображение теней предполагает либо направленный свет, либо прожектор, а у вас есть точечный свет. Но поскольку вам нужна только тень на полу, вы можете смоделировать ее как прожектор, который парит, например. 2 м над полом и направлен вниз. Все стены должны быть высотой не менее 2 м. В первом проходе карты теней вы можете визуализировать пол и все стены в буфер теней.
Однако я бы не стал использовать карты теней, а вместо этого использовал бы объемные тени. Если вы переходите от 3D к 2D, 3D-объем становится 2D-многоугольником.
Предполагая, что все стены расположены на регулярной сетке, мы можем вычислить лучи обзора от позиции игрока P до всех углов стен. Для каждого угла сохраните соседние стены и игнорируйте все стены, обращенные от игрока. Затем направьте лучи из P в каждый угол, преобразуйте лучи в полярные координаты и отсортируйте их по углу, скажем, против часовой стрелки. Теперь пройдитесь по этому отсортированному списку быстрым движением и постройте теневой многоугольник.
Многоугольник теней состоит либо из угловых точек в этом списке, либо из пересечений между а) линией, параллельной стене, и б) линией, проходящей через точку P и угол. Единственное, что делает это немного сложным, это то, что вам нужно найти стену, которая получает тень. Поскольку входные данные настолько малы, я бы, вероятно, начал с грубой силы (проверил угол у каждой стены) и посмотрел, насколько он медленный. Обратите внимание, что только стены, обращенные к игроку, могут отбрасывать тени. Также обратите внимание, что точка, ближайшая к игроку, не обязательно должна быть видимой.
Вероятно, это будет выглядеть очень круто с подвижным персонажем.