Автор Тема: Рендер тени в Vice City  (Прочитано 19423 раз)

Оффлайн Prographer

  • Прохожий
  • *
  • Сообщений: 89
  • Репутация: +7/-0
  • Говнокодим, грабим, убиваем
    • Просмотр профиля
Re: Рендер тени в Vice City
« Ответ #30 : Апрель 16, 2015, 10:52:23 am »
Ну, MVL - это другая история. Там своя система рендера тени.
Просто тут дошли до момента
-> 0x4E042C call CCutsceneShadow::Create(RwObject *,int,bool,int,bool), поэтому я и хотел узнать, RwObject - это struct объекта или что, т.к. думал, как это реализовать через CLEO.
Но пока так и не вдуплил
По-моему, как раз и нет. Maxorator использовал стандартный метод создания тени, только немного его модифицировал.

Онлайн DK

  • Новичек
  • **
  • Сообщений: 226
  • Репутация: +318/-0
    • dk22pac
    • Просмотр профиля
Re: Рендер тени в Vice City
« Ответ #31 : Июль 19, 2015, 11:37:42 am »
Эти тени - примитивный шадоу-маппинг. Создается камера, позицинируется относительно педа, туда рендерится пед. Полученное изображение обрабатывается (вроде инвертируются цвета (так, чтобы образ педа стал белым, всё остальное - чёрное), блурится), далее рисуется почти так же, как стандартные проекции в игре (те, что под фонарями) - создается меш, который "стелят" по полигонам коллизии обьектов карты.
Пример реализации таких теней есть в примерах RenderWare Graphics, R* совсем немножко его переделали.
DK, можешь поподробнее рассказать о методах создания теней в играх? Какие методы наименее ресурсозатратны, а какие наоборот?

Если в общем - в современных играх, в тех же GTA4/5 используется одна из техник shadow-mapping'а.
Почитать можно тут:
http://steps3d.narod.ru/tutorials/shadow-map-tutorial.html
http://habrahabr.ru/post/226421/
В GTA SA используется стенсильные тени (для транспорта и обьектов).
http://www.gamedev.ru/code/articles/?id=4201
Ну и то, что используется в VC/SA для теней педов. Не знаю, есть ли какое-то определение для такого типа теней. В любом случае, этот метод довольно затратный, т.к. зависит от сложности геометрии сцены.
Если надо создавать тени для большой сцены (как в гта) - то однозначно надо использовать shadow mapping.
Если надо создать тени только для конкретных обьектов, можно использовать другие методы.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 507
  • Репутация: +46/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Рендер тени в Vice City
« Ответ #32 : Июль 22, 2015, 07:15:14 am »
Нашел небольшое улучшение по теням машин, тут 0x698E3C расстояние видимости тени, тут 0x698E58 квадрат этого расстояния


Оффлайн Prographer

  • Прохожий
  • *
  • Сообщений: 89
  • Репутация: +7/-0
  • Говнокодим, грабим, убиваем
    • Просмотр профиля
Re: Рендер тени в Vice City
« Ответ #33 : Июль 26, 2015, 10:43:47 am »
Меня всегда интересовал вопрос: почему тень следует за машиной не равномерно? То есть, если понемногу толкать машину в каком-то направлении, то тень будет оставаться на одном и том же месте.
« Последнее редактирование: Июль 26, 2015, 10:47:19 am от Prographer »

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 527
  • Репутация: +15/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Рендер тени в Vice City
« Ответ #34 : Апрель 17, 2016, 10:40:45 pm »
Другой важный вопрос(не помню, писал ли я здесь): как вернуть игроку управление во время катсцены?
Это точно возможно, но мне пока это не удалось(все скриптовые методы перепробовал), хотя есть зацепка: вот тут чувака(я связался с ним, и он рассказал) арестовали во время катсцены, он зареспавнился, и управление к нему вернулось!
Т.е., ключ к полному возвращению управления игроку лежит в респауне игрока после ареста(и возможно - смерти), но я за несколько лет так и не смог разобрать это.
Если получится вернуть управление игроку, то открываются просто безграничные возможности в визуализации миссий/фриплея.
Пока удаётся сделать лишь уныленькую "эмуляцию" управления, а хотелось бы полноценный контроль над игроком.

