raycasting
Давно пробовал делать рейкастинг как в wolf3d, ну и посмотреть, можно ли как нибудь развить эту тему, но потом как то забросил.
Решил выложить, может кому интересно будет, хотя похожих тем немало есть в инете. В архиве демка и сурцы (ссылка ниже). Раз это рейкастинг, то весь рендер софтварный, а sdl используется только чтобы готовое изображение вывести на экран (ну еще управление в демке через него). Написано на С++03, писал давно - С++11 еще небыло... ну и в целом коды там кривые... Если изменить несколько параметров, можно под линух собрать. Вобщем если кого заинтересует, можно вернуться к разработке, переписать коды нормально и т. п. maze.zip | maze.rar (20.09.13) maze_2.zip | maze_2.rar (22.09.13) maze_3.zip | maze_3.rar (25.09.13, без бинарников) maze_4.rar (28.09.13) |
Ответ: raycasting
Цитата:
|
Ответ: raycasting
Обнова: raycasting_2
* Немного поправил код: теперь можно в сурцах задавать больше вариантов разрешения. В архиве есть ЕХЕ с 640х480 и 800х600 (окно и полный экран). * Добавил код компенсирующий эффект fish eye, свойственный для рейкастинга. * Немного устранил искажения aspect ratio при некоторых разрешениях, но небольшие всеравно есть. Связано это с тем, что алгоритм был основан на целых числах с фиксированным разрешением 320х240 и значения подобраны таким образом чтобы не происходили округления. Но с другими разрешениями появляются искажения, поэтому я частично перевожу на float (тем более что потом всеравно все это на gpu логично будет перенести). * Еще всяческие изменения в коде сделал, но он пока по прежнему плохо структурирован. * Самая медленная часть кода - софтварная выборка текстуры, там надо ускорять сильно, может быть для начала попробовать SSE, хотя я не уверен что вообще системная память хорошо умеет делать выборку как видеопамять. |
Ответ: raycasting
Я чего-то непонимаю? Зачем с собой темплейты таскать такие длинные?
|
Ответ: raycasting
Цитата:
Я предупреждал что код кривой. Там по сути половина параметров шаблона вообще не нужно. Я их уже сокращаю. Даже если там останется много параметров то класс лучше инициализировать через дескриптор, тогда и читаемость кода лучше будет. Вобщем буду править. |
Ответ: raycasting
Ясно, а так интересный код. Просто до сих пор не удосужился поглядеть код Wolfenstein'a, а тут как раз рейкаст.
|
Ответ: raycasting
Обновил код - ссылка в первом посте.
Визуально ничего не изменилось, так что добавлять приложение не стал. Я посмотрел на шаблоны классов FrameBuffer и rc2d и там небыло ни одного параметра типа. Значит классы не такие уж гибкие и шаблоны им особо не нужны. Я заменил шаблоны на дескрипторы. Также добавил кое что из с++11: конструкторы переноса для классов FrameBuffer и rc2d весьма полезны будут, местами синтаксис и формат подправил. Обернул двумерный массив maze в класс Maze, чтобы сократить число аргументов в некоторых методах. |
Ответ: raycasting
Мой винрар не распаковывает твои архивы (Неизвестный метод). У меня стоит последняя версия
|
Ответ: raycasting
Цитата:
WinRAR 4.20 вроде нормально открывает. Я паковал с помощью PeaZip в стандартном zip формате. На всякий случай продублировал все в rar ( ссылки в первом посте ). |
Ответ: raycasting
Samodelkin, теперь всё отлично, спасибо. Буду следить)
|
Ответ: raycasting
Добавил редактор (скорей это чит) - теперь можно добавлять/удалять блоки (из которых состоят стены) прямо из игры.
Если смотреть на карту сверху: U - верхний левый; I - верхний; O - верхний правый; L - справа; > - нижний правый; < - нижний; M - нижний левый; J - слева; Угол поворота самой камеры никак не влияет на это. Перенес управление со стрелок на WSAD. Чуть попозже может быть добавлю мышь и стрейфы. Карту вынес в отдельный класс (maze.hpp, maze.cpp). Сделал каркас класса Player, но пока еще не заполнил его кодом. Убрал переопределия целочисленных типов - они там не нужны. Теперь в коде стандартные типы из cstdint. Добавил многопоточность. Она работает на уровне кастинга лучей (тест на пересечение с объектами) и на уровне заполнения фреймбуфера (софтварного), буфер делится на области, с каждой работает отдельный поток. В C++11 есть удобный класс std::thread, но в mingw 4.7.2 он не работает (в mingw вообще я смотрю много проблем). Boost решил не использовать - он слишком большой для такого маленького проекта (нарушается равновесие дзен). Поэтому воспользовался WinAPI CreateThread: там всего около 20 строчек кода, которые можно макросами обвести для компиляции в другой ос, и использовать уже там например std::thread. Ссылки все в первом посте. |
Ответ: raycasting
Визуально ничего не изменилось. Скорость рендера возросла.
Среднее значение maze_2 : 42 maze_4 : 63 Процессор 4 ядра по 3,2 ГГЦ Редактором не врубился как пользоваться. Код поглядел. Стал лучше. Вообще проект у тебя интересный. Слежу. |
Ответ: raycasting
Неудобно что правка первого поста ограничена 10 днями... Туда удобно было добавлять новый материал чтобы все в одном месте было.
Raycasting прогрессирует! >>> maze_5.rar <<< Подправил многопоточность: на моем пк +20 fps прирост. Добавил текстуры. Вообще они там и так были, но небыло загрузчика для них. Я написал свой для bmp. Свой писал потому что мне нужен был определенный контроль при переводе из DIP в DDB формат, так как есть определенные особенности рендера. Загрузчик пока читает bmp с заголовком в 54 байта (те что стандартные из пеинта вобщем), остальные варианты если нужны будут потом добавлю. Фильтр для текстуры пока nearest, чуть позже попробую bilinear - есть вероятность что в софтваре уже не потянет. Сделал разрешение 1280х720 и ограниение в 30 fps, чтобы фреймрейт не скакал. Для софварного рендера это очень даже неплохо имхо, тем более что дальше графика еще будет нагружаться. Сделал чуток плавней управление. |
Ответ: raycasting
Вложений: 1
Скорость рендера стабильная, и практически не зависит от размера текстуры - я уменьшил размер текстуры в 2 раза и FPS все равно 31. Что круто.
Двигаясь вплотную по стенке вызел баг. Второй раз пошел по тому же самому месту - баг не вылез. Скрин в аттаче. |
Ответ: raycasting
Цитата:
Кстати странная вещь - в mingw 4.7.2 неработают атрибуты: Код:
struct A { char a; char b; ... } __attribute__( __aligned( 1 ) ); Пришлось сделать так: Код:
#pragma pack( push, 1 ) |
Часовой пояс GMT +4, время: 00:25. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot