forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Проекты C++ (http://forum.boolean.name/forumdisplay.php?f=56)
-   -   [TrueHorror] - разработка (http://forum.boolean.name/showthread.php?t=17293)

Mr_F_ 19.05.2014 02:46

Ответ: [TrueHorror] - разработка
 
Цитата:

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

Цитата:

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

Цитата:

использовать значения глубины для сравнения с глубиной шадоумапы из г-буфера?
проецируешь шадоумапу той же матрицей, что юзал для камеры шадоумапской, на сцену. сравниваешь спроецированую глубину и глубину фрагмента сцены в этом месте.
ежели у сцены глубже, чем в шадоумапе - значит оно загорожено, там тень.

Samodelkin 19.05.2014 03:17

Ответ: [TrueHorror] - разработка
 
Цитата:

Сообщение от mr.DIMAS (Сообщение 281115)
ладно, с тенями разберусь позже.

вот проверьте промежуточный графон в игре. добавил бамп.

https://www.dropbox.com/s/d8s3ps3ngkdgwip/release.rar

Ипать в 2 часа ночи в такое играть :)
Освещение нормально - везде 60 фпс.
В главном меню освещение глючит, в игре везде нормально.
В общем отлично - продолжай :super:

HolyDel 19.05.2014 04:05

Ответ: [TrueHorror] - разработка
 
чото я не понял как умер. в пещере подул ветер и затушил жигу. я на всякий случай вышел задом к костру на поляне. но оно меня нашло и там.
ну и жига светит слишком ярко для жиги.
хдр тебе нужен с адаптацией - будет прикольно

Samodelkin 19.05.2014 04:21

Ответ: [TrueHorror] - разработка
 
Цитата:

Сообщение от HolyDel (Сообщение 281121)
чото я не понял как умер. в пещере подул ветер и затушил жигу. я на всякий случай вышел задом к костру на поляне. но оно меня нашло и там.

фига - там еще один был...

Arton 19.05.2014 08:14

Ответ: [TrueHorror] - разработка
 
Цитата:

Сообщение от mr.DIMAS (Сообщение 281115)
ладно, с тенями разберусь позже.

вот проверьте промежуточный графон в игре. добавил бамп.

https://www.dropbox.com/s/d8s3ps3ngkdgwip/release.rar

FPS 75

Прошёл всю игру :)

Бамп норм, теперь дело за "малым" сделать качественную медию.

Цитата:

Сообщение от HolyDel (Сообщение 281121)
чото я не понял как умер. в пещере подул ветер и затушил жигу. я на всякий случай вышел задом к костру на поляне. но оно меня нашло и там.

Ты в машину сел и сгорел.

tirarex 19.05.2014 16:22

Ответ: [TrueHorror] - разработка
 
Очень понравилось но бамс слишком сильный и сильные лаги в местах скопленя партиклов тс около генератора 45фпс и в шахте 20 !(в шахте ломанул проход а дальше некуда , как понимаю это был конец)

mr.DIMAS 19.05.2014 17:30

Ответ: [TrueHorror] - разработка
 
Я вот никак не могу понять почему лагают партиклы, со стороны на них смотришь - фпс норм, внутрь попадаешь - фпс двукратно а то и больше падает.

pax 19.05.2014 17:50

Ответ: [TrueHorror] - разработка
 
Полноэкранный бленд же...

mr.DIMAS 19.05.2014 18:05

Ответ: [TrueHorror] - разработка
 
Получается лечатся лаги только уменьшением количества частиц, тут проблем никаких - мягкие частицы выруливают при меньшем количестве с таким же качеством, что и много "жестких".

mr.DIMAS 20.05.2014 01:54

Ответ: [TrueHorror] - разработка
 
Совсем забыл, что я не сортирую частицы по глубине. На скоряк сделал так.

Код:

D3DXMATRIX worldView;

bool ParticleZSort ( Particle & p1, Particle &p2 )
{
  D3DXVECTOR3 viewSpacePos1;
  D3DXVec3TransformCoord( &viewSpacePos1, &D3DXVECTOR3( p1.pos.x, p1.pos.y, p1.pos.z ), &worldView );

  D3DXVECTOR3 viewSpacePos2;
  D3DXVec3TransformCoord( &viewSpacePos2, &D3DXVECTOR3( p2.pos.x, p2.pos.y, p2.pos.z ), &worldView );

  return viewSpacePos1.z < viewSpacePos2.z;
}

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

Mr_F_ 20.05.2014 02:51

