forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Проекты C++ (http://forum.boolean.name/forumdisplay.php?f=56)
-   -   raycasting (http://forum.boolean.name/showthread.php?t=18551)

Samodelkin 20.09.2013 22:13

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)

Arton 20.09.2013 22:55

Ответ: raycasting
 
Цитата:

Сообщение от Samodelkin (Сообщение 267440)
Вобщем если кого заинтересует, можно вернуться к разработке...

Уже жду :)

Samodelkin 22.09.2013 03:19

Ответ: raycasting
 
Обнова: raycasting_2

* Немного поправил код: теперь можно в сурцах задавать больше вариантов разрешения. В архиве есть ЕХЕ с 640х480 и 800х600 (окно и полный экран).
* Добавил код компенсирующий эффект fish eye, свойственный для рейкастинга.
* Немного устранил искажения aspect ratio при некоторых разрешениях, но небольшие всеравно есть. Связано это с тем, что алгоритм был основан на целых числах с фиксированным разрешением 320х240 и значения подобраны таким образом чтобы не происходили округления. Но с другими разрешениями появляются искажения, поэтому я частично перевожу на float (тем более что потом всеравно все это на gpu логично будет перенести).
* Еще всяческие изменения в коде сделал, но он пока по прежнему плохо структурирован.
* Самая медленная часть кода - софтварная выборка текстуры, там надо ускорять сильно, может быть для начала попробовать SSE, хотя я не уверен что вообще системная память хорошо умеет делать выборку как видеопамять.

mr.DIMAS 25.09.2013 10:57

Ответ: raycasting
 
Я чего-то непонимаю? Зачем с собой темплейты таскать такие длинные?

Samodelkin 25.09.2013 16:18

Ответ: raycasting
 
Цитата:

Я чего-то непонимаю? Зачем с собой темплейты таскать такие длинные?
Ты про то что шаблоны большие или сам факт записи нечитабельный? =)
Я предупреждал что код кривой.
Там по сути половина параметров шаблона вообще не нужно. Я их уже сокращаю. Даже если там останется много параметров то класс лучше инициализировать через дескриптор, тогда и читаемость кода лучше будет.
Вобщем буду править.

mr.DIMAS 25.09.2013 23:32

Ответ: raycasting
 
Ясно, а так интересный код. Просто до сих пор не удосужился поглядеть код Wolfenstein'a, а тут как раз рейкаст.

Samodelkin 26.09.2013 00:24

Ответ: raycasting
 
Обновил код - ссылка в первом посте.
Визуально ничего не изменилось, так что добавлять приложение не стал.

Я посмотрел на шаблоны классов FrameBuffer и rc2d и там небыло ни одного параметра типа. Значит классы не такие уж гибкие и шаблоны им особо не нужны. Я заменил шаблоны на дескрипторы. Также добавил кое что из с++11: конструкторы переноса для классов FrameBuffer и rc2d весьма полезны будут, местами синтаксис и формат подправил. Обернул двумерный массив maze в класс Maze, чтобы сократить число аргументов в некоторых методах.

is.SarCasm 26.09.2013 09:35

Ответ: raycasting
 
Мой винрар не распаковывает твои архивы (Неизвестный метод). У меня стоит последняя версия

Samodelkin 26.09.2013 15:43

Ответ: raycasting
 
Цитата:

Мой винрар не распаковывает твои архивы (Неизвестный метод). У меня стоит последняя версия
Это который 5.00 beta чтоли?

WinRAR 4.20 вроде нормально открывает.
Я паковал с помощью PeaZip в стандартном zip формате.
На всякий случай продублировал все в rar ( ссылки в первом посте ).

is.SarCasm 27.09.2013 10:47

Ответ: raycasting
 
Samodelkin, теперь всё отлично, спасибо. Буду следить)

Samodelkin 28.09.2013 17:51

Ответ: 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.

Ссылки все в первом посте.

mr.DIMAS 29.09.2013 03:44

Ответ: raycasting
 
Визуально ничего не изменилось. Скорость рендера возросла.

Среднее значение

maze_2 : 42

maze_4 : 63

Процессор 4 ядра по 3,2 ГГЦ

Редактором не врубился как пользоваться.

Код поглядел. Стал лучше.

Вообще проект у тебя интересный. Слежу.

Samodelkin 30.09.2013 22:35

Ответ: raycasting
 
Неудобно что правка первого поста ограничена 10 днями... Туда удобно было добавлять новый материал чтобы все в одном месте было.

Raycasting прогрессирует!



>>> maze_5.rar <<<

Подправил многопоточность: на моем пк +20 fps прирост.

Добавил текстуры. Вообще они там и так были, но небыло загрузчика для них. Я написал свой для bmp. Свой писал потому что мне нужен был определенный контроль при переводе из DIP в DDB формат, так как есть определенные особенности рендера. Загрузчик пока читает bmp с заголовком в 54 байта (те что стандартные из пеинта вобщем), остальные варианты если нужны будут потом добавлю. Фильтр для текстуры пока nearest, чуть позже попробую bilinear - есть вероятность что в софтваре уже не потянет.

Сделал разрешение 1280х720 и ограниение в 30 fps, чтобы фреймрейт не скакал. Для софварного рендера это очень даже неплохо имхо, тем более что дальше графика еще будет нагружаться.

Сделал чуток плавней управление.

mr.DIMAS 01.10.2013 00:13

Ответ: raycasting
 
Вложений: 1
Скорость рендера стабильная, и практически не зависит от размера текстуры - я уменьшил размер текстуры в 2 раза и FPS все равно 31. Что круто.

Двигаясь вплотную по стенке вызел баг. Второй раз пошел по тому же самому месту - баг не вылез. Скрин в аттаче.

Samodelkin 01.10.2013 20:48

Ответ: 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 атрибуты вроде бы работали, я помню ими пользовался когда-то.


Часовой пояс GMT +4, время: 18:04.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot