|
20.09.2013, 22:13
|
#1
|
Мастер
Регистрация: 12.01.2009
Сообщений: 980
Написано 389 полезных сообщений (для 632 пользователей)
|
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)
Последний раз редактировалось Samodelkin, 28.09.2013 в 17:31.
|
(Offline)
|
|
Эти 4 пользователя(ей) сказали Спасибо Samodelkin за это полезное сообщение:
|
|
20.09.2013, 22:55
|
#2
|
Быдлокодер
Регистрация: 05.07.2009
Адрес: Проспит
Сообщений: 5,023
Написано 2,312 полезных сообщений (для 5,349 пользователей)
|
Ответ: raycasting
Сообщение от Samodelkin
Вобщем если кого заинтересует, можно вернуться к разработке...
|
Уже жду
|
(Offline)
|
|
22.09.2013, 03:19
|
#3
|
Мастер
Регистрация: 12.01.2009
Сообщений: 980
Написано 389 полезных сообщений (для 632 пользователей)
|
Ответ: raycasting
Обнова: raycasting_2
* Немного поправил код: теперь можно в сурцах задавать больше вариантов разрешения. В архиве есть ЕХЕ с 640х480 и 800х600 (окно и полный экран).
* Добавил код компенсирующий эффект fish eye, свойственный для рейкастинга.
* Немного устранил искажения aspect ratio при некоторых разрешениях, но небольшие всеравно есть. Связано это с тем, что алгоритм был основан на целых числах с фиксированным разрешением 320х240 и значения подобраны таким образом чтобы не происходили округления. Но с другими разрешениями появляются искажения, поэтому я частично перевожу на float (тем более что потом всеравно все это на gpu логично будет перенести).
* Еще всяческие изменения в коде сделал, но он пока по прежнему плохо структурирован.
* Самая медленная часть кода - софтварная выборка текстуры, там надо ускорять сильно, может быть для начала попробовать SSE, хотя я не уверен что вообще системная память хорошо умеет делать выборку как видеопамять.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Samodelkin за это полезное сообщение:
|
|
25.09.2013, 10:57
|
#4
|
Дэвелопер
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений (для 1,540 пользователей)
|
Ответ: raycasting
Я чего-то непонимаю? Зачем с собой темплейты таскать такие длинные?
__________________
|
(Offline)
|
|
25.09.2013, 16:18
|
#5
|
Мастер
Регистрация: 12.01.2009
Сообщений: 980
Написано 389 полезных сообщений (для 632 пользователей)
|
Ответ: raycasting
Я чего-то непонимаю? Зачем с собой темплейты таскать такие длинные?
|
Ты про то что шаблоны большие или сам факт записи нечитабельный? =)
Я предупреждал что код кривой.
Там по сути половина параметров шаблона вообще не нужно. Я их уже сокращаю. Даже если там останется много параметров то класс лучше инициализировать через дескриптор, тогда и читаемость кода лучше будет.
Вобщем буду править.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
25.09.2013, 23:32
|
#6
|
Дэвелопер
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений (для 1,540 пользователей)
|
Ответ: raycasting
Ясно, а так интересный код. Просто до сих пор не удосужился поглядеть код Wolfenstein'a, а тут как раз рейкаст.
__________________
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
26.09.2013, 00:24
|
#7
|
Мастер
Регистрация: 12.01.2009
Сообщений: 980
Написано 389 полезных сообщений (для 632 пользователей)
|
Ответ: raycasting
Обновил код - ссылка в первом посте.
Визуально ничего не изменилось, так что добавлять приложение не стал.
Я посмотрел на шаблоны классов FrameBuffer и rc2d и там небыло ни одного параметра типа. Значит классы не такие уж гибкие и шаблоны им особо не нужны. Я заменил шаблоны на дескрипторы. Также добавил кое что из с++11: конструкторы переноса для классов FrameBuffer и rc2d весьма полезны будут, местами синтаксис и формат подправил. Обернул двумерный массив maze в класс Maze, чтобы сократить число аргументов в некоторых методах.
|
(Offline)
|
|
26.09.2013, 09:35
|
#8
|
Бывалый
Регистрация: 17.05.2009
Адрес: Днепропетровск
Сообщений: 672
Написано 180 полезных сообщений (для 428 пользователей)
|
Ответ: raycasting
Мой винрар не распаковывает твои архивы (Неизвестный метод). У меня стоит последняя версия
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
26.09.2013, 15:43
|
#9
|
Мастер
Регистрация: 12.01.2009
Сообщений: 980
Написано 389 полезных сообщений (для 632 пользователей)
|
Ответ: raycasting
Мой винрар не распаковывает твои архивы (Неизвестный метод). У меня стоит последняя версия
|
Это который 5.00 beta чтоли?
WinRAR 4.20 вроде нормально открывает.
Я паковал с помощью PeaZip в стандартном zip формате.
На всякий случай продублировал все в rar ( ссылки в первом посте ).
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
27.09.2013, 10:47
|
#10
|
Бывалый
Регистрация: 17.05.2009
Адрес: Днепропетровск
Сообщений: 672
Написано 180 полезных сообщений (для 428 пользователей)
|
Ответ: raycasting
Samodelkin, теперь всё отлично, спасибо. Буду следить)
|
(Offline)
|
|
28.09.2013, 17:51
|
#11
|
Мастер
Регистрация: 12.01.2009
Сообщений: 980
Написано 389 полезных сообщений (для 632 пользователей)
|
Ответ: 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.
Ссылки все в первом посте.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
29.09.2013, 03:44
|
#12
|
Дэвелопер
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений (для 1,540 пользователей)
|
Ответ: raycasting
Визуально ничего не изменилось. Скорость рендера возросла.
Среднее значение
maze_2 : 42
maze_4 : 63
Процессор 4 ядра по 3,2 ГГЦ
Редактором не врубился как пользоваться.
Код поглядел. Стал лучше.
Вообще проект у тебя интересный. Слежу.
__________________
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
30.09.2013, 22:35
|
#13
|
Мастер
Регистрация: 12.01.2009
Сообщений: 980
Написано 389 полезных сообщений (для 632 пользователей)
|
Ответ: raycasting
Неудобно что правка первого поста ограничена 10 днями... Туда удобно было добавлять новый материал чтобы все в одном месте было.
Raycasting прогрессирует!
>>> maze_5.rar <<<
Подправил многопоточность: на моем пк +20 fps прирост.
Добавил текстуры. Вообще они там и так были, но небыло загрузчика для них. Я написал свой для bmp. Свой писал потому что мне нужен был определенный контроль при переводе из DIP в DDB формат, так как есть определенные особенности рендера. Загрузчик пока читает bmp с заголовком в 54 байта (те что стандартные из пеинта вобщем), остальные варианты если нужны будут потом добавлю. Фильтр для текстуры пока nearest, чуть позже попробую bilinear - есть вероятность что в софтваре уже не потянет.
Сделал разрешение 1280х720 и ограниение в 30 fps, чтобы фреймрейт не скакал. Для софварного рендера это очень даже неплохо имхо, тем более что дальше графика еще будет нагружаться.
Сделал чуток плавней управление.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Samodelkin за это полезное сообщение:
|
|
01.10.2013, 00:13
|
#14
|
Дэвелопер
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений (для 1,540 пользователей)
|
Ответ: raycasting
Скорость рендера стабильная, и практически не зависит от размера текстуры - я уменьшил размер текстуры в 2 раза и FPS все равно 31. Что круто.
Двигаясь вплотную по стенке вызел баг. Второй раз пошел по тому же самому месту - баг не вылез. Скрин в аттаче.
__________________
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
01.10.2013, 20:48
|
#15
|
Мастер
Регистрация: 12.01.2009
Сообщений: 980
Написано 389 полезных сообщений (для 632 пользователей)
|
Ответ: raycasting
Двигаясь вплотную по стенке вызел баг.
|
Да у меня тоже самое. Пока добавил костыль - если возникнет баг то на секунду пропадет изображение, но игра не вылетет. Причина же где то в недрах алгоритмов расчета бросания лучей - они иногда странные координаты пересечения со стенами возвращают, возможно последтвия округления и преобразования из одного типа в другой. Сейчас буду целиком на float переводить все расчеты, потому что нет смысла на современных цп делать только целочисленные вычисления.
Кстати странная вещь - в mingw 4.7.2 неработают атрибуты:
struct A { char a; char b; ... } __attribute__( __aligned( 1 ) );
struct B { char a; char b; ... } __attribute__( __packed__ );
Эти структуры будут по прежнему выравниваться по 4 байта...
Пришлось сделать так:
#pragma pack( push, 1 )
struct C { char a; char b; ... };
#pragma pack( pop )
Хотя вроде раньше на более старых версиях mingw атрибуты вроде бы работали, я помню ими пользовался когда-то.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:58.
|