当挂钩的应用程序绘制到屏幕时,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_MODELVIEW
、GL_PROJECTION
和GL_TEXTURE
.
如果要在 "hook" 中绘制纹理,则还必须初始化纹理矩阵堆栈。
我已经设置了一个 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_MODELVIEW
、GL_PROJECTION
和GL_TEXTURE
.
如果要在 "hook" 中绘制纹理,则还必须初始化纹理矩阵堆栈。