Онлайн DK

  • Новичек
  • **
  • Сообщений: 226
  • Репутация: +318/-0
    • dk22pac
    • Просмотр профиля
Re: Рендер тени в Vice City
« Ответ #35 : Апрель 24, 2016, 03:56:21 pm »
С использованием плагина rwd3d9, можно было бы прикрутить shadow mapping к VC.
Всё же тени только от педов и транспорта - это не так круто, как тени от всего - зданий, мостов, мелких обьектов и т.д. Игра бы совсем по-другому выглядела бы)
Но для этого нужно будет переписывать функции рендеринга стандартных обьектов rw (skin, который рендерит педов; matfx, через который рендерятся обьекты с отражением вроде транспорта; и default, через который рендерится всё остальное). Задача не очень сложная.
А вот подобрать нормальный алгоритм shadow маппинга и правильно реализовать его будет сложнее.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 527
  • Репутация: +15/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Рендер тени в Vice City
« Ответ #36 : Апрель 24, 2016, 05:27:14 pm »
Многое бы отдал за динамические тени на объектах в VC....
А то пока приходится "запекать" унылые статичные недо-тени...
Вообще, очень жду новых плагинов на основе rwd3d9, добавляющие в Вайс нормалмапы, тени и прочие "плюшки" :D
« Последнее редактирование: Апрель 24, 2016, 05:30:45 pm от Shaggy »

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 507
  • Репутация: +46/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Рендер тени в Vice City
« Ответ #37 : Апрель 25, 2016, 07:42:28 am »
К теням объектов хорошо бы восстановить еще освещение от времени суток, как на транспорте и актерах.



Как бы его перенести на остальные объекты, чтобы не делать разный прелайт каждой стороны. Для зданий это еще как-то терпимо, а вот для более детализированных вещей результат печальный



Онлайн DK

  • Новичек
  • **
  • Сообщений: 226
  • Репутация: +318/-0
    • dk22pac
    • Просмотр профиля
Re: Рендер тени в Vice City
« Ответ #38 : Апрель 25, 2016, 06:42:02 pm »
xanser, надо, чтобы у геометрии были нормали и включен флаг динамического освещения.
Вроде в скриптах Кама за это отвечает кнопка Nrm (или Еxport Normals).
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 527
  • Репутация: +15/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Рендер тени в Vice City