Ответ: [TrueHorror] - разработка
 
можно инстансингом рисовать, тогда перезаливать только позиции партиклов можно, без остальных геом данных.

mr.DIMAS 27.05.2014 01:28

Ответ: [TrueHorror] - разработка
 
Наконец-то взялся за тени.

Цитата:

Сообщение от Mr_F_ (Сообщение 281118)
да, глубину рисуешь с другой камеры в другую текстуру.


не мешает, трафарет у тебя же юзается у экранного дептхстенсил буфера, для теней другие юзай, все равно там размеры буферов другие нужны.


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

А можно поподробнее про трафарет - почему он не мешает? Ведь шейдером отрисовываются только пиксели прошедшие тест трафарета.

Mr_F_ 27.05.2014 03:46

Ответ: [TrueHorror] - разработка
 
как он будет мешать если буферы разные?
---
или ты всё же стенсильные тени хочешь?

mr.DIMAS 27.05.2014 18:09

Ответ: [TrueHorror] - разработка
 
Цитата:

или ты всё же стенсильные тени хочешь?
нет.

вот как я планирую сделать.

Код:

рендерим сцену в г-буфер.

для каждого источника света
{
    рендерим шадоумапу
 
    врубаем трафарет

    рисуем ограничивающий объем( конус например )
 
    рисуем экранный квад используя г-буфер и шадоумапу

    вырубаем трафарет
}

вот так. что здесь не так?

Mr_F_ 27.05.2014 19:44

Ответ: [TrueHorror] - разработка
 
всё норм. трафарет же записывается в конкретный depthStencil буфер.
ты его записываешь в буфер своей экранной РТ (или где ты там свет аккумулириуешь).
шадоумапа рендерится в свою тексу и со своим дептхСтенсил буфером, оба не экранного размера. у шадоумапа стенсил пустой.

mr.DIMAS 28.05.2014 02:12

Ответ: [TrueHorror] - разработка
 
Я все еще не понимаю - не пинай ногами. Шадоумапу заполняем без трафарета - это я понял. НО! Учет теней происходит в шейдере второго прохода, куда помимо гбуфера, передается и текстура шадоумапы. Он же обрабатывает пиксели прошедшие тест трафарета - тень может быть и за ограничивающим объемом - в таком случае она отсечется трафаретом. Или что, тени отрисовывать еще одним проходом после самого освещения?

Я уже вконец запутался.

Mr_F_ 28.05.2014 03:24

Ответ: [TrueHorror] - разработка
 
Я не понимаю, чего ты не понимаешь. Попробуй сделать уже)

mr.DIMAS 05.06.2014 23:11

Ответ: [TrueHorror] - разработка
 
Вложений: 1
Игру делаю.

Что сделал:
1) Сделал спотлайты с оптимизацией конусами
2) Переписал скрипт экспорта из макса - теперь можно экспортировать максовские источники света - движок их с радостью жуёт.
3) Начал делать тени( спустя столько времени :-D )
4) Сделал еще один уровень
5) Расширил два готовых уровня( горы и шахта )
6) Добавил 15 записок - раскрыващих сюжет.
7) Из-за изменения формата моделей просрал исходник руки с зажигалкой - поэтому на скринах нет руки :-D )

Что хочу добавить в графон помимо теней:
1) SSAO - вот только в ps_2_0 он не влезет
2) HDR - киньте ссылок как его сделать.

В планах по игре:
1) Добавить технических головоломок
2) Сделать инвентарь
3) Добавить нормальные скримеры( красная херня на весь экран - не труЪ )
4) Сделать оставшиеся 4 уровня - да, игру хочу закончить( хоть раз, из всех проЭктов ) - прошу вас почаще меня пинать в случае застоя.

5) Доработать сюжет.


Пока что сюжет примерно следующий( кратко ). Играем за горняка, который бросил работу в действующей шахте и стал заниматься разведкой старинных заброшенных шахт. В прошлом, в старых рудниках технология разведки драгоценных металлов была плохо поставлена, поэтому разведка старых шахт оказалась прибыльным занятием. На прошлой работе он нашел двух единомышленников. Игра начинается с прибытия нашего героя к одной из шахт на Урале. Прибывает он с опозданием - в пути пробило колесо и он потратил несколько часов на поиск запаски и её установку. В разведку он взял своих напарников, они приехали раньше него и успели приготовить всё для геологоразведки. Но по прибытии, наш герой никого не обнаруживает ни возле входа в шахту ни в ней самой. Зато в одном штреке обнаруживает забетонированный проход ведущий в( микроспойлер: в то что видно в меню :-D )...

