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

Оффлайн DK

  • Новичек
  • **
  • Сообщений: 221
  • Репутация: +312/-0
    • dk22pac
    • Просмотр профиля
Re: Рендер тени в Vice City
« Ответ #75 : Май 11, 2016, 07:52:00 pm »
Короче, рассказываю коротко:
Помимо глобальных ambient и directional (солнце) источников, в GTA есть ещё 6 слотов для динамических directional источников. В игре они называются pointlights (точечные источники света - т.е. источники, которые освещают только определённую часть сцены, имеют такие параметры, как: позиция, радиус, цвет).
Но на уровне движка (RenderWare) это всё равно направленный свет. Отсюда и проблема с освещением всей стороны обьекта, полностью.
Итак, когда игра рендерит обьект, идёт проверка - находится ли обьект в зоне действия этих источников света (просто сверяется расстояние от центра обьекта до позиции pointlight'а).
Если обьект в радиусе - создается направленный свет (в одном из 6 слотов), его направление - от позиции источника до центра обьекта.

Красными линиями выделены области (стороны обьектов), которые будут освещены.
Помимо directional источника движка, также создаются корона и проекция (меш с текстурой shad_exp, построенный на основе моделей коллизии расположенных рядом обьектов).
Примеры таких источников (в VC):
Свет пикапа
Огни светофора
2dfx
Вспышки огня
Фары траснспорта
Вспышка при взрыве
Выстерл оружия
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

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

Оффлайн DimZet13

  • Призрак
  • Сообщений: 3
  • Репутация: +0/-0
    • Просмотр профиля
    • dimzet13.3dn.ru
Re: Рендер тени в Vice City
« Ответ #76 : Май 11, 2016, 07:58:11 pm »
Не в первый раз путаю nfx.
2)Скорее потому что в 2dfx(и т.п.) адрес радиуса поиска объекта такой же как и у радиуса света.
Вот если бы сделать так чтобы адрес поиска объекта был безлимитным или равен хотя бы 300.0 то было бы норм.
В общем косяк таков: Если камера за пределами радиуса света 2dfx, то объект или пед в радиусе света не освещается никогда.
3)Ну не знаю как вайсе, но в гта3 сколько бы небыло полигонов у плоскости, то освещаться будет как один большой полигон.
И если полигон в радиусе света, а другой за пределами, то они оба освещаются одинаково.

Еще косяк такой что когда объект за стеной, то все равно освещается солнцем. Есть возможность сделать тени как в СА? Я конечно понимаю что для этого потребуется модификация коллизии.
Заметил что все тени и карты освещения(shad_exp) ложаться на коллизию с некоторым расстоянием, что выглядит убого. Я убирал это расстояние, но это выглядит норм только на точной коллизии. Что если сделать чтобы тени ложились на модели?
Я слышал что ты делаешь d3d9 для вайса. То есть карту освещения можно будет сделать как освещение(как фонарик в HL2), а не как сейчас тупо повышение яркости.
Еще было бы прикольно сделать отражение от 2dfx на воде.

Короче я могу так продолжать бесконечно. Ты ведь сейчас норм. шариш во всем этом. Я хотел бы поблагодарить тебя за большой вклад в моддинг гта.

Оффлайн DimZet13

  • Призрак
  • Сообщений: 3
  • Репутация: +0/-0
    • Просмотр профиля
    • dimzet13.3dn.ru
Re: Рендер тени в Vice City
« Ответ #77 : Май 11, 2016, 08:09:43 pm »
По тем косякам я не хочу сказать что это баг или что то типа того. Я просто хочу сказать что это не нормально и хотелось бы это улучшить.
По твоему рисунку:
Вот проблема в том что вся эта система не работает пока камера не будет в "источнике". И то что у объекта 3 обе стороны освещаются.

Оффлайн DK

  • Новичек
  • **
  • Сообщений: 221
  • Репутация: +312/-0
    • dk22pac
    • Просмотр профиля
