Перейти к содержанию

Рисование объектов внутри игры/поиск вызовов DrawIndexed


Рекомендуемые сообщения

Приветствую, дорогие форумчане!

 

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

 

Вроде ничего сложного, алгоритм таков:

ищем подходящий drawindexed вызов директа и сразу после него применяет изложенную мною выше цепочку действий. С этим я справлюсь. И тут 2 вопроса:

1) Все ли верно? то есть действительно получится все так просто, как я и описал? можно ли так нарисовать объемную 3d модель?

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

 

Спасибо за помощь)

Ссылка на комментарий
Поделиться на другие сайты

В 21.10.2019 в 21:12, Fleynaro сказал:

1) Все ли верно? то есть действительно получится все так просто, как я и описал? можно ли так нарисовать объемную 3d модель?

Получится, но чтобы не парится с поиском можно хукнуть функции BeginScene(начало отрисовки) или EndScene(конец отрисовки) и между ними рисовать как в своем приложении, но для начала тебе нужно получить директикс девайс процесса, так как девайс может быть только один на процесс, на пример хукнув функцию CreateDevice.

Адреса не экспортируемых функций директикса можно получить просто создам свое приложение которое будет юзать твою функцию директ икса, в девятом диретк иксе на пример CreateDevice == Direct3DCreate9Ex + 0x16139,  EndScene == Direct3DCreate9Ex + 0x15ACA

 

Но на счет перекрывания не уверен, но скорее всего тебе понадобятся матрици как минимум мировая

И это если твое приложение использует сугубо функции директ икса, если же какой то движок то все гораздо сложнее

Изменено пользователем DaVilka
Ссылка на комментарий
Поделиться на другие сайты

В 23.10.2019 в 00:26, DaVilka сказал:

Получится, но чтобы не парится с поиском можно хукнуть функции BeginScene(начало отрисовки) или EndScene(конец отрисовки) и между ними рисовать как в своем приложении, но для начала тебе нужно получить директикс девайс процесса, так как девайс может быть только один на процесс, на пример хукнув функцию CreateDevice.

Адреса не экспортируемых функций директикса можно получить просто создам свое приложение которое будет юзать твою функцию директ икса, в девятом диретк иксе на пример CreateDevice == Direct3DCreate9Ex + 0x16139,  EndScene == Direct3DCreate9Ex + 0x15ACA

 

Но на счет перекрывания не уверен, но скорее всего тебе понадобятся матрици как минимум мировая

И это если твое приложение использует сугубо функции директ икса, если же какой то движок то все гораздо сложнее

 

Спасибо за ответ. Я был почти уверен, что проблем с этим не возникнет(вопрос номер 1).

 

Остается самый главный вопрос - номер 2. Как например найти отрисовку в игре например интерфейсов или же конкретных объектов, например транспорта или педов. Очевидно, что нужно найти адрес вызова функции drawIndexed(мы говорим в контексте directx 11 API), который отрисовывает эти объекты. Графические дебаггеры предоставляют возможность поэтапно отследить отрисовку и показывают список всех drawindexed, но вот беда - не показывают(я только пока про интеловский дебаггер) адрес вызова этих функций(call stack). Мне например надо как минимум убрать отрисовку некоторых объектов в игре и мне надо знать, где находятся drawindexed, которые ее производят.

Изменено пользователем Fleynaro
уточнения
Ссылка на комментарий
Поделиться на другие сайты

В 24.10.2019 в 16:58, Fleynaro сказал:

где находятся drawindexed

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

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.