Дальше спойлеры.

Mr_F_ 06.06.2014 00:54

Ответ: [TrueHorror] - разработка
 
Цитата:

ps_2_0
забить

Цитата:

HDR - киньте ссылок как его сделать.
Состоит из трёх-четырёх-пяти частей.

1) HDR контент. Освещение заранее настраивается в широких диапазонах, а не 0-1, скайбокс может быть хдрный, кубмапы (для них особо важно) итп.

2) Рендер в HDR рендер таргет. Гбуфер не надо, результат надо (В принципе, если очень хочется, можно обходится и без этого и рисовать сразу затонмаппеную картинку, но тогда не получится корректного хдр блума, а также в случае дефера полностью сломается аккумуляция света). Самый модный и кайфовый хдр формат нынче DXGI_FORMAT_R11G11B10_FLOAT. На DX9 может сойти D3DFMT_A2R10G10B10. Не так часто даже 16 бит реально оправданы.

3) Tonemapping. Привождение ядерных хдр диапазонов в экран бедного монитора. Варианты: http://filmicgames.com/archives/75 (также можно самому ещё выдумывать, и многие выдумывают). Я юзаю анчартовый, мне норм.

4) [Опционально] Блум. Ну тут всё понятно, только блумить надо не всё подряд, а то, что реально ЯРКО, т.е. вылезает за единицу даже после тонмаппинга. Белый листок бумаги и белая лампа - не одно и то же, пусть на скриншоте их ргб и может быть похож, но не реальное HDR значение.

5) [Опционально] Адаптация. Даунсемплим экран в 2 раза, потом ещё в 2 и так до 1 пикселя, который говорит нам об средней яркости картинки. Меняем экспозицию в зависимости от этого. Это на самом деле грубоватый вариант, чреватый резкими скачками и прочими неприятностями. Где-то у Valve была особо хитрая дока про адаптацию, там они за много кадров усредняли ещё это среднее значение и вообще как-то извращались, чтобы всё плавно и т. д.

Samodelkin 06.06.2014 01:28

Ответ: [TrueHorror] - разработка
 
Цитата:

Сообщение от Mr_F_ (Сообщение 282168)
5) [Опционально] Адаптация. Даунсемплим экран в 2 раза, потом ещё в 2 и так до 1 пикселя, который говорит нам об средней яркости картинки. Меняем экспозицию в зависимости от этого. Это на самом деле грубоватый вариант, чреватый резкими скачками и прочими неприятностями. Где-то у Valve была особо хитрая дока про адаптацию, там они за много кадров усредняли ещё это среднее значение и вообще как-то извращались, чтобы всё плавно и т. д.

В Watch Dogs по моему вообще вручную задавалась экспозиция. Из за этого было несколько багов, или ошибок дизайнера, когда входишь в темный дом, а экспозиция уличной остается, и нихера не видно. Зато нету случайных бросков, неважно в глубине интерьера или около окна стоишь.

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

Еще отмечу что в Betrayer вообще отказались от HDR, но картинка выглядит сочно (если цветную гамму поставить - по умолчанию игра в ч/б). В игре всегда день и нету закрытых помещений - взяли наиболее подходящее условное значение экспозиции и всю медию делали с этим расчётом. Работа дизайнеров/художников решает.

Mr_F_ 06.06.2014 01:38

Ответ: [TrueHorror] - разработка
 
Цитата:

В Watch Dogs по моему вообще вручную задавалась экспозиция. Из за этого было несколько багов, или ошибок дизайнера, когда входишь в темный дом, а экспозиция уличной остается, и нихера не видно. Зато нету случайных бросков, неважно в глубине интерьера или около окна стоишь.

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

Цитата:

В игре всегда день и нету закрытых помещений - взяли наиболее подходящее условное значение экспозиции и всю медию делали с этим расчётом. Работа дизайнеров/художников решает.
ну так бы я уже не делал, как минимум отражения обязаны быть хдр, на них очень хорошо видно: на поверхностях с низкой отражаемостью по-прежнему видны самые яркие места отражения, на поверхностях с высокой целиком всё. можно конечно на каждый вид поверхности свой кубмап выделывать с подобраным руками контрастом и прочим... но это идиотизм (оправдано, если вы сидите на dx7 или ещё каком-нибудь гавне).

Samodelkin 06.06.2014 04:47

