我想在3D桌面遊戲中繪製一個自定義的opengl覆蓋圖(例如蒸汽)。 這個覆蓋層應該基本上能夠顯示一些變量的狀態,用戶可以通過按下一些鍵來影響這些變量。想想它就像一個遊戲教練。 目標是首先在屏幕上的特定點繪製幾個基元。後來我想在遊戲窗口中看到一個漂亮的「gui」組件。 遊戲使用GDI32.dll中的「SwapBuffers」方法。 目前我能夠注入一個自定義DLL文件到遊戲中並掛鉤「SwapBuffers」方法。 我的第一個想法是將覆蓋圖的圖形插入到該函數中。這可以通過從遊戲到2D切換3D繪圖方式來完成,然後在屏幕上繪製的2D覆蓋,並再次打開它,像這樣:dll注入:用opengl繪製簡單的遊戲覆蓋圖
//SwapBuffers_HOOK (HDC)
glPushMatrix();
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glOrtho(0.0, 640, 480, 0.0, 1.0, -1.0);
//"OVERLAY"
glBegin(GL_QUADS);
glColor3f(1.0f, 1.0f, 1.0f);
glVertex2f(0, 0);
glVertex2f(0.5f, 0);
glVertex2f(0.5f, 0.5f);
glVertex2f(0.0f, 0.5f);
glEnd();
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
SwapBuffers_OLD(HDC);
不過,這並沒有對任何影響遊戲。
- 我的方法是否正確合理(同時考慮我的3d到2d切換代碼)?
- 我想知道什麼最好的方法是設計和顯示自定義覆蓋在鉤功能。 (我應該使用類似Windows窗體或者我應該組裝我的組件與OpenGL函數 - 線條,四邊形 ...?)
- 是在SwapBuffers方法來繪製覆蓋我的最好的地方?
任何提示,源代碼或教程類似的東西也讚賞。 遊戲的方式是反擊1.6,我不打算在網上作弊。
謝謝。
編輯:
我可以管理由所提議的「derHass」採用了全新的OpenGL上下文得出一個簡單的矩形進入遊戲的窗口。下面是我所做的:
//1. At the beginning of the hooked gdiSwapBuffers(HDC hdc) method save the old context
GLboolean gdiSwapBuffersHOOKED(HDC hdc) {
HGLRC oldContext = wglGetCurrentContext();
//2. If the new context has not been already created - create it
//(we need the "hdc" parameter for the current window, so the initialition
//process is happening in this method - anyone has a better solution?)
//Then set the new context to the current one.
if (!contextCreated) {
thisContext = wglCreateContext(hdc);
wglMakeCurrent(hdc, thisContext);
initContext();
}
else {
wglMakeCurrent(hdc, thisContext);
}
//Draw the quad in the new context and switch back to the old one.
drawContext();
wglMakeCurrent(hdc, oldContext);
return gdiSwapBuffersOLD(hdc);
}
GLvoid drawContext() {
glColor3f(1.0f, 0, 0);
glBegin(GL_QUADS);
glVertex2f(0,190.0f);
glVertex2f(100.0f, 190.0f);
glVertex2f(100.0f,290.0f);
glVertex2f(0, 290.0f);
glEnd();
}
GLvoid initContext() {
contextCreated = true;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, 640, 480, 0.0, 1.0, -1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClearColor(0, 0, 0, 1.0);
}
下面是結果: cs overlay example 它仍然是非常簡單的,但我會盡量等添加一些更多的細節,文本。
謝謝。
確保它的實際加載,恩。用printf。此外,如果遊戲請求核心配置文件,不推薦使用即時模式和矩陣功能,則這不起作用。 –
@ColonelThirtyTwo Jup它正在被加載。我用一個簡單的glClearColor(GL_COLOR_BUFFER_BIT) - >整個屏幕呈現紅色來測試它。我懷疑反衝擊1.6是使用核心配置文件,因爲這個遊戲已經很老了。 (我認爲)它仍在使用舊的矩陣函數。我已經通過向glPopMatrix和glMatrixMode方法添加斷點來測試它。即使這不是直接模式的明確證據,只是更有意義的是,遊戲只使用它而不是着色器。 –