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

Отключить рендеринг в игре


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

Привет! Копать в сторону хуков (перехвата функций), в частности - функций вывода картинки на экран. Условно, рисование происходит примерно таким образом: есть два буфера, один - сейчас на экране, на второй мы рисуем:

 

0. Нарисовать все на буфер1

1. Поменять местами буфер0 и буфер1

 

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

 

0. Нарисовать задний план

1. Нарисовать модели (игроков, врагов, здания и т.д.)

2. Нарисовать UI (здоровье игрока, патроны, оружие и т.д.)

3. Поменять местами буфер0 и буфер1

 

За это тоже есть ответственные функции, например, Direct3D9->DrawIndexedPrimitive.

 

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

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

12 minutes ago, Джонни said:

ясно. что посоветуешь посмотреть из уроков чтобы вникнуть в тему ?

Мои уроки или уроки @Coder, все есть тут в соответствующем разделе. И практиковаться, само собой.

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

14 hours ago, Джонни said:

keng как на счет платной помощи или обучения в этом вопросе?

с конечной реализацией в виде трейнера на С# например.

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

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

15 minutes ago, Джонни said:

может кого то посоветуешь ?

имеет ли смысл кинуть вопрос в ветку "Платные вопросы" ?

Могу посоветовать попробовать сначала сделать все самостоятельно.

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

Ок, почему бы нет.

Спасибо что помогаешь.

Тогда вопрос.

Почему бы в моем случае не выловить функцию d3ddev -> BeginScene и пропустить все что там рисуется (будет не плохая экономия ресурсов)

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

Потому что в случае с direct3d происходит примерно такая ситуация:

BeginScene(); // Захотели порисовать
...           // Рисуем
EndScene();   // Закончили рисовать
Present();    // Отобразили на экране

Если перехватить BeginScene, то ты нарисуешь что-то до всего игрового, если EndScene или Present - то после (поверх). Тебе же, как я понимаю, нужно отдельные вещи просто не рисовать, так что перехватывать нужно функции рисования (напр. DrawIndexedPrimitive), которые вызываются между BeginScene и EndScene.

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

по сути мне для эксперимента надо отключить весь вывод на экран графики.

И ничего своего не рисовать. Так что наверное перехват BeginScene с GoTo на EndScene будет самое оно. так ?

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

18 минуту назад, Джонни сказал:

Так что наверное перехват BeginScene с GoTo на EndScene будет самое оно. так ?

Нет, тебе надо перехватывать функций которые работают с 3D моделями и текстурами.

Найди у keng на сайте код, про хамелеон, может поможет.

 

P.S. и забуть ты про BeginScene, тебе надо только Present, EndScene, DrawIndexedPrimitive и функций которые работают с 3D моделями и текстурами.

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

36 minutes ago, 2zolo2 said:

Найди у keng на сайте код, про хамелеон, может поможет.

Или [вот]. А [вот] исходник хамелеона из [этой] статьи. SHA коммита - 789beea9c1fd675549c6b3c61d72d816e4d617ae.

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

  • 3 месяца спустя...

Тоесть достаточно перехватить DrawIndexedPrimitive и вместо нее подставить свою функцию которая ничего не делает?

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

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

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

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