Ответ: [TrueHorror] - разработка
 
Цитата:

Сообщение от Mr_F_ (Сообщение 282180)
ну так бы я уже не делал, как минимум отражения обязаны быть хдр, на них очень хорошо видно: на поверхностях с низкой отражаемостью по-прежнему видны самые яркие места отражения, на поверхностях с высокой целиком всё. можно конечно на каждый вид поверхности свой кубмап выделывать с подобраным руками контрастом и прочим... но это идиотизм (оправдано, если вы сидите на dx7 или ещё каком-нибудь гавне).

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

Wegox 07.06.2014 00:22

Ответ: [TrueHorror] - разработка
 
А где потестить то?

mr.DIMAS 07.06.2014 11:53

Ответ: [TrueHorror] - разработка
 
Кагбе следующая демка будет когда я закончу игру хотя бы на 60 %. Пока что готово только 40%

mr.DIMAS 07.06.2014 22:56

Ответ: [TrueHorror] - разработка
 
Написал конвертер своего же формата :-D. В нем есть необходимость - в максе раздельно хранятся вершины, текстурные координаты и их количество не совпадает(sic!). В итоге в игре приходилось каждый раз перебирать все фейсы и убирать лишние вершины при сортировке по текстуре( один меш - одна текстура - это для быстрого рендеринга ). Так же движок считает нормали и тангенты, ибо первые в максе упороты а вторых тупо нет. Вот и решил вытащить эту мутоту в отдельный конвертер. Скрипт экспортит как есть - все раздельно( вершины, текстурные координаты ), а конвертер сортирует все по мешам, вычисляет нормали и тангенты, ограничивающие объемы и записывает все в быстро загружаемый формат( к примеру если движок сам будет все вычислять то на загрузку карты из 100k поликов уходит 41 секунда, а с конвертером загружается за 6 секунд( 5,5 занимает загрузка текстур ) ). На максскрипте это все выполняется ужасно долго. Вот такая петрушка.

Mr_F_ 07.06.2014 23:08

Ответ: [TrueHorror] - разработка
 
Цитата:

ибо первые в максе упороты
ты просто не умеешь их доставать

mr.DIMAS 07.06.2014 23:11

Ответ: [TrueHorror] - разработка
 
Научи.

GetFaceRNormals - оверхед
getNormal - кал

Вычисленные нормали куда лучше

Mr_F_ 07.06.2014 23:33

Ответ: [TrueHorror] - разработка
 
Цитата:

GetFaceRNormals
юзаю его

Цитата:

Вычисленные нормали куда лучше
артисты тебя не полюбили бы за выбрасывание их авторских нормалей =)
но коли ты сам автор медии, то тебе видней

mr.DIMAS 10.06.2014 23:58

Ответ: [TrueHorror] - разработка
 
Что будет быстрее - загрузить текстуру в jpg ( распаковка, все дела ) или несжатый tga?

Samodelkin 11.06.2014 00:21

Ответ: [TrueHorror] - разработка
 
Цитата:

Сообщение от mr.DIMAS (Сообщение 282451)
Что будет быстрее - загрузить текстуру в jpg ( распаковка, все дела ) или несжатый tga?

Ты имеешь ввиду "из", а не "в"?
Быстрей всего загружаются форматы с RLE сжатием, даже быстрей чем без сжатия.
Вообще если что то разжимается быстрей чем читается с диска распакованный вариант, то значит загружаться будет быстрей.

Раз у тебя D3D9 то вообще используй DDS - он же на GPU распаковывается.

mr.DIMAS 11.06.2014 00:50

Ответ: [TrueHorror] - разработка
 
Цитата:

Ты имеешь ввиду "из", а не "в"?
Риальне "из". Опечатался.

Спасибо за то что напомнил про DDS. Пожалуй переведу в него текстуры.

Samodelkin 11.06.2014 00:54

Ответ: [TrueHorror] - разработка
 
Цитата:

Сообщение от mr.DIMAS (Сообщение 282457)
Риальне "из". Опечатался.

Спасибо за то что напомнил про DDS. Пожалуй переведу в него текстуры.

Судя по wiki opengl через расширение тоже держит dds. Еще я помню doom3 (у него opengl рендер) также использует dds. Так что я думаю это оптимальный вариант и ты ничего не теряешь.

Mr_F_ 11.06.2014 02:16

Ответ: [TrueHorror] - разработка
 
