在分析Scratches是我发现这个游戏使用了OpenAL32.dll和wrap_oal.dll。 ! o' A7 U" H2 \) L7 k
所以估计使用了OpenGL的API,以下资料可以作为研究的基础资料。 $ |& H" M$ X3 w6 Y2 D& r
2 \" j' ~& }8 i7 v. I" y+ K0 r+ _3 I }
原文
0 u5 V# H# ?9 Y8 N. L' F, E% Phttp://www.programmer-club.com.tw/ShowSameTitleN/opengl/1654.html 4 _6 H2 [& U0 r$ T8 A% v
7 K6 F1 j* |6 y5 M" _' f
大家好,
9 L, ?3 W/ E) G5 u, x7 K# e _
7 N2 X' n$ X {2 j' w }我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable " f9 i$ A6 N; X9 S1 X8 x8 p1 u% o4 t
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....
' @7 ~5 y/ Q* i4 d- v, U. s3 E8 t
/ Z5 G9 V4 b( z1 {- C2 u3 Q6 }(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個 ) `; I, j* v& Q. j1 ~* z
但是BMP圖放在wglSwapBuffers卻顯示不出來
1 a2 r' O2 }0 M. _(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一
0 |9 ?8 u& _* m8 C4 N- o樣的時間字串 / ~ a6 d! Q2 D; \6 @. B n
b! B& V! z! h+ O
! I& X8 Z/ X* o3 `+ G* W5 v& y0 s2 _7 D8 {! [/ X
作者 : fushunwu(fushunwu)
5 M% }5 x: ?+ m$ \% T[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
) s9 Q) E! v# Z" [- {[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
0 n" u" Q: f1 w3 I2006/9/5 下午 03:21:34
% X0 m7 |# {9 p9 ~' [; u& C C: j
2 G% I1 X k! ~8 |2 ~sorry,按太快還沒打完 .. 6 E3 i W/ }8 V0 r% t0 O
2 P5 b7 B r: a" R, V% l1 G
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
3 B$ h1 p* o4 b3 J- K& J4 I) y,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....( 我使用MadCodeHook的API) ( t1 m Y; Y! D
6 H. Z2 N0 T8 g! f
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個. 但是BMP圖放在wglSwapBuffers卻顯示不出來 + ~) f5 {. Q- |1 \
(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一樣的時間字串 ; BMP圖放在glBegin中中在cs片頭中還可以顯示,但是圖會顛倒而且會占滿全部的畫面,進入game中再開圖就掛了. + O+ v0 a7 ]6 F3 v
0 X. U" E) h& _& G想請問各位高手,有沒有一些好方法可以解決 .
7 q# I) K5 W& A" V" P6 ^* [; ^* R3 ?% B
下面是我hook opengl API的code : , J. R+ m) l6 [: U9 v
// hook wglSwapBuffers的code; hook glBegin的code也一樣 4 d. ?) w6 C; o# N" b, A% S4 M0 Q& y( {
void WINAPI wglSwapBuffersCallback(HDC hDC) $ p, u( |" @- \$ J
{ 1 m3 P' s5 h% m+ p
1 e& k$ D) \/ ]( S6 X, I" U- Kif(!ininstializedfontshit) ! t2 b' v- A9 k
{ + j4 J4 |. g G2 g9 n
font.InitText();
. u6 C& r8 y4 J% _4 Iininstializedfontshit=true; 9 F2 [- a/ J, o
} , R8 u" o E( p8 \4 U& Q/ \
+ F j2 G& @; N% f* Z. ESYSTEMTIME SysTime;
9 ~0 P1 e* _& A- a' SGetLocalTime(&SysTime);
- F1 l4 |; Y: c3 Q8 U5 bglPushAttrib(GL_CURRENT_BIT);
0 q7 s4 c2 E9 M// 顯示現在時間的字串
9 t) _( j. G& D4 N, Dfont.Print(140,125,255,0,0,0,"Time: :%:%",SysTime.wHour,SysTime.wMinute,SysTime.wSecond);
* j6 i a" g' a/ z# D) N5 [$ O- }' h0 t1 U) \0 r
// 顯示BMP
9 D1 i( [6 u/ A. \) `; i( R
* |" }" f# c3 j ?8 B) b4 G/ Hbyte Texture[]={IDB_BITMAP1};
! Y k" Z' z' {4 J& R P1 cglGenTextures(1, &texture[0]); # _" }) z* g, }* ]2 i1 E' y
hBMP=(HBITMAP)LoadImage(gl_hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0 , LR_CREATEDIBSECTION);
1 A6 H% [; q3 b; _) Y
; z. w$ n% _# V) l# L; ]% qif (hBMP) // Does The Bitmap Exist? - u1 ~+ g. }* e, Y
{ // If So... h" a9 P' P( R
GetObject(hBMP,sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object ) N. X' n a# Z
// sizeof(BMP): Size Of Buffer For Object Information
0 G2 I+ o6 r& ^/ d5 ]// Buffer For Object Information
9 U( p2 B+ c; {* X4 ~' p9 y. i& gglMatrixMode(GL_MODELVIEW); - r1 Y% h4 S& Z* n* c2 K1 h
glLoadIdentity(); 7 _( l9 A7 f9 O+ ]
glTranslatef(0.0f,0.0f,-1.0f);
Q( h( t+ W' |glPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]); - G9 x: w; b1 @4 _) C* L9 }# ?
// Bind Our Texture * r7 z& C. |! s7 c$ S
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST ); // Linear Filtering
) l; y# E7 B8 T8 H/ @4 E# jglTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Mipmap Linear Filtering
: H& E5 ]! @8 q G, n4 W; q: W0 Z1 G1 u6 |9 E
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, BMP.bmWidth, BMP.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, BMP.bmBits); 5 F. a1 D, _; T4 T7 y( m0 J
DeleteObject(hBMP); // Delete The Bitmap Object
+ A ?3 M& S+ X7 o4 a} + J$ r% z- b1 T: Y1 ^$ G
glPopAttrib();
3 Y; o8 S; H) W, o! Z* k8 y. N1 g8 d6 ?8 s" i. J
( A+ J. j. u8 R* y4 B/ Q
} & L% V% S% Z3 U* p" G0 y4 C
wglSwapBuffersNext(hDC); 3 Q4 X+ p' m3 w7 v. d
} ! t! w, L/ |5 q6 h- ]
1 X6 d0 v' y' a; h) D+ y3 @8 @# p3 J. v8 J! H5 i
- j# e+ j5 _8 J" E/ _( }* a8 O
! Z5 O/ p* A4 a
/ |! F$ m" I5 _2 Q4 i
# i- d5 N9 S2 S* f9 ~) \: U- v作者 : dorkas(aming) 7 V. m" \* B* H2 T
[ 貼文 2619 | 人氣 4536 | 評價 11790 | 送出評價 2 次 ] / G# ~2 }/ @. Z
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] , z5 N) X; s( |' O9 z
2006/9/7 上午 10:30:03
, Z4 ~, f* I& b$ D7 M0 K. V+ A+ w9 b- T! q$ C
1.貼圖動作錯誤
# C2 x: f/ O1 W# A0 [9 ^ B# u+ {+ z5 |
2. ; b# j; W- Y- x4 v# T- v$ W0 u
每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡
% l8 |' s% ]/ {! U: j8 `5 ]1 }! `2 D
9 b6 u( t: @& ~& jstruct MyTime
. J+ Q2 O; ~3 b7 J{
2 K$ q) F, y' O0 ?0 W8 Obyte Texture; 5 K* M2 r+ L0 ^. R+ Y: u/ ~0 h
FontGL font;
! n0 v7 @/ y6 v* z/ r1 _7 Zvoid initial(void); ; o% q b8 T9 x! Q5 N D' q/ A4 E
void finish(void); 8 f1 d" Z) e7 y* g2 a" k# z2 F7 F$ \
void draw(void); 4 e! r/ k; _0 T3 {
}; / X) _, v' R" |1 G, u+ S, H
void MyTime::initial(void)
: t, z( Q- I- k- Y* F* m4 r{
- z$ U( e, e0 r2 ?1 R// 載圖 初始字型
7 m" O4 m7 y; \9 Y1 b3 J d/ Ufont.InitText(); ' Z7 X7 j+ b3 l
glGenTextures(1, &Texture); # j, m! {) J- y4 S+ ?7 R
} % e4 G% [2 Z+ N
void MyTime::finish(void)
8 F5 A& C9 m. x) P5 l7 |. K$ _{ ; ]" K2 e: ]" v- ^, s% g3 L
//釋放圖形 字型資源
3 h! M. t0 |6 h( ?% L: s}
6 }* w; R3 C0 E& m* @
, J6 C/ V1 T* j2 Xvoid MyTime::draw(void)
" q6 Q( F# |2 {5 d{ : f) F$ L! k ]/ s, M
// 顯示現在時間的字串 ! a3 L8 Y* Z& w/ H% f7 }
font.Print(......something...);
3 r. P% W, {, L' Z// Buffer For Object Information 9 _) L4 [ A; s. I9 w/ ]$ x6 f' ^
glMatrixMode(GL_MODELVIEW); ) C" |/ G" D2 D# ~5 g6 u9 u
glLoadIdentity();
& r3 O% k1 ?: j* T+ E* SglTranslatef(0.0f,0.0f,-1.0f);
" u: `/ |5 T, p& eglBindTexture(GL_TEXTURE_2D, Texture);
# Z8 P" G8 @1 `1 a5 f' o
: P% |! t* l* b/ L9 U..... DrawSomeThing
; m( D' [8 l- ^% w3 [) x! z$ N4 A; N( s& W2 F4 ]+ }
}
' Z7 \& k# | k& ]$ h8 Q1 R* L. w3 _$ W% c( h
' Z) n: u. C/ P0 LMyTime time; 0 n }3 ~" \2 R0 i) }; L4 I# n
void WINAPI wglSwapBuffersCallback(HDC hDC) # \7 u& A5 L" P, l0 m+ |- [ B
{
. O, G3 G' U# l5 V) B% @time.draw();
0 u i5 J) Y/ p# R$ o. j' O* V+ twglSwapBuffersNext(hDC);
+ ?) A: @+ F! p& E. O7 l}
+ u$ i' d# P B2 E* I' ^: `
. w1 j/ v2 R$ O$ y* B% u你只要掛進去前呼叫 time.initial(); + l+ O4 N) A. v- ` Z5 j/ w
結束呼叫 time.finish();
1 g$ g* h$ X4 V" @. `( _* z+ |) F5 q s5 b3 ^" P
/ h$ m2 K8 O8 t/ K' y( `0 i
8 M) c0 @- {, l+ k
% S+ @$ K, e% ?) H4 O/ {
作者 : fushunwu(fushunwu)
1 [# |3 w# B1 J) T[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
, {+ v5 Q7 Q6 G2 M. B[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] ) ^; `- ~' X3 i, b5 {
2006/9/7 下午 04:19:31
, a6 M2 i6 [, `" V' [0 F
# Y& s5 A1 d( C# N5 O5 @謝謝. 但我還是有幾疑問想要請你幫忙,麻煩你了.謝謝 ~
8 o& Y1 l$ C4 J$ L2 O: V. B
' C; t) D9 T+ W2 v( J$ ~(1). 因為我要固定放現在的時間字串和BMP圖在被我Hook的Game上面,所以我必須要知道那一個OpenGL的API是一定會不斷地被Game來呼叫,這樣子Game畫面才會不斷地更新.
% r* A1 o4 k5 t7 {1 J7 {+ V1 a$ C e時間字串也才會不斷地被更新而BMP也會不斷地貼在Game上面而不會被Game遮掉.
. `3 J; z, Y% n& n( _# f像是DirectX Game中的Present API就會不斷地被呼叫,所以我只要把現在的時間字串和BMP圖放在這個API裏面就OK了.
7 `8 W) h/ K! H* p. T所以我想問的是OpenGL Game中是不是會不斷地呼叫wglSwapBuffers這個API,讓畫面不斷地更新 ? 還是有其它API是一定會不斷地被OpenGL來呼叫 ?
( B" r( d u* U- M3 s5 ^& I/ i* \* n2 v1 n/ N
7 w+ B& K' L" t# n K
(2). 現在OpenGL Game看起來都不是用Pure OpenGL API來製作,比如說像是用Glut 6 y' R2 F9 y& V- H- T' D9 x$ {, w: B
來開發,他們是只是封裝起來底層還是需要用到Pure OpenGL的API 嗎 ? % g1 A n) r8 p+ e
這樣我寫的Hook才可以通用其他非Pure OpenGL的Game. , d; B7 e1 N4 u" ~
$ I# i( h1 J8 S5 h. M9 r8 R3 F# g0 w7 n(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ? ; L Y& M1 @) R. P9 M& |
4 a: u3 f$ D2 O4 {) V
' y9 @" r2 p' \# ~6 Z
" ^3 t+ C( K4 e
3 y7 o9 h% o* A1 N; t* q! p0 O( e+ @7 a' F& k# u9 f+ }
作者 : dorkas(aming) 4 v4 a1 ]( a7 P7 G* v& N* R7 V( \
[ 貼文 2619 | 人氣 4536 | 評價 11790 | 送出評價 2 次 ]
4 u# S6 d( n' f x+ a+ z, ~[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] * Q. n/ s4 b" Z
2006/9/7 下午 05:31:01 , F4 D0 e# B. ] X' P9 b* W
% `' z. _& t8 A/ s1&2
3 k* \: n9 V: p/ b' L/ c5 _' e我對OpenGL不熟... * T6 i0 X I8 G1 p( [
" h/ M. p, Y0 z' {9 q) e
>(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ? ' {& h+ K( g2 d
/ z5 v9 y8 D, `7 F a9 t [, e9 |0 [ T) z
初始跟結束都是做一次的就好了
L/ A9 _ }+ B( ?# n你高興要擺在迴圈裡面也是可以 " z2 m8 [4 U% z& U/ `
: i& S0 A* c) x4 x2 F! t6 h( T( o+ D程式的要訣就是 起 承 轉 合 0 d) y# B6 D+ u2 n+ H
initial
/ K: @) ~! c8 j4 V. ~upDate , C8 d/ s4 q5 O9 a4 \
change
9 K: X5 _& M P+ O, Ufinish
/ Z7 |' a* g6 p, O3 {! J! g) O. h物件也是起承轉合
1 U, j$ C7 o. P8 o函數也是起承轉合 2 u* o! B6 M8 Z+ z) z( r
迴圈裡面也是 起 承 轉 合
4 f. Y# N& L J7 x6 T8 d
; P2 q/ N3 k& I; u) F起 ( k C1 O( V6 g
for(起;承;轉) : I# r0 Y- p' o0 K$ @2 l' X
{
+ T( v( S4 b$ B起
6 B( {$ L' R9 B* ?承 4 T( O" J% b* R
轉 L8 K6 |- m1 W, e' f" c V
合 , {) ~& o; J& I
}
/ z" t! q9 D. q( R0 J( S" }. _合
$ v2 J. f2 P" J* F e% f: q2 }
5 F1 H7 r8 p* }/ L只要你分的清楚 屬於那一塊的性質就好了 8 ]) W( b! ^+ m
) B9 d! y% `8 u# V
! _: ^3 p( ~, ?/ ?% g
" e6 F1 L0 }/ y2 y3 V( z6 s8 p( a
5 b" N* F, {5 O1 q( K6 D: E9 t
作者 : fushunwu(fushunwu)
$ A6 g$ \, S, N9 `$ `[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
9 n- {6 f- b5 b& a( V( e9 d; @+ ~[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
$ u! n. e. t& w, r0 E! Y1 k2006/9/8 上午 10:32:26
4 G0 d r8 J. l! w6 W
0 h6 `6 o- o# q- o, f恩,還是要謝謝你,目前問題還是沒有解決.Quake4和CS 顯示的狀況還是不一樣~
+ v) P, b/ S+ H* x9 |* L6 r) J/ T$ N2 J$ v9 x! ~9 E* A
像是Quake4這個Game它就沒有使用到glBegin這個API 所以我hook不到glBegin
: f1 h0 C% p& R2 v0 \9 w1 k4 @所以我就把顯示字串和BMP圖放到swapBuffers裏面去做,字串可以正常顯示但圖秀不出來 5 [7 l4 V* \# L& H
我在想是不是因為座標還是矩陣的問題 ? 8 l4 x3 f; [1 ]- i) ~) {/ B
# V& X. Z" B8 \5 I* L) |4 r A但是CS放在swapBuffers圖和字都顯示不出來,但是因為CS有用glBegin所以我就把同樣的code放在glBegin裏面,可以顯示字串只不過會顯示很多個,我在想是不是也是因為座標還是矩陣的問題 ? 9 P# F1 Y' ^" T3 l
至於BMP圖在CS片頭時可以秀,只不過會秀滿全螢幕而且是顛倒的占滿整個畫面.
6 T/ o# N" n, i# V) |# U# `" z X' _2 I4 v) {; i
所以我才想說有沒有一個統一的方式可以讓我把同樣的code放在某個OpenGL API裏面去然後每個OpenGL game都可以正常顯示. |