Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Проекты > Проекты C++

Ответ
 
Опции темы
Старый 28.10.2013, 09:58   #31
Arton
Быдлокодер
 
Аватар для Arton
 
Регистрация: 05.07.2009
Адрес: Проспит
Сообщений: 5,019
Написано 2,312 полезных сообщений
(для 5,349 пользователей)
Ответ: raycasting

Сообщение от Samodelkin Посмотреть сообщение
maze_6_12.rar



Поправил.
Вывел более менее оптимальную формулу расчета мип-уровней:
twoTanAlpha = 2.0f * tan( fieldOfViewInRad / 2.0f );
fbRealWidth = rayLen * twoTanAlpha * factor;
pixSize = fbRealWidth / scrWidth;
texSize = objWidth / texWidth;
lv = ceil( sqrt( pixSize / texSize ) ) - 1.0f;
// rayLen - длина луча.
// scrWidth - ширина экрана в пикселях.
// objWidth - ширина объекта с текстурой (в мировых единицах измерения).
// texWidth - ширина текстуры в текселях.
// fieldOfView - угол обзора в радианах.
Однако всеравно приходится выбирать баланс с помощью коэффициента factor между текстурами которые ложаться на сурфейсы параллельные плоскости экрана и текстурами которые ложаться на сурфейсы под большим углом к плоскости экрана. Другими словами либо видна размытость стен, либо рябь на земле и потолке.

Вот, анизотропную фильтрацию пока сделать вообще не удасться - нехватает данных о положении сурфейса во время процесса выборки текстур. Нужно конвеер рендера расширять. Так что пока всё.
Классно выглядит!

FPS max. - 15, min. - 13

Стерео эффект пока что не очень, может быть из-за чёрных полосок сверху и снизу экрана, или нечёткости контуров.
Слева экрана, артефактная красная полоса, в стерео очках даёт странный эффект - как будто слева очень узкая, дополнительная камера.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Arton за это полезное сообщение:
pepel (26.12.2013), Samodelkin (28.10.2013)
Старый 28.10.2013, 17:46   #32
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 979
Написано 388 полезных сообщений
(для 631 пользователей)
Ответ: raycasting

Сообщение от Arton
Стерео эффект пока что не очень
Там его и нет, это все твое воображение.

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

Насчет того эффекта что ты принял за стерео - его механика проще: изображение раскладывается на 3 составляющии, красное, зеленое и синие. Затем красное и синие сдвигаются вправо и влево относительно зеленого соотвественно, и немного искажаются по горизонтали, с помощью смещения. Затем 3 составляющии снова соединяются в одно изображение. То что это внешне напоминает стерео - просто совпадение, я и не думал о нем когда делал этот эффект.

Сообщение от Arton
FPS max. - 15, min. - 13
Сей факт меня печалит...
Я пробовал на стареньком ноуте с процем DualCore 2ГГц - там до 20 fps, на i7-930 - 55-60. У тебя нет возможности Linux версию протестировать? И кстати какая у тебя память (сколько каналов, тип и частота)?

maze_6_13.tar.7z (Linux)
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Samodelkin за это полезное сообщение:
Arton (28.10.2013), pepel (26.12.2013)
Старый 28.10.2013, 21:11   #33
Arton
Быдлокодер
 
Аватар для Arton
 
Регистрация: 05.07.2009
Адрес: Проспит
Сообщений: 5,019
Написано 2,312 полезных сообщений
(для 5,349 пользователей)
Ответ: raycasting

Сообщение от Samodelkin Посмотреть сообщение
Там его и нет, это все твое воображение.

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

Насчет того эффекта что ты принял за стерео - его механика проще: изображение раскладывается на 3 составляющии, красное, зеленое и синие. Затем красное и синие сдвигаются вправо и влево относительно зеленого соотвественно, и немного искажаются по горизонтали, с помощью смещения. Затем 3 составляющии снова соединяются в одно изображение. То что это внешне напоминает стерео - просто совпадение, я и не думал о нем когда делал этот эффект.
Моё воображение... +_+

А ведь почти получилось


Сей факт меня печалит...
Я пробовал на стареньком ноуте с процем DualCore 2ГГц - там до 20 fps, на i7-930 - 55-60. У тебя нет возможности Linux версию протестировать? И кстати какая у тебя память (сколько каналов, тип и частота)?

maze_6_13.tar.7z (Linux)
Вох! Внезапно он у меня есть, убунта в смысле, но протестирую позже, т. к. не знаю\не помню как его включать и что там

DDR 3 - 1333 - 4Гб - одна планка
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Arton за это полезное сообщение:
pepel (26.12.2013), Samodelkin (28.10.2013)
Старый 28.10.2013, 23:26   #34
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 979
Написано 388 полезных сообщений
(для 631 пользователей)
Ответ: raycasting

Сообщение от Arton
Вох! Внезапно он у меня есть, убунта в смысле, но протестирую позже, т. к. не знаю\не помню как его включать и что там