В релизе текстуры обязаны быть в DDS. DDS это контейнер нативных видюшных данных. Большинство текстур отлично сжимаются DXT, что позволяет экономить дохрена видеопамяти. Самому сжатию нечего делать в рантайме (это не реалтайм дело) - сжимать надо на препроцессе а не у игрока.

Samodelkin 11.06.2014 02:35

Ответ: [TrueHorror] - разработка
 
Цитата:

Сообщение от Mr_F_ (Сообщение 282463)
В релизе текстуры обязаны быть в DDS. DDS это контейнер нативных видюшных данных. Большинство текстур отлично сжимаются DXT, что позволяет экономить дохрена видеопамяти. Самому сжатию нечего делать в рантайме (это не реалтайм дело) - сжимать надо на препроцессе а не у игрока.

Ну в DXT всё равно извлечение данных во время выборки? Там конкретный пиксель вычисляется из общего шаблона.

Да важно отметить что в видеопамяти нужно хранить в DXT, больше по причине ограниченного размера vram, нежели скорости распаковки.
Актуально при таких больших локациях как в TrueHorror :)


В Watch Dogs заметил что текстуры прогружаются напрямую в видеопамять (видимо из-за наличия общей памяти в консолях), и если её не хватает то стримится с диска.
Разве нельзя кешировать текстуры в ram?

Mr_F_ 11.06.2014 12:05

Ответ: [TrueHorror] - разработка
 
Цитата:

Ну в DXT всё равно извлечение данных во время выборки?
Оно в железе. DXT читается даже быстрее, чем неDXT, потому что меньше работы с памятью.

mr.DIMAS 17.06.2014 01:41

Ответ: [TrueHorror] - разработка
 
Для катсцен понадобилась скелетная анимация. До этого был морфинг - но он слишком много жрет оперативки.

В качестве костей используются узлы сцены - точнее их global transform. И вот тут косяк. Если этой трансформацией преобразовать вершину - она улетает в ебеня.

Вроде как нужно получить transform в с.к. относительно [0,0,0] а не позиции кости.

Кароч я тут понаписал ататы. Научите меня скелетке. :)

Mr_F_ 17.06.2014 02:41

Ответ: [TrueHorror] - разработка
 
у тебя меш в Т-позе - т.е. в такой позе, при которой у костей есть определённые дефолт-ротации.
тебе нужно иметь инвертированные матрицы костей в Т-позе, чтобы мировые ротации костей анимационные преобразовывать в пространство относительно Т-позы. вот и все дела.

Samodelkin 17.06.2014 02:47

Ответ: [TrueHorror] - разработка
 
Есть книга Джима Адамса про скелетную анимацию.
Однако книга 2004 года и некоторые вещи связанные с directx в ней сильно устарели (даже для dx9), но теоретическая часть в ней подробно расписана.

Arton 17.06.2014 04:27

Ответ: [TrueHorror] - разработка
 
Цитата:

Сообщение от Samodelkin (Сообщение 282930)
Есть книга Джима Адамса про скелетную анимацию.
.

Прочитал как Адам Дженсен.

Mr_F_ 17.06.2014 11:18

Ответ: [TrueHorror] - разработка
 
Цитата:

книга Джима Адамса про скелетную анимацию
не знаю даже, я за ~1.5 дня её писал, чутка погуглив
можно конечно извращаться типа дуал кватернионов, но под них и арт надо готовить специально итп
для самого скелета юзал обычные ноды сцены с иерархией, как и mr.DIMAS

Samodelkin 17.06.2014 16:01

Ответ: [TrueHorror] - разработка
 
Ну там не только скелетка, там еще рэгдолл, морфинг, лицевая анимация и еще всякие более общие штуки. Да после прочтения книги, нужно поискать более современные статьи, конкретно по реализации, т.к. то что в книге - устарело, но теория там ОК.

mr.DIMAS 18.06.2014 02:58

Ответ: [TrueHorror] - разработка
 
Бля. У меня бомбит пукан. Эта скелетка никак не получается. Вроде все правильно сделал - но нет блять - меш перекареживает просто пздц. В топку. Оставлю морфинг - рагдолл не нужен.

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

mr.DIMAS 18.06.2014 14:46

Ответ: [TrueHorror] - разработка
 
Вложений: 1
Я упертый\упоротый - вот все мои исходники скелетки.

Расчет вершин по скелету
Код:

