在分析Scratches是我发现这个游戏使用了OpenAL32.dll和wrap_oal.dll。 ' G5 ~( ~" s$ `1 b& J9 P6 J( ]
所以估计使用了OpenGL的API,以下资料可以作为研究的基础资料。
& _% c. }. s3 h: T8 l% _2 h9 W; K
) y1 W5 y" I7 x
( w, v% |4 F; m/ ?/ C; ?$ Y原文 ; r; z6 H4 B3 m9 f+ S
http://www.programmer-club.com.tw/ShowSameTitleN/opengl/1654.html ' l" H) e/ T3 f" l
4 f" r7 p5 p+ S/ b( }6 V" W
大家好, 5 i! {2 }: u' j) G& ?7 Y* ]3 V
; |/ Q, Y& z5 F' Y4 ^0 e+ z& k我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable ) N* b7 s) W: }# E
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣.... ( q1 @$ F7 {1 q! h4 S
; a/ x, b2 s1 c(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個
. b; s% u1 E: j) _4 o; \但是BMP圖放在wglSwapBuffers卻顯示不出來
9 z( c2 I! [4 p1 e: K2 N" K8 s(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一
8 O+ d! W5 {$ s& X- R4 u& {% I8 j樣的時間字串 9 O7 z" z* H {0 k! \* x
! f& o0 u0 A* m0 B+ E( v) @2 b, |4 w" ~1 N: S
7 p' _: ^8 u% v
作者 : fushunwu(fushunwu) ( B1 ^9 |) z' a3 K. ]0 r! U* }$ `7 ?
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
n' C; Z i3 J W2 J# C' S" s[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] 3 @( j! J: h% \0 l
2006/9/5 下午 03:21:34 / y& R$ |0 X2 J- d
. Q U3 u) g2 Q0 Fsorry,按太快還沒打完 ..
& M' U& [2 X# S, ]
3 A n, V2 Z/ J# ?/ g我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
! j% P. Z: |5 h8 w,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....( 我使用MadCodeHook的API)
8 w) e; t/ a% w4 r. ]' y j. [( j7 k: n% ]" \- {
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個. 但是BMP圖放在wglSwapBuffers卻顯示不出來 + {% A- X* t( W% ^. l A8 L g
(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一樣的時間字串 ; BMP圖放在glBegin中中在cs片頭中還可以顯示,但是圖會顛倒而且會占滿全部的畫面,進入game中再開圖就掛了. 9 B3 n4 t# |! n# }1 h2 s
! | ^: _) P$ L$ R4 W6 ^) x3 \想請問各位高手,有沒有一些好方法可以解決 . ' W2 X0 X5 r3 H) s0 G
7 ?" `7 q3 n) j下面是我hook opengl API的code :
( w* z8 x. f- ^9 H6 P( \// hook wglSwapBuffers的code; hook glBegin的code也一樣
( a- }4 r. [7 N% zvoid WINAPI wglSwapBuffersCallback(HDC hDC)
& o) O" G% B3 e1 z, I2 W{ d2 ]) h% j- l* H- y: b
2 [" Z* E, r4 m
if(!ininstializedfontshit)
1 g5 C0 e, [/ E{
( m K3 p' U0 {0 n; X# sfont.InitText(); $ e6 Q O5 v, K
ininstializedfontshit=true;
% C, v. H! S* J, _}
3 k9 j; {$ e1 I" y" s0 _' q3 u
9 t4 |1 j# U& hSYSTEMTIME SysTime; " p6 T% q- {. k& ]% n* \
GetLocalTime(&SysTime);
5 W: p. T6 A) i x. GglPushAttrib(GL_CURRENT_BIT); 8 Z6 D6 M' q$ h, O9 L+ |9 e, d3 K4 o
// 顯示現在時間的字串 8 ?& V |3 W- A, t; K; u" s
font.Print(140,125,255,0,0,0,"Time: :%:%",SysTime.wHour,SysTime.wMinute,SysTime.wSecond); ) e* ?$ I3 ~$ t4 s: u( X
0 h( x( J, D/ y0 J
// 顯示BMP
$ l! p' }9 s% _# U1 L% z; M, m4 Y5 z% i" M$ ~/ N- Q% V+ q
byte Texture[]={IDB_BITMAP1};
3 ]+ M, H& Y: F% s/ rglGenTextures(1, &texture[0]); ; O( Z( R+ P4 G1 j4 M* s) Q
hBMP=(HBITMAP)LoadImage(gl_hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0 , LR_CREATEDIBSECTION);
( P! H# ]7 O x; {9 S3 _
/ Z3 p9 `* S$ E: M4 @* E0 \if (hBMP) // Does The Bitmap Exist? % t* ]: D5 w0 ~4 V) P3 f* X8 Z( m
{ // If So...
! O4 D/ k4 b# p$ \ [( ^$ P/ ]GetObject(hBMP,sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object ; x: F; _5 _8 O: c2 Z
// sizeof(BMP): Size Of Buffer For Object Information 0 |+ {; q+ \( \ R5 n
// Buffer For Object Information ( R7 `( _6 k D9 X, `
glMatrixMode(GL_MODELVIEW);
1 W. K# c# e3 J) Q+ M( d$ yglLoadIdentity(); & ?- ?, ^8 W) `" A! ]
glTranslatef(0.0f,0.0f,-1.0f); ' M& Y0 W; m3 A* L2 z( W" ?
glPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]); 0 \$ g4 F) o" q' K: ?
// Bind Our Texture ' g" R6 B' _& A3 ]2 c! ` d& @7 E
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST ); // Linear Filtering 1 L' w( x5 f# q
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Mipmap Linear Filtering : u( ]; ?, e6 g/ t7 L5 X+ O1 _
" m$ H! l3 n$ ^! f& n( S
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, BMP.bmWidth, BMP.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, BMP.bmBits); / T0 G. d1 c. b5 P
DeleteObject(hBMP); // Delete The Bitmap Object
! V& n& d8 j) L* C% Q# |3 c9 ~} 3 I: }+ h( W% `5 h
glPopAttrib(); 0 c5 A/ }1 U( k& R3 D+ V
+ g; O" v6 X/ K" J& I. I9 D2 Q" U. t: j
}
, l4 t( M4 b3 D/ YwglSwapBuffersNext(hDC);
; c$ f9 k2 |; X8 W( u9 D5 ]2 z9 q5 i} , i- q4 W0 l! O6 L. f# I
. r2 B& u1 X8 a% u
% @/ N' Q: W L" w7 q, u2 S T
1 @# T% d) p& d" i( a2 o( H+ `# e
% h1 m3 F V! m# W5 o9 V4 s6 g
% d$ T( v7 W8 e
1 a" {8 y/ t. K$ p作者 : dorkas(aming)
5 m% d. H8 q: N1 a[ 貼文 2619 | 人氣 4536 | 評價 11790 | 送出評價 2 次 ]
5 X7 I& m# |( D h( j A+ T[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] . Y1 d/ q- d$ C j2 ?
2006/9/7 上午 10:30:03
9 k4 L5 B/ B- M% f3 U9 G7 h
P9 K* |6 t1 \7 X! l1.貼圖動作錯誤
: {2 B& [ V0 K: b M" w+ x" T: x8 d& M
2.
1 B- J r) J/ N8 b$ D) f每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡
4 P$ u! n) f% z1 F5 u. c6 C
6 o7 l+ l/ h. p
~$ h+ t' `: y; E% I* Gstruct MyTime
% x% ?" d. \: K D{ & V2 ^/ J" \5 n6 @5 Y/ x- {% R
byte Texture;
7 t0 _8 [1 ^( \ K+ T8 }9 ~: WFontGL font; $ k- k7 ]# B5 O+ B; p4 d
void initial(void);
: d8 F6 w7 o) o; H& g3 R0 ]void finish(void); " r! {) l4 `0 i" @3 {
void draw(void); C! q+ B6 o, u$ e, Q9 N
}; $ x& V& C+ n, t$ p+ U2 r
void MyTime::initial(void)
7 o1 y4 O2 T% L{
5 k; P+ O8 I0 x2 c, r// 載圖 初始字型
( l7 f* ]' p) Jfont.InitText(); 7 M( _( |' J) P* m
glGenTextures(1, &Texture); # W K, A2 [2 y' ^
}
) V: O, ?* f/ r; O+ d4 X' H% Svoid MyTime::finish(void) - o, R w1 O) k
{ . o( x* K( z9 ?2 b* x
//釋放圖形 字型資源
$ C: n* Q/ I% {$ n}
+ m* I8 Z, D$ T6 c: G7 K% v% [
( ~' \: L f o; u' ~+ uvoid MyTime::draw(void)
e9 v& o F5 L{
# l) w, T% r! u! S// 顯示現在時間的字串 * |4 n" s5 M* d% P7 C" X* D
font.Print(......something...); 2 C+ N+ R5 h/ L9 i m. `, V8 d' Q
// Buffer For Object Information
6 ^: K, `1 f4 b+ C$ o9 z3 NglMatrixMode(GL_MODELVIEW);
& S0 {' D6 @8 ] b' d3 v: qglLoadIdentity();
6 D2 w% _# F9 pglTranslatef(0.0f,0.0f,-1.0f);
# B7 a' H6 W: MglBindTexture(GL_TEXTURE_2D, Texture);
0 H' i5 x' t M" w( |. k. a7 W0 j/ {4 u/ r
..... DrawSomeThing 7 n9 r6 Q3 a$ j% C i- D
! a9 f- s+ R0 y4 k} " ^) C7 `+ j( ?& a, g7 | v
( n# P! w% K' g, j- \
' J2 l! m! {# K3 b1 Q2 ^+ HMyTime time;
7 S9 N( t0 n t, \2 Yvoid WINAPI wglSwapBuffersCallback(HDC hDC) ) i- r7 I7 L$ N7 A
{
/ b- s( X P% M7 ]2 l! j: @- mtime.draw(); 0 o0 h3 J, ~" T6 T: w" r
wglSwapBuffersNext(hDC);
6 @; Z \9 Q6 N: t/ n} % ]: Y. p" W3 G2 q
0 F; S" h3 l% X! m, q( [/ w% \* L你只要掛進去前呼叫 time.initial(); - Y7 U d, ~, [0 A; T) y
結束呼叫 time.finish(); # p! m" n1 e. |! P1 n+ a
+ |6 j! K+ N' F4 b4 A
7 t; X( i/ ]8 w# L# I! d8 P& z& Z# W1 F0 Y
% [& j! F6 ^5 |* D" H( u% f S
作者 : fushunwu(fushunwu) ' ~* Z2 e$ a$ i4 V* O
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ] 6 x2 Q* M. J0 S9 N
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
3 u: P7 g. {. Z2006/9/7 下午 04:19:31
& I9 x1 Y" [' W0 H2 D8 f4 d
* T$ Q9 N$ R& p$ B; @4 d謝謝. 但我還是有幾疑問想要請你幫忙,麻煩你了.謝謝 ~ " a8 B6 Z: i z* U! ]+ y U
+ ^, [: {4 X5 y) W) s+ r
(1). 因為我要固定放現在的時間字串和BMP圖在被我Hook的Game上面,所以我必須要知道那一個OpenGL的API是一定會不斷地被Game來呼叫,這樣子Game畫面才會不斷地更新. 8 b/ l! C& S$ C
時間字串也才會不斷地被更新而BMP也會不斷地貼在Game上面而不會被Game遮掉.
8 d2 |( B2 m( E3 C1 ~像是DirectX Game中的Present API就會不斷地被呼叫,所以我只要把現在的時間字串和BMP圖放在這個API裏面就OK了. % }: u5 D# ?; J# N: k. j8 a' {
所以我想問的是OpenGL Game中是不是會不斷地呼叫wglSwapBuffers這個API,讓畫面不斷地更新 ? 還是有其它API是一定會不斷地被OpenGL來呼叫 ? % y6 _& F3 d3 F* j0 ?( D, W
. }! A6 d8 E9 f& S1 l/ l4 d u: t
$ Q1 [! H. D" \# @(2). 現在OpenGL Game看起來都不是用Pure OpenGL API來製作,比如說像是用Glut % q4 K9 O8 c1 P8 b3 |5 j& d' J( }
來開發,他們是只是封裝起來底層還是需要用到Pure OpenGL的API 嗎 ?
% u% i* G* G. K這樣我寫的Hook才可以通用其他非Pure OpenGL的Game.
9 M3 X7 b# P6 q3 S# A" N" ^. K8 ^5 u$ M7 A
(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
& M+ S5 `0 w. c
# D; Z% G/ I! N3 e' d) O
9 \# Z) Z7 v: i: k! Z! F2 F- b$ E' v: E$ x, W3 R
- R: r, c! e' `8 E
1 ^) i, U" A- M) I: v
作者 : dorkas(aming) * L8 i+ a0 g5 H0 B2 m
[ 貼文 2619 | 人氣 4536 | 評價 11790 | 送出評價 2 次 ] % t* m8 A: b1 ` R% |0 C T
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] ( @! T3 T6 {! f8 ]. Q# b5 g
2006/9/7 下午 05:31:01 ) |' H7 c: s) V) i: j, H. Q9 m
+ \8 a1 N# Y4 ?$ t. M
1&2
: s0 a4 B- P2 S* V' a2 z8 X我對OpenGL不熟...
9 j C7 W/ l) o, i: J V% U1 |3 T! b7 F" t0 u0 V0 F' G. L. c
>(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
. g( Q$ r |1 ^! j$ D8 P
* G+ @ W' y; p5 i) u1 ^4 X; F
' T- r/ M: M+ O7 E初始跟結束都是做一次的就好了 ' t9 z- _, b! o v
你高興要擺在迴圈裡面也是可以 6 R2 G2 a$ P. X# n8 j1 }2 Y
- E* z5 b! d, D' D( |9 b6 Z
程式的要訣就是 起 承 轉 合
' M$ e- Q% {. W, h4 x' M5 O7 Hinitial # I' ?% _5 b' S( [/ ~$ J
upDate
/ P, N* ?/ M Qchange 9 `7 G) U0 ]; S$ {3 f
finish : W( u) T1 K1 [; n, U: e
物件也是起承轉合
: Y w) G) R: S( K+ b2 y函數也是起承轉合
6 x$ y. \1 _3 O7 W6 i迴圈裡面也是 起 承 轉 合
9 }1 C- U# J: E, |9 d5 j0 _) E
0 o" `1 d) _' }3 p' \起
d5 ]; h! \& M7 {* Q8 ]for(起;承;轉) 3 G2 V, s' u4 M" U: z5 ?
{
0 F: k- R1 ~# H4 `起 " ]/ e7 X7 {$ C: V! S9 p/ d$ D4 @
承 / \$ N$ u% B0 M# g
轉
* \/ h2 p4 D, E合 2 s/ y' d3 m$ R3 z: d
} + k5 I! m- O8 M5 \$ |
合 . D0 D" ?( G+ N2 G* n
# V) ]* t( H8 h2 Y7 z" \+ k9 p只要你分的清楚 屬於那一塊的性質就好了 t8 a( x4 J# P; g( y* E. n( n
3 R2 h) S/ o8 f: i3 I0 t- ?1 q( y9 [" G
0 Q0 K0 L. l$ F c9 b s H0 x. ]; b) [& a5 m0 j! H8 C6 K0 g! s z' X
2 K: y1 z' O. {1 g3 c
4 d+ ^: e. t0 z4 A+ V作者 : fushunwu(fushunwu) 0 X: c: e# Z- T+ ]- q- `1 w# T
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
: h& m* E& Y& M' U# H; V `[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
5 y. [9 U/ L$ X2006/9/8 上午 10:32:26
# B/ V9 x0 X6 H2 u) Y# f
" N4 t+ [9 _7 f- c5 B: `8 o恩,還是要謝謝你,目前問題還是沒有解決.Quake4和CS 顯示的狀況還是不一樣~ & {; g( |. \+ ~8 T5 k5 C6 h. t9 u
( ]: w" K! f& j像是Quake4這個Game它就沒有使用到glBegin這個API 所以我hook不到glBegin % ~3 M; p H5 F4 W0 Z
所以我就把顯示字串和BMP圖放到swapBuffers裏面去做,字串可以正常顯示但圖秀不出來
! `8 W6 w2 Q: \! K( w我在想是不是因為座標還是矩陣的問題 ? T7 m' n8 M. |0 ]; A2 U P
/ v7 {% N7 o# B4 m但是CS放在swapBuffers圖和字都顯示不出來,但是因為CS有用glBegin所以我就把同樣的code放在glBegin裏面,可以顯示字串只不過會顯示很多個,我在想是不是也是因為座標還是矩陣的問題 ?
$ [5 l) L, d' l, o! M/ r( n至於BMP圖在CS片頭時可以秀,只不過會秀滿全螢幕而且是顛倒的占滿整個畫面.
: _7 o( `# q: i. J6 T/ P: i7 _( F. ^! W5 m! g
所以我才想說有沒有一個統一的方式可以讓我把同樣的code放在某個OpenGL API裏面去然後每個OpenGL game都可以正常顯示. |