Визуализация с помощью OpenGL не отображается, когда подключенное приложение рисует на экране - PullRequest
0 голосов
/ 25 мая 2018

Я установил инъекцию dll для перехвата swapbuffers в gdi32.dll.

Инжекция работает отлично и запускает мою функцию hook_swapbuffers ().

Я хочу, чтобы hook_swapbuffers поместил оверлей (сейчас красный полупрозрачный квад) поверх процесса жертвы - в данном случае игра на основе opengl.

hook_swapbuffers () вызывает следующее:

// инициализирует состояния gl

glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClearDepth(1.0f);
glDisable(GL_DEPTH_TEST);
glDepthFunc(GL_ALWAYS);
glShadeModel(GL_SMOOTH);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
glDisable(GL_TEXTURE_2D);

// Draw

glClear( GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

glPushMatrix(); // store current matrix settings
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

// set the limits of our ortho projection
glOrtho(-1.0, 1.0, -1.0, 1.0, 0.1, 100);

glBegin(GL_QUADS);

glColor4f(1.0f, 0.0f, 0.0f, 0.5f);     // Red

glVertex3f(1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, -1.0f, 1.0f);
glVertex3f(1.0f, -1.0f, 1.0f);

glEnd();

glPopMatrix(); // restore original matrix

// Очистка состояний gl

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);

Затем вызывается обычная функция SwapBuffers.

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

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

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

Любая помощь или указатели будут очень получены.

1 Ответ

0 голосов
/ 29 мая 2018

В hook_swapbuffers стек матрицы проекций установлен правильно, но инициализация стека матрицы вида модели отсутствует.Таким образом, матрица представления модели может иметь любое состояние, оставшееся от предыдущего рендеринга.Это приводит к произвольным результатам в следующем:

Нажмите init и вытолкните стек матрицы представления модели, как вы делаете это со стеком матрицы проекции:

glClear( GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

glPushMatrix();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

// set the limits of our ortho projection
glOrtho(-1.0, 1.0, -1.0, 1.0, 0.1, 100);

glPushMatrix();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

....

// glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glMatrixMode(GL_PROJECTION); 
glPopMatrix();

Обратите внимание, что в OpenGL есть одна матрицастек для каждого режима матрицы (см. glMatrixMode).Режимы матрицы: GL_MODELVIEW, GL_PROJECTION и GL_TEXTURE.Если вы нарисуете текстуру в «крючке», вам также придется инициализировать стек матрицы текстур.

...