在分析Scratches是我发现这个游戏使用了OpenAL32.dll和wrap_oal.dll。
. P7 _3 E+ D e9 R# j) o所以估计使用了OpenGL的API,以下资料可以作为研究的基础资料。
# B1 L3 B9 P, }! O% j: K) S$ N% [: C6 N" W5 W+ Q3 o
" c& b$ ] m: F1 x; }2 T8 r; X原文 1 J/ g0 G9 A2 U) j" r5 [( F' J
http://www.programmer-club.com.tw/ShowSameTitleN/opengl/1654.html 6 T$ \2 |+ ^9 l# L$ e, y
. y, L$ B! Q# ?1 }& ]- X' o+ ^
大家好, 0 g- c( h5 G6 F! w
* `' Z, e5 u- z' @/ o: X4 D# B我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
8 @3 w: r7 a6 F( e" c* D* m,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....
# n6 t) D& Z1 Z! P$ ^$ ^) t! Z8 K% Z0 U& k$ ?* W. v( q0 L3 Y6 @+ H
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個 4 Q M4 I) Y: Y& o+ w. P$ @
但是BMP圖放在wglSwapBuffers卻顯示不出來
3 {* a% \! h5 M/ }(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一
. u1 R( k+ c$ U/ I% q: w( E樣的時間字串
! W, O! k0 @4 G/ R0 Q$ w
" y; ~9 J1 Q9 @: N5 d! p* G5 z% {/ ?# `. O) \7 d# R
8 x! F L: F/ C0 a作者 : fushunwu(fushunwu) 2 o1 u- G1 ~: C2 w
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
7 z. `! F! P: y- _& ?+ P[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
1 I' v' W" [0 G0 ~, Y2 r2006/9/5 下午 03:21:34 - w( M+ S: ?/ U4 J, v& Q
' V$ ] A7 d$ C2 {2 z
sorry,按太快還沒打完 ..
0 H# v( E* I/ z) t
( G- `) \4 L/ C% o! V我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
) |, `, Z( A0 Q5 U) h: b; k,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....( 我使用MadCodeHook的API)
6 e% B; n( N+ X; V1 a! @" W4 g& s. O! W( P/ G! Q9 m3 t0 Z! j
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個. 但是BMP圖放在wglSwapBuffers卻顯示不出來
& h [" Y$ z% c0 S% C' @7 [! ?(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一樣的時間字串 ; BMP圖放在glBegin中中在cs片頭中還可以顯示,但是圖會顛倒而且會占滿全部的畫面,進入game中再開圖就掛了. % s# c4 e4 M* x6 G- B
; N9 @* n; v1 ~% o想請問各位高手,有沒有一些好方法可以解決 . ) H# _7 g( C( a8 d
5 d# x f% ]/ U7 v" g1 Z: ~6 v0 x下面是我hook opengl API的code :
6 \4 T% A& w; i// hook wglSwapBuffers的code; hook glBegin的code也一樣 5 Z2 o' r+ B% w1 G
void WINAPI wglSwapBuffersCallback(HDC hDC)
3 T# R3 o1 ^2 `' [; r+ f9 f U{ ' b' O* y A8 J! U% z% s+ J: s
8 |' W4 X+ l- x/ i5 ]
if(!ininstializedfontshit) 3 C0 K ?! V8 w1 U. u
{ . s+ ?4 u6 y# Q& T+ K. v- Q) ^
font.InitText();
; x) ^8 h+ h d$ s8 ]ininstializedfontshit=true;
& N9 ?; p' K: v3 `# X}
! {. J+ t! V6 R3 @7 P' G! ^
$ j* j' U4 N$ ^: T# ySYSTEMTIME SysTime;
. ^9 C0 w- C: ~$ s' d% Y" L+ L6 vGetLocalTime(&SysTime);
: d8 K, w- w) x( e. oglPushAttrib(GL_CURRENT_BIT); 2 M4 O7 @3 `; u
// 顯示現在時間的字串 . J/ L; s$ N: u# M" S7 N
font.Print(140,125,255,0,0,0,"Time: :%:%",SysTime.wHour,SysTime.wMinute,SysTime.wSecond); ' [9 K$ ~$ s) ^6 a0 z( ^' K
) T$ |4 A5 H8 O6 ~& i5 m) S
// 顯示BMP 2 \$ G0 c7 A7 z( M- u. b. e
; D! D+ y, C+ P g, Z1 N: v% h( E
byte Texture[]={IDB_BITMAP1}; + R" N) t m' X3 [" l: R( h. j
glGenTextures(1, &texture[0]);
& M$ X/ I2 a) ^2 Q# a. L/ Y2 jhBMP=(HBITMAP)LoadImage(gl_hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0 , LR_CREATEDIBSECTION); / q$ X( F _2 [0 V2 H
' q. }/ X5 E+ w0 H. g: f( s7 y- |
if (hBMP) // Does The Bitmap Exist?
; ^+ m3 m, V$ d0 ~ R$ `{ // If So...
6 ^4 g" O" A# i# ]9 j5 AGetObject(hBMP,sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object 7 H: c* W1 y$ ~7 x `
// sizeof(BMP): Size Of Buffer For Object Information
* V8 h' k# P- l; }5 P N2 T( {9 p// Buffer For Object Information
# c, ~, p1 Z+ J0 F9 DglMatrixMode(GL_MODELVIEW); / r7 r! e+ w" L& ~, [7 x$ ?+ e
glLoadIdentity(); ; i% s3 E* v$ V$ H: n6 C
glTranslatef(0.0f,0.0f,-1.0f);
5 v0 S, l" A; o5 D1 s0 s% YglPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]);
' W g( b; o( N3 j// Bind Our Texture 6 P3 T" H$ E) F" H7 [
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST ); // Linear Filtering
2 J& Q% a8 a& U1 ?' FglTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Mipmap Linear Filtering
; c; I$ C4 }4 t- H0 d. k+ E8 s, \' a' l; B7 U
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, BMP.bmWidth, BMP.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, BMP.bmBits); 5 _4 k8 H' \5 `- y; B
DeleteObject(hBMP); // Delete The Bitmap Object % g7 ?; `, e5 `
}
2 H: P9 x$ D5 OglPopAttrib();
5 ~9 ~3 k, _4 L0 V5 D
2 A* O2 j3 W' f3 D6 S: ?' g* k3 M7 o0 V3 W1 X" f
} 1 `& Q. g4 c* k& G8 S) K- y: _& V
wglSwapBuffersNext(hDC); 6 J: D) O7 t" N: M. E" O# s# S
} ( F0 H+ I5 s/ ~# ^
4 X8 O, n! T% ?) ~5 Z% w3 P- f
3 q% _4 H0 v, ^1 Z! v! g2 A& n7 e- m0 O! J
e* ~! E4 D' E) _, p4 w( c- l7 F
# m. w2 ]+ Z- i4 l# r3 f. G
* `; z6 Q2 i0 x/ R8 V3 d作者 : dorkas(aming) 7 \4 \/ ]4 |5 j z
[ 貼文 2619 | 人氣 4536 | 評價 11790 | 送出評價 2 次 ] ; w: i8 H1 _( y% Z) r7 V8 O/ t; G
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] 8 y. R! T, _- Y" Y# @
2006/9/7 上午 10:30:03 ) Z$ d) g# u+ H4 k) z5 J
* N b6 m, g1 g1 j8 Y) \) E; n1.貼圖動作錯誤 # |8 S, _7 N, M# `0 Y3 f
1 X' F. o6 ~3 L l9 K+ `/ J2.
9 r$ u& g3 Y5 \每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡
) _5 l- @1 T7 C2 r5 ]
) Z1 A& m( { C5 t5 `3 {: T( M( F& X
' y1 R7 ?( k" o9 v! nstruct MyTime
1 i- f4 L( x) C8 q$ e4 U$ ]0 t{
" J0 \% G: T7 Q! b. V* h, Nbyte Texture; - E& A5 k* _! s, Z6 i( |7 r6 H, |2 I( @
FontGL font; 6 Z' P9 w! i0 A* j
void initial(void); 9 X7 p! |4 c& D# `. E5 E; M3 [9 D) h
void finish(void); 7 ]- W% D& N, Z3 ^
void draw(void);
$ s. h1 q' X4 |7 ~};
& W& x" y& ^, \6 i8 ^) x. evoid MyTime::initial(void)
; k/ l$ X7 y4 Y% X6 b{ # c. ?. \* [4 @6 e% s
// 載圖 初始字型
" a+ ~ G4 d& w. ^, k9 p' i2 L9 Qfont.InitText();
2 @) X" Z, d' s+ _4 D4 eglGenTextures(1, &Texture);
- }( U- F+ W2 p8 D8 r/ z} " V" k( t( i- g" I
void MyTime::finish(void) $ K' p) I. L4 s% u) A- c, d, U) m
{
2 }. K1 H. g R& h& H: a; t//釋放圖形 字型資源 8 \7 Y9 z% t" Z
} 6 |) i8 U0 T- |5 C' g% S
( u* ]: L& r6 g5 I
void MyTime::draw(void) 9 a; ]; t8 \* T4 {8 q
{ * c7 S5 [ N8 m3 y; l
// 顯示現在時間的字串 , `$ o/ C* D4 h! Z
font.Print(......something...);
1 f* j& ]" h; }2 ^ b// Buffer For Object Information + q. J% }' u9 x/ j9 i P/ v
glMatrixMode(GL_MODELVIEW); ) l0 L. ^* Z' J; r4 S: b; q6 S0 H
glLoadIdentity();
5 Z8 N3 k" R8 [* H, N" BglTranslatef(0.0f,0.0f,-1.0f);
& Y' n1 Q8 }2 O. X. KglBindTexture(GL_TEXTURE_2D, Texture); ; [) M+ z7 E5 T, j) i+ O: x0 d; O
- c# O8 v+ ~6 ]1 ~7 ]% J3 d9 m3 E2 e..... DrawSomeThing
" Q$ i: B' z8 i, b
+ {# _4 d& j& O1 g/ t( y9 P} ; F! y9 w0 M- C. U w/ H' z' M
1 p4 G& x" @$ \8 o
* N9 l( O9 ^( QMyTime time;
7 K" f; p$ C; k2 X& R' wvoid WINAPI wglSwapBuffersCallback(HDC hDC)
) g- h8 I( y# P+ M. J{ 1 M, I [% z5 |" U- m6 ]. V
time.draw();
, i |+ G I( I& b2 K0 @- n3 Q! KwglSwapBuffersNext(hDC);
# a9 [& S6 h" {% V} ) T! e( e P" `0 |
$ V( p6 x2 N% E9 l
你只要掛進去前呼叫 time.initial(); 2 c- _ [5 d6 n! K9 G
結束呼叫 time.finish(); ! R) ]" u* s5 [) M
: w+ C1 y2 H. ]% I. J( S0 t, ?4 x
0 t4 S, h' B9 y7 a) }( {8 ~/ R. ]+ S! Z! G) j
: ~6 N/ e% w4 l; s* L
作者 : fushunwu(fushunwu)
. Q; c- M4 {# ~* ?+ Z; l0 E2 V[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
6 R$ a7 |8 m7 d/ q9 r$ P[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] ' [8 M: Y" `+ X! K$ i. ^
2006/9/7 下午 04:19:31
: w+ J& X+ }+ ~1 U8 C( o
$ D x4 E* ^& x謝謝. 但我還是有幾疑問想要請你幫忙,麻煩你了.謝謝 ~
# u6 j i" |& t7 w3 J1 l2 c: r; M. F* _, r% m2 u- w
(1). 因為我要固定放現在的時間字串和BMP圖在被我Hook的Game上面,所以我必須要知道那一個OpenGL的API是一定會不斷地被Game來呼叫,這樣子Game畫面才會不斷地更新. 6 Q" v/ X5 @: C9 z$ L: J& r/ j
時間字串也才會不斷地被更新而BMP也會不斷地貼在Game上面而不會被Game遮掉. " W$ a% z; t; e4 g
像是DirectX Game中的Present API就會不斷地被呼叫,所以我只要把現在的時間字串和BMP圖放在這個API裏面就OK了.
6 F* h7 m2 A) \/ g% \$ u8 K6 {; u所以我想問的是OpenGL Game中是不是會不斷地呼叫wglSwapBuffers這個API,讓畫面不斷地更新 ? 還是有其它API是一定會不斷地被OpenGL來呼叫 ?
D) a* g7 r6 u! u3 K9 n5 r M6 _2 C0 \$ }9 v, H2 a
. n- B6 `2 x! o ]' [
(2). 現在OpenGL Game看起來都不是用Pure OpenGL API來製作,比如說像是用Glut
( b2 [- c2 z% E% v+ R來開發,他們是只是封裝起來底層還是需要用到Pure OpenGL的API 嗎 ?
/ C+ W& F9 K8 f+ ^4 g p( O1 G9 {這樣我寫的Hook才可以通用其他非Pure OpenGL的Game.
1 e( s$ N6 \. g# Y+ b
5 \9 m- y0 p% x% A# O' T1 g(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
$ r& G! A9 Q8 V+ @% u. p/ b9 V8 K. @1 O; r4 s% m& ]" V3 f
7 z4 \% t, V, ]* U2 P) N
% S: `% }( `7 c
- \* \$ }9 l) E* T, q' F1 a$ j" ~, A: B. j! U7 x' P0 w6 D
作者 : dorkas(aming) - ~- K: s5 y9 w/ g# {, L _
[ 貼文 2619 | 人氣 4536 | 評價 11790 | 送出評價 2 次 ]
# l/ B# |/ }/ P2 d. R& J[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] / Y6 z( ?$ B$ p/ B
2006/9/7 下午 05:31:01 # b& y5 |5 Q; D5 u/ ~
4 k+ a. j3 K# `: @' ~1&2
6 s% X! @% Z3 t1 ]7 d" `& k我對OpenGL不熟... ( l3 G. E! U; g3 e x' U
) R; `1 y, c! W( h4 f% Z3 ^1 m>(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
: ?% L2 o' M* Y5 }- z4 o
3 L1 k7 v* Z& H- E% f. ]% `, K* e! t" a0 |/ l
初始跟結束都是做一次的就好了 ( ^4 w3 i3 q+ T( z+ J; @6 G
你高興要擺在迴圈裡面也是可以 ) M3 [' q" _8 i& m( \9 W J& S
: {4 D" Z1 }# X) v8 W O程式的要訣就是 起 承 轉 合
# N- |3 a: {6 G% q# sinitial 1 Y# X# v. S& T+ Q8 g7 T/ s
upDate
9 M1 r. A4 _. O" J& \& gchange # c+ b4 ~8 R% M1 \
finish 9 h$ U7 b) n" {0 e/ g7 D- ?$ w+ O
物件也是起承轉合 5 O# H6 l2 r0 M* A: M- F- u
函數也是起承轉合
" C G" ~# N1 v7 D. k+ b& _迴圈裡面也是 起 承 轉 合 & b8 B' p* t( a3 g) Y4 D. U, h
: x! a3 V+ P" _3 t: \; N0 k起
" X$ z8 e" A8 _, W% Z) nfor(起;承;轉)
' Q% W0 f8 |7 @1 ]% g' ]{ : e6 V: e) I) l% a9 L& N
起
: a/ q- E! U# a! P, b承 4 J5 @4 \0 }% b1 P0 _0 R
轉 1 ~& Y6 _) p5 z0 j
合 ) q( `0 I) p2 w
}
2 u+ `+ j3 y& M合
9 B1 B8 l, L- Q+ W/ ~/ f+ i
- T/ }$ f4 G+ [) m A只要你分的清楚 屬於那一塊的性質就好了 1 Q4 y: _8 f& y9 ^
& B0 s3 h$ q2 |& \2 ]8 g; R
9 e0 N. ]1 i, c) t7 j8 y3 T1 Q- s$ x- I
% W6 @; S, p) ?9 g: s4 @; k: n
3 a: g6 X0 u- W8 l4 O7 {. B7 D作者 : fushunwu(fushunwu) ( }, x' F3 [/ n9 N' K$ H6 F* I
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ] 1 z( P- `. D7 ~( Y$ ~: e- h* n: V
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] / f% @. B1 Y; m9 c, z
2006/9/8 上午 10:32:26
U7 X" u2 G7 `# I
4 [) {; ~ i2 D恩,還是要謝謝你,目前問題還是沒有解決.Quake4和CS 顯示的狀況還是不一樣~ ; ~" G& ^* P9 r6 [+ H) \# P
0 p. L; v9 C( b& J# B
像是Quake4這個Game它就沒有使用到glBegin這個API 所以我hook不到glBegin
0 L' N, o7 R& w. o0 v' ]6 _+ @所以我就把顯示字串和BMP圖放到swapBuffers裏面去做,字串可以正常顯示但圖秀不出來
7 k! t; W# W2 r: e我在想是不是因為座標還是矩陣的問題 ? ' f0 G( b' e( t& m
6 z" s4 H/ [! k3 m但是CS放在swapBuffers圖和字都顯示不出來,但是因為CS有用glBegin所以我就把同樣的code放在glBegin裏面,可以顯示字串只不過會顯示很多個,我在想是不是也是因為座標還是矩陣的問題 ? " }: B; V3 w# S0 e
至於BMP圖在CS片頭時可以秀,只不過會秀滿全螢幕而且是顛倒的占滿整個畫面.
5 x" @# e/ | h7 ~' {
$ N" ^5 K4 G% A \8 @4 @' b! Q所以我才想說有沒有一個統一的方式可以讓我把同樣的code放在某個OpenGL API裏面去然後每個OpenGL game都可以正常顯示. |