当挂钩的应用程序绘制到屏幕时,Opengl 挂钩渲染不会呈现在视图中

Opengl hook rendering does not render in view when hooked application draws to screen

我已经设置了一个 dll 注入来挂钩 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);

// 绘制

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 函数。

如果我注释掉我的游戏绘制调用,hook draw 效果很好,我会在我的游戏上渲染一个红色的半透明屏幕对齐四边形(因为所有绘制都被注释掉,游戏实际上是黑色 canvas,现在深红色覆盖了我的四边形。

不幸的是,当我重新打开游戏时,我的屏幕对齐四边形不再呈现???我可以将 glClear 设置为清除颜色缓冲区并且正确发生,因此挂钩正在工作并且 opengl 正在接受来自挂钩的命令。

我想我在游戏中有一些流氓状态影响了挂钩函数中的绘制。也许 viewport/camera 或一些绑定数据对于我的钩子测试不需要存在。

将不胜感激任何帮助或指点。

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_MODELVIEWGL_PROJECTIONGL_TEXTURE.
如果要在 "hook" 中绘制纹理,则还必须初始化纹理矩阵堆栈。