if ( node->skinned )
  {
    int i = 0;

    for( auto meshIter = node->meshes.begin(); meshIter != node->meshes.end(); ++meshIter )
    {
      Mesh * mesh = *meshIter;

      vector< Vertex > temp = mesh->vertices;

      for( int i = 0; i < mesh->vertices.size(); i++ )
      {
        Vertex & vertex = mesh->vertices[ i ];
        Weight & weight = mesh->weights[ i ];

        btVector3 lastPosition = btVector3( vertex.coords.x, vertex.coords.y, vertex.coords.z );
        btVector3 newPosition = btVector3( 0, 0, 0 );

        for( int j = 0; j < weight.boneCount; j++ )
        {
          SceneNode * bone = weight.bones[ j ].node;

          newPosition += newPosition += bone->invBoneBindTransform * bone->globalTransform * lastPosition * weight.bones[ j ].weight;
        }

        vertex.coords.x = newPosition.x();
        vertex.coords.y = newPosition.y();
        vertex.coords.z = newPosition.z();
      }

      UpdateBuffers( mesh );

      mesh->vertices = temp;
    }
  }

Поиск костей и расчет их инверсных матриц.
Код:

  for( int i = 0; i < numMeshes; i++ )
  {
    SceneNode * node = scene->childs[ i ];

    node->invBoneBindTransform = CalculateGlobalTransform( node ).inverse();

    for( int k = 0; k < node->meshes.size(); k++ )
    {
      Mesh * mesh = node->meshes[ k ] ;

      for( int j = 0; j < mesh->weights.size(); j++ )
      {
        Weight & w = mesh->weights[ j ];

        for( int q = 0; q < w.boneCount; q++ )
        {
          w.bones[ q ].node = reinterpret_cast< SceneNode* >( FindByName( w.bones[q].name.c_str() ));
        }
      }
    }
  }

Расчет глобальной трансформации
Код:

btTransform & CalculateGlobalTransform( SceneNode * n )
{
  if( n->body )
    n->body->activate( true );

  if( n->parent )
  {
    if( n->parent->frozen )
    {
      n->globalTransform = CalculateGlobalTransform( n->parent ) * n->localTransform;

      if( n->body )
      {
        n->body->setWorldTransform( n->globalTransform );
        n->body->setLinearVelocity( btVector3( 0, 0, 0 ));
      }
    }
    else
    {
      if( n->body )
        n->globalTransform = n->body->getWorldTransform();
      else
        n->globalTransform = CalculateGlobalTransform( n->parent ) * n->localTransform;
    }
  }
  else
  {
    if( n->body )
      n->globalTransform = n->body->getWorldTransform();
    else
      n->globalTransform = n->localTransform;
  }

  return n->globalTransform;
}

И в аттаче пример работы этой хуиты.

[E] - анимировать объект

ABTOMAT 18.06.2014 16:57

Ответ: [TrueHorror] - разработка
 
Цитата:

Сообщение от mr.DIMAS (Сообщение 282998)
Бля. У меня бомбит пукан. Эта скелетка никак не получается. Вроде все правильно сделал - но нет блять - меш перекареживает просто пздц. В топку. Оставлю морфинг - рагдолл не нужен.

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

Да что там сложного? Берём позицию вершины в T-позе, умножаем её по очереди на инвертированные матрицы костей в порядке иерархии, умножаем на матрицу объекта (ЕМНИП). Вот, переводил как-то статью.

mr.DIMAS 18.06.2014 19:24

Ответ: [TrueHorror] - разработка
 
Цитата:

Берём позицию вершины в T-позе
Тоесть умножаем вершину на инвертированную матрицу кости нулевого кадра анимации?

Цитата:

умножаем её по очереди на инвертированные матрицы костей в порядке иерархии
А нельзя ли перемножить матрицы а затем сделать инверсию, или такая фигня не коммутативна?

̶В̶о̶о̶б̶щ̶е̶ ̶м̶н̶е̶ ̶н̶у̶ж̶н̶о̶ ̶п̶о̶н̶я̶т̶ь̶ ̶ч̶т̶о̶ ̶я̶ ̶д̶е̶л̶а̶ю̶ ̶и̶ ̶з̶а̶ч̶е̶м̶.̶ ̶П̶о̶к̶а̶ ̶ч̶т̶о̶ ̶я̶ ̶в̶о̶о̶б̶щ̶е̶ ̶н̶е̶ ̶д̶о̶г̶о̶н̶я̶ю̶ ̶ч̶е̶ ̶к̶ ̶ч̶е̶м̶у̶.̶ ̶П̶ж̶л̶с̶т̶а̶ ̶р̶а̶з̶ж̶у̶й̶т̶е̶ ̶в̶с̶ё̶.̶