Re: Рендер тени в Vice City
« Ответ #78 : Май 16, 2016, 05:53:50 pm »
Сложно будет улучшить это.
Наверное, лучше пытаться сделать шейдерное освещение.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

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

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 509
  • Репутация: +14/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Рендер тени в Vice City
« Ответ #79 : Май 16, 2016, 11:08:51 pm »
У меня предложение для глобальных модостроителей, пересохранить стандартную карту вайса, и посмотреть, каким он станет с таким освещением, видимо изначально нормали не включены, наверное должно получиться интересно.

Для этого надо, чтобы DK выпустил мод в открытый доступ, и тогда кто-нибудь точно это запилит, как это было с мип-мапами.

UPD:
Еще пару дней назад пришла мысль, что создание динамических теней для катсценовых персонажей(о чем писалось ранее), т.е. вот это
Код: ASM
  1.     0x4562FC @@opcode_02E5
  2.              -> 0x45630F call CCutsceneMgr::CreateCutsceneObject(int)
  3.                               -> 0x4068FD call CCutsceneObject::CreateShadow(void)
  4.                                                -> 0x4E042C call CCutsceneShadow::Create(RwObject *,int,bool,int,bool)
можно применить на обычных персонажах так же, как DK применил создание динамического освещения на всех объектах. Т.е. подменить адрес функции создания тени для обычного игрового персонажа. Но я не нашел адрес этой функции...
« Последнее редактирование: Май 17, 2016, 01:48:56 am от Shaggy »

Оффлайн xanser

  • Главный Модератор
  • Опытный
  • *****
  • Сообщений: 498
  • Репутация: +43/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Рендер тени в Vice City
« Ответ #80 : Май 17, 2016, 04:49:44 am »
Shaggy все мечтаешь про тени, я бы тоже хотел хотя бы посмотреть, как оно выглядит вживую, но не умею запускать катсцены рядом с игроком, чтобы рассмотреть тень. С освещением проще, там все модели по одному принципу можно осветить, не понятно почему R* отключили это, или из-за недостаточной производительности, или не хватало контраста между машинами, педами и окружающим миром.
А вот с тенями, которые ты предлагаешь, проверки завязаны на флагах и функциях, которые принадлежат только классу СCutsceneObject, а тут надо переносить это на объекты классов CPed, CVehicle, у которых нету соответствующих свойств, ну может быть на общий для всех CEntity внутри которого есть RwObject, который возможно подойдет к CCutsceneShadow::Create(RwObject *,int,bool,int,bool), если это оно.

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

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 509
  • Репутация: +14/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Рендер тени в Vice City
« Ответ #81 : Май 19, 2016, 05:51:32 am »
Катсцену-то запускать не сложно - там лишь пару нюансов нужно учитывать:
load_special_actor 1 'dance' // Обязательно загрузить ВСЕ действующие лица катсцены(IFP), даже если в дальнейшем будут использованы не все.
// Имя модели должно совпадать с именем анимации в ifp
// Если загружать актера под числами 1-11, то тень у него будет, если - 12-21 её нет
// Тень будет, даже если взять для катсцены любого IG педа, т.е. совершенно не зависит от модели - главное - чтобы были кости.
load_requested_models

