Pull to refresh

Comments 12

Справедливости ради, у Вас получился рендер не в стиле Doom. То, что Вы реализовали - это raycasting, "бросание лучей", которое применялось в Wolfenstein 3D. К слову, реализация там была оптимизирована при помощи DDA (digital differential analyzer) - у Вас я этого в статье не увидел.

Doom же использовал BSP tree - дерево попарного рассечения пространства, которое Кармак впервые использовал в порте Wolfenstein 3D на SNES, где raycasting оказался уже слишком затратным. Важнейшее его преимущество - стены могут идти под любым углом, а не только лишь перпендикулярно друг другу.

У Вас в видео, кстати, видны именно перпендикулярные стены, кроме комнаты в конце. Однако видео обрывается слишком внезапно, поэтому рассмотреть её не удаётся. Учитывая, что у Вас таки есть потолки произвольной высоты (чего в Wolfenstein 3D тоже не было), можно сделать вывод, что Ваш движок больше в стиле Rise of the Triad - игры на основе доработанного движка Wolfenstein 3D. Псевдо-повороты стен там были сделаны довольно забавно - из множества перпендикулярных друг другу маленьких стенок, этакой "гармошкой". Вблизи это было заметно, но на расстоянии появлялась иллюзия.

Есть совершенно чудесные и лежащие в открытом доступе книжки Game Engine Black Book от Фабиена Сангларда (Fabien Sanglard), в которых всё это подробно описывается:
https://fabiensanglard.net/gebbwolf3d - про Wolfenstein 3D
https://fabiensanglard.net/gebbdoom - про Doom

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

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

У меня стены могут идти под любым углом.

Тогда отметил статью плюсом - подробно описанных на русском языке реализаций raycasting'а для свободно направленных стен я ещё не видел.

Как вы правильно заметили, в конце ролика есть такие полигоны.

А можете записать дополнительное видео? Интересно.

Через центр каждого пикселя будем бросать луч, искать его пересечение с рёбрами полигонов уровня и рисовать одну колонку пикселей в буфере экрана.


Для Doom это совсем не так должно быть. Там BSP-дерево. Но лучше (это быстрее работает), использовать метод порталов. Вот тут я писал, как это работает.

Вспомнилась демка ".kkrieger" от ".theprodukkt" из 2004 г. размером 96к.
интересная статья. успехов Вам.

А исходники где-то можно посмотреть? Особенно дыма.

Исходники, к сожалению, не выкладываю, поскольку код не структурировался.) Но там простая идея: пространство сцены разбито на кубики, для каждого из которых задана плотность дыма. Кидаем луч из камеры через каждый пиксел, луч идёт через кубики, накапливая коэффициент ослабления света за счёт поглощения света дымом (зависит от плотности дыма в каждом кубе). Также с некоторой вероятностью луч рандомно меняет направление (рассеивание света на дыме). Вероятность этой смены направления тоже пропорциональна плотности дыма в каждом кубе. В итоге луч либо вылетает за сцену, либо приходит в источник света. Источники света были заданы большими прямоугольными параллелепипедами. Яркость пиксела считается исходя из яркости источника света в который пришли и накопленного коэффициента затемнения. Если луч улетел за сцену, то пиксел рисуем чёрным. Основная проблема в том, что картина получается очень шумная и приходится рендерить её тысячи раз и усреднять результат.

Понял, а если blur наложить - шум не уменьшится?

Если кубики - как получаются внешние поверхности как полу-сферы?

Вообще, очень круто было бы увидеть что-то такое же как в этой статье.

Ибо сейчас все юзают шейдеры и не парятся, а вот на чистом си не найти.

Появилась идея сделать похожий рендер на С++ без использования библиотек.

Исходники, к сожалению, не выкладываю, поскольку код не структурировался

Ничего страшного. Заливайте Ваши проекты на Github. Всем будет интересно посмотреть. А недочёты в оформлении либо структуре кода никого не смутят. Здесь же главное математика и алгоритмы.

Разжёванные математику и алгоритмы ищите в книгах Шикина и Борескова. :)

Sign up to leave a comment.

Articles