DDR 3 - 1333 - 4Гб - одна планка
Там через менеджер пакетов или центр приложений нужно поставить gcc и g++ компиляторы и sdl 1.2. Это нужно для рантайм библиотек. Для линуха я не комплектую приложения сопутствующими .so файлами - их правильней хранить в специальной отдельной папке. Тест, особенно в окне лучше запускать из командной строки - тогда в нее же будет fps выводиться (консольное окно само не откроется как в windows).

Вполе возможно что медленно так из-за памяти. Так что буду пробовать еще снижать трафик в памяти. Я думаю на памяти надо даже больше сосредоточиться чем на процессоре.

Я кстати не знаю причины почему у тебя одна планка, но это не рационально. Для твоего процессора оптимальная память раза в 3 быстрей должна быть. У тебя же наверняка трехканальная передача данных поддерживается или что-то в этом роде. Еще 2 планки аналогичные поставь.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pepel (26.12.2013)
Старый 23.12.2013, 12:51   #35
alko
Оператор ЭВМ
 
Регистрация: 21.12.2013
Сообщений: 20
Написано 10 полезных сообщений
(для 10 пользователей)
Смущение Ответ: raycasting

Надеюсь автор топика не будет против, если я продолжу тему по иному рейкаст-двигателю (http://lodev.org/cgtutor/raycasting2.html)
Пробовал заделать пол и потолок градиентом (пикча) прирост производительноти процентов, эдак, на 50...75. Но всё равно отстойно смотрится.
Замена double на float не привнесла абсолютно никаких изменений. Всё такой же адово низкий показатель fps. (при отрисовке текстур пола и потолка на разрешении 1366*768 и частоте проца 2.2 ГГц выдаёт 12 кадров пер секонд)

И ещё, как поменять в этом движке высоту положения камеры ? Там надо отдельно менять какие-то значения в цикле рендера пола, цикле стен и спрайтов.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pepel (26.12.2013)
Старый 23.12.2013, 13:39   #36
alko
Оператор ЭВМ
 
Регистрация: 21.12.2013
Сообщений: 20
Написано 10 полезных сообщений
(для 10 пользователей)
Ответ: raycasting

В этом участке я максимум что осилил, так это вынести пару арифметических операций за тело цикла.
   int dd=h * 128 ;
      int dd1=lineHeight * 128;
      for(int y = drawStart; y < drawEnd; y+=2)
      {
        int d = y * 256 - dd+dd1; //256 and 128 factors to avoid floats
        int texY = ((d * texHeight) / lineHeight) / 256;
        int color = texture[texNum][texWidth * texY + texX];
        if(side == 1) color = (color >> 1) & 8355711;
        buffer[x][y] = color;  
      }
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pepel (26.12.2013)
Старый 23.12.2013, 13:40   #37
alko
Оператор ЭВМ
 
Регистрация: 21.12.2013
Сообщений: 20
Написано 10 полезных сообщений
(для 10 пользователей)
Ответ: raycasting

Нужно избавиться от умножения. До тела цикла вычислить константу, а затем вычислять d+=const.
то же касается и TexY.
А вообще лучше конечно было бы асм-всавками воспользоваться, но хз, как потом результат вычислений занести из регистров в определённую переменную...
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pepel (26.12.2013)
Старый 23.12.2013, 18:02   #38
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 979
Написано 388 полезных сообщений
(для 631 пользователей)
Ответ: raycasting

Пока еще не разбирал этот двиг, но некоторые алгоритмы рейкастинга (и в моем движке так тоже было в начале) могут не предусмативать настройку высоты камеры вообще - опять же этими апроксимациями можно сократить кол-во вычислений.

1366х768 и при этом собираешься делать ретро игру под pentium mmx с выборкой без сглаживания и целочисленными вычислениями? Так не выйдет. Определись - либо делаешь всё как в старых играх, в том числе 320х200 (или 240), либо делаешь нормально под современные железо и пользуешься текстурными фильтрами и прочими вещами которые хоть как то облагораживают изображения для более менее высокого разрешения. Иначе будет выглядеть трешево.

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

upd:
Максимум что можно сделать это рендерить в буфер 320x240, а затем аппаратно перерисовать в более большой, например 1920х1080, потому что не все мониторы могут растянуть такое низкое разрешение на полный экран, только перерисовывать без сглаживания, либо с каким то дополнительным шейдерным эффектом, как например старые ЭЛТ мониторы - они не могли четко нарисовать пиксель как LCD монитор.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pepel (26.12.2013)
Старый 23.12.2013, 19:47   #39
alko
Оператор ЭВМ
 
Регистрация: 21.12.2013
Сообщений: 20
Написано 10 полезных сообщений
(для 10 пользователей)
Ответ: raycasting

Сообщение от Samodelkin Посмотреть сообщение

1366х768 и при этом собираешься делать ретро игру под pentium mmx с выборкой без сглаживания и целочисленными вычислениями?
Та не. То я для примера привёл цифры.
так-то планирую хотя бы на 640*480 ориентироваться. Дело в том, что на 640*480 этот движок тоже адски тормозит.
На моём пне MMX вполне шустро работает виндовый порт Дюка3д eduke32 на разрешении 800*600, на софтверном рендере, разумеется. А там графон огого, и динамические освещения, и разная высота стен, и альфаблендинг текстур, и анимация биллбордов и текстур, та и тайлинг текстур нехилый такой, и наклонные поверхности по всем осям, и ещё много чего.

Та и не только рейкаст, даже полигнональные игры, типа NFS-1 или MDK на софтверном двигателе летают на моем MMX'e. А вот игры с коррекцией перспективы уже малость лажают (тот же quake 1-2, на разрешениях 640*480 проседают по фреймрейту, так как коррекция перспективы довольно ресурсоёмка. Хотя меш моделей *.md1 *.md2 с искажённым наложением текстур)... Но это уже малость оффтоп.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pepel (26.12.2013)
Старый 23.12.2013, 19:51   #40
alko
Оператор ЭВМ
 
Регистрация: 21.12.2013
Сообщений: 20
Написано 10 полезных сообщений
(для 10 пользователей)
Ответ: raycasting

Вот сейчас интересует, как же запилить ассемблерную вставку в коде-блоксе (mingw gcc win32).
Чтоб произвести арифметические вычисления, и результат из регистра поместить в какую-либо переменную.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pepel (26.12.2013)
Старый 23.12.2013, 20:40   #41
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 979
Написано 388 полезных сообщений
(для 631 пользователей)
Ответ: raycasting

В gcc inline assembler есть два наречия at&t и intel - intel признано более удобным, но можешь по любому писать.

howto для at&t

Для intel все тоже самое только нужно ".intel_syntax;" добавить первой строкой ну и соответсвенно на другом наречии дальше писать, например как тут.

Здесь можно смотреть сами инструкции. Необязательно читать всё - тебе надо 5.5, а также часть 9 про mmx, части 10 и 11 про sse и sse2, ну и дальше если тебе нужно больше расширений.

Однако многие предпочитают интринсики ассемблерным вставкам, они чуть медленей, но всеравно в разы быстрей чем без них, но я их не использовал, так что пусть ктонибудь другой ответит кто знает.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pepel (26.12.2013)
Старый 26.12.2013, 17:47   #42
alko
Оператор ЭВМ
 
Регистрация: 21.12.2013
Сообщений: 20
Написано 10 полезных сообщений
(для 10 пользователей)
Ответ: raycasting

За счёт побитного скролла fps увеличился с 50-ти до 62-ух (это если стенку в вплотную разглядывать... При разглядывании спрайтов fps почти вдвое меньше становится)
    int d1=lineHeight * 128; 
       int d2=h * 128; 
       for(int y = drawStart; y < drawEnd; y++) 
       { 
        int d = y *256 - d2 + d1;  //256 and 128 factors to avoid floats 
        int texY = ((d * texHeight) / lineHeight) >>8; 
         Uint32 color =texture[texNum][texWidth * texY + texX]; 
         if(side == 1) color = (color >> 1) & 8355711; 
         buffer[x][y] = color; 
             }
Если " у*256 " заменить на " y<<8 " - там происходит сатана с текстурами.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pepel (26.12.2013)
Старый 26.12.2013, 23:00   #43
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 979
Написано 388 полезных сообщений
(для 631 пользователей)
Ответ: raycasting

int d = ( y  << 8 )  - d2 + d1;
В скобки обводил? У сдвига приоритет ниже чем у сложения/вычитания.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
alko (28.12.2013)
Старый 28.12.2013, 00:09   #44
alko
Оператор ЭВМ
 
Регистрация: 21.12.2013
Сообщений: 20
Написано 10 полезных сообщений
(для 10 пользователей)
Ответ: raycasting

Есть идеи, как в том сорсе осуществить поворот стен хотя бы кратный 45-ти градусам ?
В смысле не строго север\юг\запад\восток, а хотя бы так, как в zero tolerance на мегадрайве.
(Offline)
 
Ответить с цитированием
Старый 28.12.2013, 01:25   #45
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 979
Написано 388 полезных сообщений
(для 631 пользователей)
Ответ: raycasting

В данном подходе никаких проблем нет. Главное нужно понимать что задачу можно разделить на две составляющие - первая нахождение пересечения луча со стеной в 2д, вторая уже на основе полученной длины луча мы строим слайс с учетом высоты стены. Поэтому в первой составляющей мы можем рассчитать стену как угодно, а для второй аргументами будут являться длина луча и высота стены. Так что считать только прямоугольные стены совсем не обязательно. Например мы можем рисовать произвольной кривизны линии изображающие стены и если у нас будет алгоритм, который сможет найти пересечения луча и этих линий то мы найдем длину луча, которую и передадим во вторую составляющую алгоритма. Однако не стоит забывать что в играх кроме графики есть и физика, и например рассчитывать коллизии игрока со стенами произвольной кривизны будет сложно. Я думаю самым оптимальным выбором будут стены составленные из отрезков, которые могут находиться под произвольным углом (а не только 45 градусов). Таким образом задача сводится к нахождению пересечения луча и отрезка.

Вроде когда я смотрел коды того движка, там карта задавалась прямо в коде в виде двумерного массива. С таким форматом ничего не выйдет - нужно разработать другой формат, который хранит данные о карте в форме отрезков. Возможно для удобства потребуется редактор таких карт.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com