:RUNCUT_03
wait 0
if
023D:   special_actor 1 loaded
jf @RUNCUT_03
04C4: create_coordinate 1@ 2@ 3@ from_actor $PLAYER_ACTOR offset 1.0 2.0 -1.0
02E4: load_cutscene_data 'csdance' // Загружаем катсцену с именем "csdance"(имя ifp и dat файла).
// У катсцен с неоригинальными именами не будет звука, даже если добавить mp3 с соответствующим названием
// Нельзя просто так взять любую катсцену и переименовать в желаемую. Необходимо, чтобы в ifp файле внутри(HEX оффсет 14) было то же название, что и у самого ifp файла.
// Т.е., если ifp файл называется "OLOLO", а внутри написано название "TROLOLO" - игра вылетит.
// Короче - никаких проблем не будет, если ifp файл с нуля создан в IFP-ANPK-TOOL, либо - если не менять старое название катсцены.
0244: set_cutscene_pos 1@ 2@ 3@ // Центр катсцены
02E5: 0@ = create_cutscene_object #SPECIAL01 // Создание катсценового объекта. Тут же присваивается реалтаймовая тень, но ТОЛЬКО если у объекта есть кости.
04BC: (unknown) 'dance' // Бесконечное воспроизведение анимации в цикле(не обязательно)
02E6: set_cutscene_anim 0@ 'dance' // применение анимации на объекте
02E7: start_cutscene
wait 0 // Задержка, чтобы успела создасться камера катсцены
02A3: enable_widescreen 0
Camera.SetBehindPlayer
015A: restore_camera // возвращаем камеру, чтобы не наблюдать катсценовую


Проблема в том, что камерой не помотаешь и управление игроку не вернешь - даже так:
Player.CanMove($PLAYER_CHAR) = True // что я только не пробовал - управление игроку не удается вернуть
03BF: set_player $PLAYER_CHAR ignored_by_everyone_to 0 // что я только не пробовал - управление игроку не удается вернуть
Нужно либо писать скрипт на управление игроком/камерой, либо хз что.

В аттаче CLEO скрипт с примером запуска/выключения катсцены на кнопки R+C, а также нужные файлы.
« Последнее редактирование: Май 19, 2016, 05:56:09 am от Shaggy »

Оффлайн xanser

  • Главный Модератор
  • Опытный
  • *****
  • Сообщений: 498
  • Репутация: +43/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Рендер тени в Vice City
« Ответ #82 : Май 19, 2016, 11:37:35 am »
Спасибо за код, вполне пригодная тень. Вот сделал еще видео, чтобы остальные вдохновились

! GTA VC cutscene shadow
« Последнее редактирование: Июнь 08, 2016, 04:15:37 am от xanser »

Оффлайн ilufir

  • Прохожий
  • *
  • Сообщений: 69
  • Репутация: +1/-0
  • Я пытался
    • Просмотр профиля
Re: Рендер тени в Vice City
« Ответ #83 : Май 21, 2016, 06:17:12 pm »
Ребят, я это освещение сделал еще в прошлом году и для гта3 и для вайса.
Не получилось только исправить такие косяки:
-объект освещается когда объект и камера игрока в радиусе 2nfx
-объект освещается полигонно, а не повекторно. То есть полностью. К примеру много-полигоная плоскость освещается полностью, а не в центре 2nfx на плоскости.
1) Не 2nfx, а 2dfx (типо 2д-эффект)
2) Возможно, из-за того, что в игре есть лимиты на кол-во корон/проекций/источников
3) Я об этом говорил. Это повершинное освещение (альтернатива - попиксельное). Оно хорошо работает только на очень детализированной сетке.
Поэтому если хочется нормального освещения - о стандартном лучше вообще забыть.
Я позже напишу небольшой пример/тутор по подключению шейдеров в игре.
Сделать базовое освещение на шейдерах довольно просто. Есть сотни примеров на любой вкус. Сделать какое-то ограничение на кол-во источников.
Но если захочется чего-нибудь крутого, например такого (куча источников в сцене), то нужно будет много чего менять в коде движка и игры.

UPD Хотя, проблема с тем, что от источников освещается вся сторона обьекта - связана с тем, что точечные источники в гта - не совсем точечные.
Может позже с картинками покажу что и как, т.к. одними словами будет трудно обьяснить.

Можно же просчитывать освещение от дальности источника и его яркости, типа если источник слишком далеко и его свет не достает до объекта - не просчитывать, да?

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 509
  • Репутация: +14/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Рендер тени в Vice City
« Ответ #84 : Июнь 08, 2016, 12:46:05 am »
Проблема в том, что камерой не помотаешь и управление игроку не вернешь