mr.DIMAS 19.06.2014 00:18

Ответ: [TrueHorror] - разработка
 
̶Х̶м̶.̶ ̶М̶о̶ж̶е̶т̶ ̶д̶е̶л̶о̶ ̶в̶ ̶э̶к̶с̶п̶о̶р̶т̶е̶р̶е̶?̶ ̶Н̶а̶р̶о̶д̶ ̶с̶к̶и̶н̶ь̶т̶е̶ ̶с̶в̶о̶й̶ ̶с̶к̶р̶и̶п̶т̶ ̶д̶л̶я̶ ̶э̶к̶с̶п̶о̶р̶т̶а̶ ̶с̶к̶е̶л̶е̶т̶к̶и̶ ̶и̶з̶ ̶м̶а̶к̶с̶а̶.̶ ̶А̶ ̶т̶о̶ ̶я̶ ̶у̶ж̶ ̶и̶ ̶н̶е̶ ̶з̶н̶а̶ю̶ ̶н̶а̶ ̶ч̶т̶о̶ ̶г̶р̶е̶ш̶и̶т̶ь̶.̶

mr.DIMAS 19.06.2014 00:56

Ответ: [TrueHorror] - разработка
 
Ура! Все работает. Спасибо АВТЭ за напоминанеи про умножение на матрицу трансформации самого объекта.

В общем теперь продолжаю делать игру.

( сколько нервов извел просто из-за тупого нежелания понять как работает - просто гуглил готовое решение и ничего :facepalm: )

mr.DIMAS 19.06.2014 01:05

Ответ: [TrueHorror] - разработка
 
Вложений: 3
Теперь по самой игре.

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

Скриншоты прилагаются.

Mr_F_ 19.06.2014 03:24

Ответ: [TrueHorror] - разработка
 
вот это жестокий у тебя бамп

mr.DIMAS 20.06.2014 13:19

Ответ: [TrueHorror] - разработка
 
А на сколько рационально делать так

Код:

  IDirect3DVertexBuffer9 * vb;
  IDirect3DIndexBuffer9 * ib;

  vector<Vertex> vertices;
  vector<unsigned short> indices;

По факту получается удобнее держать копию вершин и индексов в легкодоступной форме( в std::vector ), но с другой стороны это двойной расход памяти. А если читать всё из буферов директа, то падает производительность. Как делают профи?

Mr_F_ 20.06.2014 13:30

Ответ: [TrueHorror] - разработка
 
Нужна геометрия на цпу - держишь копию на цпу.
Нужно её рендерить видяхой - держишь копию в дх буферах.

Samodelkin 20.06.2014 15:04

Ответ: [TrueHorror] - разработка
 
Цитата:

Сообщение от Mr_F_ (Сообщение 283149)
Нужна геометрия на цпу - держишь копию на цпу.
Нужно её рендерить видяхой - держишь копию в дх буферах.

Разве dx не создаёт в любом случае сразу две копии буфера?
Даже если указать её не редактируемость, в случае потери девайса dx данные из чего то восстанавливает, следовательно где то существует копия всех данных, которые должны быть в vram.
И разве Lock/Unlock будет давать больший оверхед, если изменяется только часть буфера, чем копировать ВСЕ данные из другого нового буфера (и всёравно делать Lock/Unlock)?
В доках написано, что если меняется только часть буфера, то по шине на карту будет передаваться только эта измененная часть.
По сути если ты что то читаешь из буфера, то читается из того что находится в раме, и производительность не падает.
Если ты что то записываешь, сначала это тоже записывается в буфер в раме, потом дх сравнивает с тем что в видеораме и только та часть буфера в которой есть изменения, передается в тот буфер который в видеораме.

Mr_F_ 20.06.2014 15:11

Ответ: [TrueHorror] - разработка
 
Цитата:

Разве dx не создаёт в любом случае сразу две копии буфера?
если POOL_DEFAULT, то нет, а managed да.

Цитата:

в случае потери девайса dx данные из чего то восстанавливает
с дефолт пулом надо самому

я не любитель просто хранить копию врамы в оперативке, оперативка ещё пригодится, и лостдевайсы обрабатывать тоже не фанат.
на дх10+ их и вовсе нет, на дх9 делаем borderless окно и не паримся.

Samodelkin 20.06.2014 15:41

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

