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)

Arton 28.10.2013 09:58

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

Сообщение от Samodelkin (Сообщение 269398)
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 между текстурами которые ложаться на сурфейсы параллельные плоскости экрана и текстурами которые ложаться на сурфейсы под большим углом к плоскости экрана. Другими словами либо видна размытость стен, либо рябь на земле и потолке.

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

Классно выглядит! :super:

FPS max. - 15, min. - 13

Стерео эффект пока что не очень, может быть из-за чёрных полосок сверху и снизу экрана, или нечёткости контуров.
Слева экрана, артефактная красная полоса, в стерео очках даёт странный эффект - как будто слева очень узкая, дополнительная камера.

Samodelkin 28.10.2013 17:46

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

Arton 28.10.2013 21:11

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

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

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

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

Моё воображение... +_+

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


Цитата:

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

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

DDR 3 - 1333 - 4Гб - одна планка

Samodelkin 28.10.2013 23:26

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

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

DDR 3 - 1333 - 4Гб - одна планка

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

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

Я кстати не знаю причины почему у тебя одна планка, но это не рационально. Для твоего процессора оптимальная память раза в 3 быстрей должна быть. У тебя же наверняка трехканальная передача данных поддерживается или что-то в этом роде. Еще 2 планки аналогичные поставь.

alko 23.12.2013 12:51

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

И ещё, как поменять в этом движке высоту положения камеры ? Там надо отдельно менять какие-то значения в цикле рендера пола, цикле стен и спрайтов.

alko 23.12.2013 13:39

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


alko 23.12.2013 13:40

Ответ: raycasting
 
Нужно избавиться от умножения. До тела цикла вычислить константу, а затем вычислять d+=const.
то же касается и TexY.
А вообще лучше конечно было бы асм-всавками воспользоваться, но хз, как потом результат вычислений занести из регистров в определённую переменную...

Samodelkin 23.12.2013 18:02

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

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

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

upd:
Максимум что можно сделать это рендерить в буфер 320x240, а затем аппаратно перерисовать в более большой, например 1920х1080, потому что не все мониторы могут растянуть такое низкое разрешение на полный экран, только перерисовывать без сглаживания, либо с каким то дополнительным шейдерным эффектом, как например старые ЭЛТ мониторы - они не могли четко нарисовать пиксель как LCD монитор.

alko 23.12.2013 19:47

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

Сообщение от Samodelkin (Сообщение 271817)

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 с искажённым наложением текстур)... Но это уже малость оффтоп.

alko 23.12.2013 19:51

Ответ: raycasting
 
Вот сейчас интересует, как же запилить ассемблерную вставку в коде-блоксе (mingw gcc win32).
Чтоб произвести арифметические вычисления, и результат из регистра поместить в какую-либо переменную.

Samodelkin 23.12.2013 20:40

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

howto для at&t

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

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

Однако многие предпочитают интринсики ассемблерным вставкам, они чуть медленей, но всеравно в разы быстрей чем без них, но я их не использовал, так что пусть ктонибудь другой ответит кто знает.

alko 26.12.2013 17:47

Ответ: 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 " - там происходит сатана с текстурами.

Samodelkin 26.12.2013 23:00

Ответ: raycasting
 
Код:

int d = ( y  << 8 )  - d2 + d1;
В скобки обводил? У сдвига приоритет ниже чем у сложения/вычитания.

alko 28.12.2013 00:09

Ответ: raycasting
 
Есть идеи, как в том сорсе осуществить поворот стен хотя бы кратный 45-ти градусам ?
В смысле не строго север\юг\запад\восток, а хотя бы так, как в zero tolerance на мегадрайве.

Samodelkin 28.12.2013 01:25

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

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


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

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