« Ответ #39 : Апрель 26, 2016, 03:32:31 am »
включен флаг динамического освещения.
Про нормали понял, а про флаг - нет. Если я правильно понял, и речь идет о флаге 32 в ide - то это не работает:(

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 507
  • Репутация: +46/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Рендер тени в Vice City
« Ответ #40 : Апрель 26, 2016, 04:10:15 am »
Хотелось бы рабочий пример

Онлайн DK

  • Новичек
  • **
  • Сообщений: 226
  • Репутация: +318/-0
    • dk22pac
    • Просмотр профиля
Re: Рендер тени в Vice City
« Ответ #41 : Апрель 26, 2016, 06:41:33 pm »
Shaggy, у геометрии есть флаг rpGEOMETRYLIGHT. Возможно, достаточно только наличия нормалей.
xanser, может в вайсе есть обьекты с динамическим освещением. Столбы или коробки какие-то. Если нет - тогда в SA глянуть.

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

0x660B20 RpLightCreate(LightType) - создание источника света RenderWare
0x57FF50 LightsCreate(World) - создание глобальных источников света игры
В игре есть 2 глобальных источников. Первый - это ambient light, "фоновый" равномерный свет. У него нету позиции и напралвения. Вся сцена освещается равномерно, в зависимости от интенсивности и цвета источника.
Второй - directional light, направленный свет ("рассеиваемый"). У него нету позиции, но есть направление. Грубо говоря - это игровое солнце. Именно этот источник осветляет транспорт и педов.
Как рассчитывается освещение? Очень просто - к ambient - составляющей добавляется diffuse.
0x974B44 RpLight *pRpAmbientLight - указатель на глобальный ambient источник света
0x94DD40 RpLight *pRpDirectionalLight - указатель на глобальный directional источник света (игровое солнце для транспорта и педов)
По ссылкам на эти переменные можно найти функции включения/отключения этих источников света.
0x57FB50 ActivateDirectional() - включение направленного света ("солнца")
0x57FB60 DeActivateDirectional() - отключение направленного света ("солнца")
Дальше смотрим ссылки на эти функции.

Тут сразу делаем заметку - динамик освещение нельзя применить на статике (если мы рассматриваем только стандартное освещение движка и игры, без каких-либо модификаций). Только транспорт (CVehicle), педы (CPed), обьекты катсцены (CCutsceneObject) и динамик обьекты (CObject) (в SA они определяются в файле objects.dat). Статика в GTA - это классы CBuilding (здания) и CTreadable (дороги).
Итак, освещение для игровых обьектов настраивается в методе SetupLighting() этих обектов.
Ну а дальше надо рассматривать условия, при которых включается направленный свет. Увы, сейчас под рукой нету документации по флагам CEntity и CObject в VC, может позже найду и продолжу.
« Последнее редактирование: Апрель 26, 2016, 08:16:45 pm от DK »
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 507
  • Репутация: +46/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Рендер тени в Vice City
« Ответ #42 : Апрель 27, 2016, 04:17:28 am »
Спасибо за подробное объяснение, надо это дожать до конца, вроде задача простая - научить игру делать то, что она уже умеет на машинах и педах. Еще интересно, как это будет сочетаться с прелайтом, будет ли он игнорироваться или начнет комбинировать освещение, стандартный вайс должен стать заметно лучше.

Я нашел 4 столба с тенью, но динамического освещения они не имеют, только прелайт: 351 lamppost3, 417 lamppost2, 425 lamppost1, 426 doublestreetlght1.

Попробовал пойти простым путем, заменил все ссылки на функцию CObject::SetupLighting на CVehicle::SetupLighting и объекты стали освещаться как машины, только объекты должны присутствовать в object.dat. То же самое получилось, если присвоить флаг, как писал DK, ((CObject*)Entity)->flags16E.DirectionalLight = 1;



Есть и свои минусы конечно, ночью одна сторона слишком светлая как и у машин, но это решаемо, где-то попадался уровень интенсивности ambient для машин и педов, освещение идет непонятно откуда, если от луны, то надо переносить ее на другую сторону неба. Также проявился минус с лампами, когда камера попадает в зону лампы, то засвечивается весь объект. Угол освещения тоже меняется, вместо пола освещается боковая поверхность. Также на таких объектах перестает работать определение z-ground, т.е. высоту крыши уже вычислить не может, пропадает защита от дождя. Еще один минус - лимит динамических объектов в кадре, подсвеченные начинают исчезать. Вывод - лучше переносить освещение на CBuilding.

« Последнее редактирование: Апрель 28, 2016, 05:22:37 am от xanser »

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 527
  • Репутация: +15/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Рендер тени в Vice City
« Ответ #43 : Апрель 27, 2016, 06:21:28 pm »
ОФИГЕТЬ)
Цитировать
уровень интенсивности ambient для машин и педов
В timecyc.dat параметр Amb_Obj отвечает за амбиент динамических объектов(педы, авто, динамические объекты из object.dat и объекты катсцен), а Dir - это как раз цвет "освещения". Т.е. ночью Dir можно сравнять с Amb_Obj, и объект не будет "освещаться" вообще, т.е. ночью Amb_Obj отвечает за тёмную сторону объекта, а Dir - за светлую.

А z-ground не работает у всех динамических объектов(из object.dat).

Не смотря на все "минусы", хотелось бы опробовать готовое решение в asi, ибо я не смогу сделать этого :(

P.S. А нельзя таким же методом "заменил все ссылки на функцию" провернуть фишку с тенями педов, присвоив им тени Cutscene персов?

Оффлайн Prographer

  • Прохожий
  • *
  • Сообщений: 89
  • Репутация: +7/-0
  • Говнокодим, грабим, убиваем
    • Просмотр профиля
Re: Рендер тени в Vice City
« Ответ #44 : Апрель 27, 2016, 07:30:17 pm »
Дабы продолжить тему, решил написать небольшой плагин, с помощью которого вы сможете изменять силу окружающего освещения одной функцией SetAmbient(float). Кому, может быть, пригодится.
https://yadi.sk/d/PFzlrRnurLcZn