Надо быстрей на дх11 переходить.
Там правда всё равно есть случаи когда надо реинициализировать.
Цитата:

* The graphics driver is upgraded.
* The system changes from a power-saving graphics adapter to a performance graphics adapter.
* The graphics device stops responding and is reset.
* A graphics adapter is physically attached or removed.
Вот второй пункт это о чем? Если я включу/выключу ноут из розетки, то устройство сброситься? Или это имеется ввиду что в сейвповер, он может работать на встроенном в цп гп, а в фуллповер, задействовать дискретную карту?

ABTOMAT 21.06.2014 02:24

Ответ: [TrueHorror] - разработка
 
Цитата:

Сообщение от mr.DIMAS (Сообщение 283074)
Ура! Все работает. Спасибо АВТЭ за напоминанеи про умножение на матрицу трансформации самого объекта.

В общем теперь продолжаю делать игру.

( сколько нервов извел просто из-за тупого нежелания понять как работает - просто гуглил готовое решение и ничего :facepalm: )

Давно не заходил в эту тему, иначе бы раньше ответил на вопросы (и скрипт тоже могу дать). Рад, что у тебя всё получилось!

mr.DIMAS 21.06.2014 02:58

Ответ: [TrueHorror] - разработка
 
Вложений: 1
Цитата:

и скрипт тоже могу дать
Предлагаю взаимный обмен. В аттаче мой скрипт.

Данные экспортируемые скриптом, движком напрямую не используются - сначала проходят через конвертер.

mr.DIMAS 31.08.2014 14:09

Ответ: [TrueHorror] - разработка
 
Продолжаю добавлять графоний.

Сделал FXAA. Просто и быстро - стырил шейдер отсюда . Но есть артефакты на изображении в виде замыленных черных точек( скрин ( png )).

FXAA применяю на финальную картинку после деферреда( или надо на диффуз только? ).

Откуда эти точки? Что я делаю не так?


Mr_F_ 31.08.2014 15:10

Ответ: [TrueHorror] - разработка
 
Случаем не пишешь в ту же текстуру, из которой читаешь?

mr.DIMAS 31.08.2014 15:13

Ответ: [TrueHorror] - разработка
 
Неа, создал отдельную текстуру. В нее рисую квады деферреда. Потом ставлю бэкбуфер в качестве рендертаргета и в него рисую квад с полученной текстурой с FXAA пиксельным шейдером.

Mr_F_ 01.09.2014 02:42

Ответ: [TrueHorror] - разработка
 
Вложений: 1
Хз, у меня работало. Может кривой шейдер скопировал? Прилагаю точно рабочий, не самой последней версии вроде, но можешь понять в шейдере трабла или в его использовании.

mr.DIMAS 01.09.2014 11:26

Ответ: [TrueHorror] - разработка
 
Нашел причину. Там, откуда брал шейдер чел написал - "чтобы втиснуть шейдер в ps_2_0 я заменил tex2Dlod на tex2D". Я собрал шейдер с ps_3_0 и поставил обратно tex2Dlod на место tex2D и всё, точки исчезли. А еще заметил что очень сильно на результат влияет тип фильтрации текстуры. Кароч такой вопрос - насколько неактуально использование шейдеров ниже 3 модели?

Mr_F_ 01.09.2014 12:37

Ответ: [TrueHorror] - разработка
 
Я бы не заморачивался по 2_0 сегодня.

mr.DIMAS 01.09.2014 12:54

Ответ: [TrueHorror] - разработка
 
Пока был на даче, программил только на мелком говне( EEE pc будь он не ладен ) с GMA 3150( программная обработка вершин, аппаратный пиксельный шейдер 2_0 ). Умудрился добиться от сего говна 14 фпс при 30к поликов и 10 источников света - деферред творит чудеса :-D

И да - там нет MRT. Пришлось три прохода делать - Гбуфер заполнять. К тому же не тащит флоат текстуры. Пришлось делать все текстуры A8R8G8B8 и паковать глубину в 4 байта.

И к тому же добавил Octree для статичной геометрии. В каждой ноде по 256 вершин. Хотя BSP было бы лучше.

Samodelkin 01.09.2014 15:00

Ответ: [TrueHorror] - разработка
 
Цитата:

Сообщение от mr.DIMAS (Сообщение 285871)
Кароч такой вопрос - насколько неактуально использование шейдеров ниже 3 модели?

Если планируешь мобильную экспансию, некоторые feature levels ограничены шейдерами 2.0.


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

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