冒险解谜游戏中文网 ChinaAVG
标题:
【OpenGL汉化研究】Hook OpenGL的問題
[打印本页]
作者:
shane007
时间:
2010-1-24 11:41
标题:
【OpenGL汉化研究】Hook OpenGL的問題
这篇文章的一些思路和我的某些思路类似,留待以后参考。
0 w; K( X, R3 b( O+ i
建议还是看原文,比较清晰,为防止原文失效,贴一份在这里。
% E- V6 T# p7 ]% a! x/ k$ x
2 C, T% [+ M1 K* t3 \
原文
3 b5 \' P; n6 y* e4 s* c6 _* G: f
http://www.programmer-club.com.tw/ShowSameTitleN/opengl/1654.html
: M' j4 z% s f/ I1 `
6 w- E f( J+ t* D& n% J
大家好,
, m+ n; }# l- Y
/ j- ?% B2 u% z3 U7 I
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
( A& ]7 a1 v: a: P' ~
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....
f+ r# ]" g+ Z- p( e) C, @
8 z! P) J, X- r4 n/ J
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個
3 L5 m2 \" s {7 o& p
但是BMP圖放在wglSwapBuffers卻顯示不出來
9 t) F, J* _1 Z$ }$ B" c
(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一
- k/ H/ X" c" r9 G, U' r. C) ]
樣的時間字串
- O4 H) T3 K4 h a
+ M/ ?, O/ {5 M+ G. L
. F$ r7 ^% S; K. t
/ O t$ ^4 ?1 o& Y& P4 j) k# Z: s4 s& I. a
作者 : fushunwu(fushunwu)
) f6 N# J# l. d# i9 ?) y
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
# P$ b, x- g B
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
! |+ M% D) z! z [' m
2006/9/5 下午 03:21:34
b! ?* v/ L* A4 r4 y7 \
/ n% L. U6 v R
sorry,按太快還沒打完 ..
2 K$ s/ ~5 o/ |% Q% x
% Z& f+ h, t/ J! N
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
; e+ g" B8 \8 Q' |" |' [' g& u" ?
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....( 我使用MadCodeHook的API)
" o. c1 [1 k' M5 k7 f
* I0 M- s8 J! Y3 t' @7 J$ K
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個. 但是BMP圖放在wglSwapBuffers卻顯示不出來
: C! K1 e" x2 p4 p" C2 ?& g4 f- A
(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一樣的時間字串 ; BMP圖放在glBegin中中在cs片頭中還可以顯示,但是圖會顛倒而且會占滿全部的畫面,進入game中再開圖就掛了.
3 m! [# R$ m- r! I3 z, Y
% h& K; a5 `: \" P' x
想請問各位高手,有沒有一些好方法可以解決 .
$ `3 r8 Z% f" { f) b# o! Z
1 A: }. J0 @1 l8 D1 h6 }4 a) ^" h
下面是我hook opengl API的code :
& |: t9 k1 {: R2 O
// hook wglSwapBuffers的code; hook glBegin的code也一樣
; y/ ?7 n$ O C: R
void WINAPI wglSwapBuffersCallback(HDC hDC)
! ]4 q7 G6 M4 M2 r
{
4 x7 e( ~) \9 K' o7 l. g
# r, L1 n9 p: w) z5 V
if(!ininstializedfontshit)
8 U1 m, u1 c7 P; a
{
, |) v. c3 U+ Z- G1 s
font.InitText();
4 [4 N/ @. B2 \# A0 E# R3 n0 z
ininstializedfontshit=true;
# N5 \" d' c# E! y3 b
}
9 I" ^5 a: y F" V
, W0 o0 T" W' k( i' j# |) s
SYSTEMTIME SysTime;
" z6 ]9 U- e q- S7 d6 R$ d
GetLocalTime(&SysTime);
7 J9 W/ _/ Q; K. Y+ ^% J; U8 e, x
glPushAttrib(GL_CURRENT_BIT);
. k( t4 m4 U& g/ H8 P9 J
// 顯示現在時間的字串
9 D( M- L9 v& f) P, m; t, u! J
font.Print(140,125,255,0,0,0,"Time: :%:%",SysTime.wHour,SysTime.wMinute,SysTime.wSecond);
1 N J0 j: {, z Y. W+ b" j' G$ M
2 b% O" c9 ?" A" e- Z' [7 b4 A
// 顯示BMP
3 A, Z* A* k: I; y" G
4 q/ |- W |, T" g; G' j
byte Texture[]={IDB_BITMAP1};
9 [3 x2 V4 w ^+ M/ i( \' i4 Q8 O
glGenTextures(1, &texture[0]);
3 N6 Y' P" `1 ?
hBMP=(HBITMAP)LoadImage(gl_hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0 , LR_CREATEDIBSECTION);
. y9 c2 |/ k; Q7 D: E
M; {8 L% s7 g4 b( w! g, e4 s
if (hBMP) // Does The Bitmap Exist?
N1 A4 }5 ^! o9 G0 Z p' Z$ W
{ // If So...
3 B" \% z+ n: y' E$ `; `
GetObject(hBMP,sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object
; [* M, y5 g# X7 D H
// sizeof(BMP): Size Of Buffer For Object Information
6 j c/ y# [) x, M. Y
// Buffer For Object Information
2 [; W/ p1 V+ |- r" [6 N- V& n
glMatrixMode(GL_MODELVIEW);
: h, Y& V8 L4 d" ~4 I
glLoadIdentity();
. H+ L! l4 p5 b- L. [2 A
glTranslatef(0.0f,0.0f,-1.0f);
6 l! K! n9 q- \1 n4 H) p! ?- |2 p
glPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]);
3 M; s/ t; o& Q; ]3 o* r
// Bind Our Texture
' \& B* W& I' I8 `7 y
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST ); // Linear Filtering
+ f* L, e- B, k2 O! }! ]! L. L/ P
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Mipmap Linear Filtering
4 C" E3 W" h5 @. S4 x' T8 I1 Z) m
5 o$ h; s* x* J5 |/ o2 `
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, BMP.bmWidth, BMP.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, BMP.bmBits);
/ H. U# X8 }# `1 r
DeleteObject(hBMP); // Delete The Bitmap Object
* o, T- T' c; e6 Y: V
}
, {1 X$ X) z" [
glPopAttrib();
" _ f/ E8 k4 T# Y$ ]: |% R6 C
, K6 G# p# r u2 v
$ ?' |$ G4 L- V4 S3 e
}
) X# C0 j4 f" X$ S5 X" A
wglSwapBuffersNext(hDC);
5 S/ z1 l( c# Z% @% E
}
0 ~ O) d8 _6 f
3 |! P! Y6 Z5 \) N
6 p4 Q6 T8 M5 @ a! N
: T. t. ~( w. y- x4 \; ?
. Z' N) }' J; r4 I E5 L- F
6 ?. j* A# Y8 _3 B
5 w; G2 S; `- ?8 f1 [" s, Z
作者 : dorkas(aming)
5 y5 f. p! ?. G/ v
[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ]
! H+ e4 q2 `& s' W
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
6 V; A5 C# q, @. g& ~
2006/9/7 上午 10:30:03
7 U( u. N1 N; C# Y5 `6 H
" ^3 f# C! _# _: w( U
1.貼圖動作錯誤
" K6 ?! y" F d7 T% `5 @
9 ^) J% E# q, l+ c
2.
; c' Q9 F: T( h% z
每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡
" l2 s4 C' O% e5 `0 `
$ V- S2 p' p4 k ~6 u- }/ z
2 k0 }: O/ b- j7 Z& ~5 E+ R: w
struct MyTime
_( ]8 ~) A9 W' Y) o
{
" ?1 B: K# c1 z8 w; `0 l! c
byte Texture;
$ x% r* `( f8 m# z6 S
FontGL font;
0 S. g- ^7 S% N
void initial(void);
2 Z: U1 b- V6 h: r$ a7 g. A
void finish(void);
9 J% a7 R o; h3 B: x* ?
void draw(void);
& h) o9 N+ p( l2 L) }$ Y
};
7 d- P/ K; u1 \% Y
void MyTime::initial(void)
- J4 I3 p& F, Z% C" D% n
{
* |6 e4 z, N' F C
// 載圖 初始字型
3 I( e+ L7 e1 x% P$ I
font.InitText();
. r# \7 Y, t: `' B% d, E
glGenTextures(1, &Texture);
1 v- ?0 G8 Y$ x/ }5 p8 N" s/ @# q
}
A7 W& @8 ^0 n$ Q" V% F0 Q
void MyTime::finish(void)
2 X( a3 p1 O% ~
{
" P0 p1 ]% m- q
//釋放圖形 字型資源
6 L7 d; s' n8 }; z6 E
}
9 v+ F6 x$ J( z7 V) p# H: p
- a- L* h& l" d* A, `/ I! Y
void MyTime::draw(void)
! o- I# M1 V$ Q0 Y4 a* j) x
{
* ]9 D: p* C$ m5 `9 R2 r$ L% p
// 顯示現在時間的字串
( v- e& G8 L" Z ]- q
font.Print(......something...);
5 A9 G! y: _0 h: Y: @% T3 I, o
// Buffer For Object Information
8 V0 Z- }9 l% c. r: N" X
glMatrixMode(GL_MODELVIEW);
3 N& L0 j' J( n! W% L
glLoadIdentity();
! E6 ^( [. m- z% ^% `
glTranslatef(0.0f,0.0f,-1.0f);
* @) L2 i" j1 `, M& }
glBindTexture(GL_TEXTURE_2D, Texture);
( r- G+ M- n2 n$ P
8 G, B' y# m; y! D9 A, G* @
..... DrawSomeThing
2 q) Z" c* A5 W1 z/ M( t. G3 l
& ^4 f) @0 T* x$ J, n- K
}
|" k+ A! A- J, o
: h; P5 j5 y0 p% s
: x& [; G [" S8 R# F
MyTime time;
/ Y( ~: e" l# O6 C) u
void WINAPI wglSwapBuffersCallback(HDC hDC)
& A3 c! ?, l: ?. Z2 X& R- \# R7 J) N
{
6 R; H* E8 \* \) D
time.draw();
* {) H% @# ^0 O# I' e" z
wglSwapBuffersNext(hDC);
7 i& Q' X" C5 Y: X1 k% w3 R: A
}
x8 S% k2 H0 Q9 D9 H @! Z
p9 d% D3 Q$ R' x
你只要掛進去前呼叫 time.initial();
, K6 o2 {+ [- M! I/ H1 f
結束呼叫 time.finish();
$ l. J# A, w; Q: j: s6 M' k+ O8 V
- v+ r& _* ~1 L. @8 [0 y9 O
9 J9 K, @8 n. f# Z
# c; P" r7 ~( m. S
2 d: F/ w: I0 o, ?4 {" ?& a% m
作者 : fushunwu(fushunwu)
% j& G7 F6 Y0 @
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
- o9 z* E% K! o. \
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
( W$ K. I. A0 n M0 N) Z: e+ g- U
2006/9/7 下午 04:19:31
/ {: a$ W! E7 s' D* _
5 p- E" ^7 i+ v$ y* U7 ^2 E
謝謝. 但我還是有幾疑問想要請你幫忙,麻煩你了.謝謝 ~
1 i% P" J3 `% f
; }( g0 C3 W& e1 c
(1). 因為我要固定放現在的時間字串和BMP圖在被我Hook的Game上面,所以我必須要知道那一個OpenGL的API是一定會不斷地被Game來呼叫,這樣子Game畫面才會不斷地更新.
, i! q5 i: i5 d6 J
時間字串也才會不斷地被更新而BMP也會不斷地貼在Game上面而不會被Game遮掉.
4 r, u3 b) ~2 L! B! X
像是DirectX Game中的Present API就會不斷地被呼叫,所以我只要把現在的時間字串和BMP圖放在這個API裏面就OK了.
+ Q+ n2 _" X$ S+ s; {; N8 K x
所以我想問的是OpenGL Game中是不是會不斷地呼叫wglSwapBuffers這個API,讓畫面不斷地更新 ? 還是有其它API是一定會不斷地被OpenGL來呼叫 ?
0 t* C! @6 ~; T" K8 m/ A
I( Z$ s% W* w! }4 y% O
7 G; f) j$ r8 Y
(2). 現在OpenGL Game看起來都不是用Pure OpenGL API來製作,比如說像是用Glut
, N! Y8 A) W4 g
來開發,他們是只是封裝起來底層還是需要用到Pure OpenGL的API 嗎 ?
. Q: q9 R) M- T& \8 F1 {1 }; V
這樣我寫的Hook才可以通用其他非Pure OpenGL的Game.
@& B' v( S% i i! \* l, `) q
2 G/ i+ S! m8 @1 G" M1 ~' f5 I
(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
6 t$ i$ A- _, F& l# }) ~7 `0 l
( C& H5 L* w; G; J
4 ^1 x: A6 |9 ?; W( S/ p V$ @
* J7 P W9 u1 ~. C$ E4 f
$ W& b0 r, `/ ]4 M+ j/ G: s
* G( |6 E/ G* C9 w( P: Q
作者 : dorkas(aming)
' |) } G' F8 R% `$ Z v( n4 S
[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ]
* ?* H: ~7 w! x; l
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
e: X; J9 ~& s& S1 B
2006/9/7 下午 05:31:01
( z8 q3 b1 p. O4 c, j1 L2 a' K
% m e2 x! d# |
1&2
: d5 Y, `( W. O
我對OpenGL不熟...
: I6 n1 R: ?0 K" y& }! z
5 V0 p* V& W/ E& Q% o
>(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
) o! S( F- p/ W% \4 p. V$ c
4 G, q2 \% V R/ y x+ F
: r$ t& m8 u) @% w( D4 b$ f
初始跟結束都是做一次的就好了
# W2 @$ x- _" p* }2 S
你高興要擺在迴圈裡面也是可以
! S2 p, f+ [1 Q& t i0 r0 h" B
6 d- h0 Y, J! F# Y' T3 \/ W
程式的要訣就是 起 承 轉 合
' P/ T5 q e- m
initial
0 X5 `0 M% \9 h5 C; b
upDate
5 i2 q) |: K7 C9 C) j
change
1 y# A: b6 M" e, ]3 F8 z
finish
; J: M6 x/ N4 L1 @
物件也是起承轉合
+ L$ u& A: G. | V
函數也是起承轉合
. g6 ?5 x# O) g# e6 E* h
迴圈裡面也是 起 承 轉 合
: v' ]! s# [7 o. T2 x6 h
. p: A0 E/ `2 a
起
* r2 I+ ^- l" K. G( r9 d2 S0 e- w: S
for(起;承;轉)
$ }3 U. m9 M: N, X. y: g
{
8 D% o: K% }/ {
起
( q6 p/ c1 Q) P1 |2 ~, t9 t
承
& d4 t- l' e* R2 f4 L5 ~; [( R
轉
& u! d+ } J, D) c+ f, ~4 N! `# q
合
5 x& p: i. _6 J6 V. c/ U8 p# W; J. ^% ~
}
g1 x, r4 O; \) }, |
合
( t3 d' D$ q: X! r+ f
" y5 I+ d5 E2 n' d& z8 `; ]
只要你分的清楚 屬於那一塊的性質就好了
# n! c8 C6 B- _. L9 H/ Z
/ m8 d- n, h: ^. M5 z% k' Q) P0 D' l
0 n# P& d) i) q. j
! n# O, r% {, F* A8 z! @/ @7 q
* P. S: e2 D5 J1 v: r. e# E( _" B
/ t% D8 y" g* O. v+ \2 S" x
作者 : fushunwu(fushunwu)
y5 ?9 p' a6 X: ? ?' D0 r/ h
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
" h% c G& t! n7 g$ @$ k' y
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
) ?$ q& I3 e) N/ H% |6 a8 {
2006/9/8 上午 10:32:26
1 r! R0 S. n# m% n# d% X# d
' i! `5 H* A2 t! S1 V2 Q: P" |
恩,還是要謝謝你,目前問題還是沒有解決.Quake4和CS 顯示的狀況還是不一樣~
! a, A K3 @; D' D7 x
" [: X2 G! |: \
像是Quake4這個Game它就沒有使用到glBegin這個API 所以我hook不到glBegin
. c+ d& E9 K; x: W
所以我就把顯示字串和BMP圖放到swapBuffers裏面去做,字串可以正常顯示但圖秀不出來
: F5 t. g0 c' Z+ `( Z! s; \; p
我在想是不是因為座標還是矩陣的問題 ?
0 A; V, \4 Q9 L% B
$ M2 |7 ?) c/ t# d
但是CS放在swapBuffers圖和字都顯示不出來,但是因為CS有用glBegin所以我就把同樣的code放在glBegin裏面,可以顯示字串只不過會顯示很多個,我在想是不是也是因為座標還是矩陣的問題 ?
: G# e( y+ a6 X3 z
至於BMP圖在CS片頭時可以秀,只不過會秀滿全螢幕而且是顛倒的占滿整個畫面.
4 V+ W% Y, J8 Y4 n3 P# v4 c
b0 w4 u' _: j
所以我才想說有沒有一個統一的方式可以讓我把同樣的code放在某個OpenGL API裏面去然後每個OpenGL game都可以正常顯示.
作者:
海心的剑
时间:
2010-1-24 15:03
一丁点都看不懂。。。。。。。。 [s:60]
欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/)
Powered by Discuz! X3.2