Вопрос решен(спасибо DK!) - нужно занопить 16 байт по адресу 0x40703E, т.е. в CLEO так:
0A8C: write_memory 0x40703E size 4 value 0x90909090 virtual_protect 0
0A8C: write_memory 0x407042 size 4 value 0x90909090 virtual_protect 0
0A8C: write_memory 0x407046 size 4 value 0x90909090 virtual_protect 0
0A8C: write_memory 0x40704A size 4 value 0x90909090 virtual_protect 0
Нопить нужно до вызова катсцены. Можно проверить всё на примере, что я скидывал парой сообщений назад. Нопить нужно лишь раз - при дальнейших запусках катсцен всё будет уже в порядке.
Таким небольшим кодом открылись просто безграничные возможности по анимированию огромных динамических сцен с интегрированным геймплеем, как в недавней игре Quantum Break.
« Последнее редактирование: Июнь 08, 2016, 12:51:22 am от Shaggy »

Оффлайн Tommi4kaVar4etti

  • Прохожий
  • *
  • Сообщений: 55
  • Репутация: +0/-0
    • Просмотр профиля
Re: Рендер тени в Vice City
« Ответ #85 : Июнь 10, 2016, 12:15:08 am »
У меня SB ругается на твой код, говорит, опкод не тот, да и с nopами тоже проблемы. + твои модели и твоя анимация загадили мне всю игру, после установки моделей и анимаций у меня начинают крашить анимки оружия.
« Последнее редактирование: Июнь 10, 2016, 12:34:23 am от Tommi4kaVar4etti »

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 509
  • Репутация: +14/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Рендер тени в Vice City
« Ответ #86 : Июнь 10, 2016, 09:13:04 am »
Этот код для US 1.0, для CLEO 2.0.0.4, а в старом CLEO нужно заменить опкоды 0A8C на 05DF.
Про краши хз - то, что в архиве с катсценой никак не затрагивает остальную игру...
Хз короч, но у xanser-а же запустилось... :-\

Оффлайн mfisto

  • Скриптер
  • Главный Модератор
  • Новичек
  • *****
  • Сообщений: 174
  • Репутация: +19/-0
  • Не пью, не курю, за компьютером сижу...
    • mfistof
    • Просмотр профиля
    • Empire of CJ
Re: Рендер тени в Vice City
« Ответ #87 : Июнь 10, 2016, 01:41:38 pm »
Поставь virtual protect 1
I know everything and nothing...

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 509
  • Репутация: +14/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Рендер тени в Vice City
« Ответ #88 : Июнь 11, 2016, 10:43:00 am »
Апдейт(чтобы добить тему возвращения управления в катсценах): чтобы вернуть возможность заходить в меню во время катсцены(когда мы уже вернули управление методом, описанным выше), нужно выставить 0 по адресу 0xA10B63, т.е.
0A8C: write_memory 0xA10B63 size 1 value 0 virtual_protect 1Применять ПОСЛЕ запуска катсцены, МИНИМУМ через 0ms после оного. После каждого отключения катсцены(а вернее - при каждом новом запуске) значение нужно выставлять заного.
Почему бы не заблочить адрес в этом значении навсегда(или занопить его изменение)?
Ответ: в этом случае катсцены будут некорректно запускаться, так что лучше этого не делать, и менять значение каждый раз после запуска катсцены.
Таким образом, можно спокойно лазить по меню во время проигрывания катсцены(если разморозить(0) мир по адресу 0xA10B36). Скоро это появится в Main Menu Scene :D
« Последнее редактирование: Июнь 11, 2016, 10:46:27 am от Shaggy »

Оффлайн Lacrix84

  • Призрак
  • Сообщений: 5
  • Репутация: +0/-0
    • Просмотр профиля
Re: Рендер тени в Vice City
« Ответ #89 : Сентябрь 19, 2016, 10:14:10 am »
А каким образом тень Томми была реализована в MVL? Можно ли по аналогии перенести ее на всех остальных педов? Кто-нибудь разбирался?