在分析Scratches是我发现这个游戏使用了OpenAL32.dll和wrap_oal.dll。 : {0 h7 ]& k$ q: ?% A S- c9 y9 C
所以估计使用了OpenGL的API,以下资料可以作为研究的基础资料。
/ q- p+ B0 Q4 D9 A1 J$ b0 J6 }7 H/ @2 Z+ c8 G. ]
7 r/ s% a2 U5 K8 u; d+ b, a原文
$ ]' I1 F- z* P! r2 yhttp://www.programmer-club.com.tw/ShowSameTitleN/opengl/1654.html / o9 ]/ r2 Z$ a% w6 A2 ~% r6 \
1 C2 h0 ? H9 ?
大家好,
0 R* y# p( Y0 _/ M3 Y: w% n( n, g# B* R$ p
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable " e0 h, C. B5 [0 }3 U" S
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....
$ S J! a! m% p! g( Y7 S' P) k0 S6 |+ m, D
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個 0 @: ]. X' L0 l6 i( O+ f; m
但是BMP圖放在wglSwapBuffers卻顯示不出來 ' C4 @. C% Q0 F1 C" l( x3 V! v8 [( f
(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一 0 A+ c. E3 l% h1 [0 c
樣的時間字串
; G, V3 k4 W0 W5 C; ` m2 y& J7 r' N- l7 ~( ^4 `- \
& b) v1 h2 E. y4 S1 X
5 O, y y& o/ ~1 j: L7 o+ T; i作者 : fushunwu(fushunwu)
1 r4 i2 m* d( y3 K- a) [0 q* d1 H# t[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
8 a9 f# X$ ~/ [+ H6 d9 E( X[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] , {5 w& A& ?1 z1 I/ G
2006/9/5 下午 03:21:34 - R5 R( |! J0 b% C; @
( t* _; E+ Q5 _& G
sorry,按太快還沒打完 .. 4 v" E3 X4 C4 e- W
5 |3 \* J) F/ z% S& Z我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable 7 y) Q n( `9 O
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....( 我使用MadCodeHook的API) * M' l0 e, K5 e
4 L. L3 p5 L* F
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個. 但是BMP圖放在wglSwapBuffers卻顯示不出來
- _8 z* \7 T, _% P# ?, J8 Z(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一樣的時間字串 ; BMP圖放在glBegin中中在cs片頭中還可以顯示,但是圖會顛倒而且會占滿全部的畫面,進入game中再開圖就掛了.
. L; L/ X1 _% d( D" T' j9 d. r4 C, P' O: D. y& g
想請問各位高手,有沒有一些好方法可以解決 .
: O' L' J, N7 M2 L/ T/ |' A% }( O
下面是我hook opengl API的code :
: a$ n1 P5 a/ e* J// hook wglSwapBuffers的code; hook glBegin的code也一樣
& q% I8 |2 A& K4 cvoid WINAPI wglSwapBuffersCallback(HDC hDC)
$ F# D2 A5 u# [! w' F! C, W{ ' X+ D J* p4 T* s3 M- v9 x- p
4 S, v* G* J" }% R; v8 o# P$ E" Xif(!ininstializedfontshit)
5 B w1 u/ I+ _& {) f* Z- r{ - ]' ]) A; P/ b+ C8 \, C5 a
font.InitText();
% u& E& ?1 i4 n% P Bininstializedfontshit=true; + Y3 K3 ^2 O% g- J
} & z% q- V; v* Q* c; o' }# m5 w
1 [* h7 ?9 \- c# E
SYSTEMTIME SysTime;
0 V! s+ e T$ p! p7 }- @GetLocalTime(&SysTime); $ Z+ S3 v; D# i9 g
glPushAttrib(GL_CURRENT_BIT);
: a+ E# ~( I- H( W5 M# \// 顯示現在時間的字串
/ a9 M* V9 ]4 \. A0 tfont.Print(140,125,255,0,0,0,"Time: :%:%",SysTime.wHour,SysTime.wMinute,SysTime.wSecond); 9 `3 n; |. B; X0 A$ M6 j
$ _$ I7 @. D% ~- P: c8 h. z// 顯示BMP 0 q1 }0 W) Q7 X0 x- n4 h) M! q
u X- h" B, l v) E
byte Texture[]={IDB_BITMAP1};
2 E) i, i- v2 ^, @glGenTextures(1, &texture[0]);
. H) `# ?: M+ j+ p( Z0 j* O% lhBMP=(HBITMAP)LoadImage(gl_hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0 , LR_CREATEDIBSECTION);
- J. C: C$ C5 P+ G u# V: C& U2 J7 u6 d
if (hBMP) // Does The Bitmap Exist?
2 C8 Z: |$ L; A" r s( i{ // If So...
+ M0 M, [+ k! Z! \0 w! c' uGetObject(hBMP,sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object
" t" u5 w6 ]- C( J// sizeof(BMP): Size Of Buffer For Object Information ' `- ^9 r8 V5 I: }
// Buffer For Object Information 6 o* l& o/ H' B1 s/ O, u! C3 S
glMatrixMode(GL_MODELVIEW);
& N U- P* l3 m9 @! XglLoadIdentity();
/ r7 X/ y/ a+ KglTranslatef(0.0f,0.0f,-1.0f); 3 I: H# v- h2 Y/ i
glPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]); 5 w, n1 f; d/ {1 |% ?
// Bind Our Texture
J6 s" N* l* h; Q9 f! }) ZglTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST ); // Linear Filtering 4 S4 U7 C+ a( b# d, a+ Q
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Mipmap Linear Filtering
. U0 d3 r* Z+ {+ c7 a8 r. |1 H7 X% n$ k
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, BMP.bmWidth, BMP.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, BMP.bmBits); , {4 u! X; B; f: `# Y' }5 c- z
DeleteObject(hBMP); // Delete The Bitmap Object
2 O% `' R1 F2 |: |" b3 j} 2 @% E5 M5 Y3 ]
glPopAttrib();
) K* ]; [: i2 l5 l- m
+ s4 l" l4 ^5 D f- i( k$ a7 m: O% |" _$ \) l# J
}
- g4 y, n4 j: G1 G' ^% x6 X B* K/ mwglSwapBuffersNext(hDC); ) H- T$ p5 Q0 w& t
}
0 C9 F9 O" ]( ]# h3 m g' x% T! e5 C' @1 a. r# g% |( }- V$ N$ b% `
) I1 o, H, p7 C# B$ ~
2 @; r0 ~$ j6 r8 F" N; y/ M- T; d0 K
U& U( e+ u } n/ x( l4 n/ \3 G8 i1 x9 y+ }
作者 : dorkas(aming)
1 S" R7 @4 i2 s+ t[ 貼文 2619 | 人氣 4536 | 評價 11790 | 送出評價 2 次 ] ) s3 ]# g7 I, f( b2 n" p# n
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] ( @: T/ M0 w: z" v3 P2 N
2006/9/7 上午 10:30:03
% ^: c" M# `" _9 Q V- [: } g+ L# O) n. S% B+ v) f; X
1.貼圖動作錯誤 2 C/ m( V7 @8 C3 z
* X5 k0 B7 D! ^5 F; ]# ?2. % A( ^* ~! ^ {) J
每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡 8 t( h1 M8 L0 i: ~; o; }
~5 t' _) P9 B* N( ]
" O0 I, H; A2 l5 B& i
struct MyTime " {, `% l* [, O
{ 8 T5 @6 F4 w2 l! g1 C0 M1 U
byte Texture; 7 H& u( V) y% W4 _1 h
FontGL font;
! t* K p* _, i! K. _4 d* ^9 f: fvoid initial(void);
4 R* J( A* b: _! t# u S1 Z8 ]; k2 \7 q7 Fvoid finish(void);
: t5 C( O. K. ?. Ivoid draw(void);
5 K& y1 T8 u5 T. r' Q}; " ~5 F$ G) p6 ~6 B( j$ |. I7 N
void MyTime::initial(void) 9 w! M( @: s; o/ Q; U
{
- x, ^! {8 M5 \1 v// 載圖 初始字型
$ F7 ?$ k/ o! s8 Afont.InitText();
8 S# T! R# m* k0 j: A+ VglGenTextures(1, &Texture);
4 r. h5 J- i! A9 w8 |$ Y}
+ o9 K7 B1 U N2 Y( N J! lvoid MyTime::finish(void)
4 B, `$ Y1 [" D A1 r{
) ~: F9 Z; R/ ]//釋放圖形 字型資源 ' Y' D# @* y: O( H
}
O# M. r, C* U
" ~+ m% B u2 W/ ~6 Uvoid MyTime::draw(void)
( ?5 H: s& w& I7 |& u' P{
1 e/ S/ Y7 T$ c% T- L) M// 顯示現在時間的字串
[% s7 C8 p1 c' ffont.Print(......something...);
! `1 M9 [& |& J4 Q3 _# V4 S// Buffer For Object Information
- { N4 x, b; t* |glMatrixMode(GL_MODELVIEW); ( V& V1 Y1 j4 q- w8 c
glLoadIdentity(); ) E; g' K6 k; t. [( A1 V
glTranslatef(0.0f,0.0f,-1.0f); % }5 ], e; o1 q7 x0 x
glBindTexture(GL_TEXTURE_2D, Texture); ( |- y* X# r9 M4 w
x; `# V8 i5 B1 b( h* E7 f- N..... DrawSomeThing 3 ?, R$ A: p' f- B) T
3 o, C: F) T- e5 {
}
% w$ n0 X$ L% V$ ~8 G2 L3 G' n8 M- ], v6 W* c1 V
$ z! _* M2 j9 b
MyTime time;
/ \7 I" J g3 k! d, Q, Z- ivoid WINAPI wglSwapBuffersCallback(HDC hDC)
& ?$ D$ c1 o- v8 k{
6 ]; K3 Z: s0 D, v7 l& etime.draw(); 2 q% Q7 ~; g+ }+ f
wglSwapBuffersNext(hDC); + `- y! ~4 m! [1 V/ a
} # e" O% B0 f. t3 q4 l" n5 q/ R
3 h5 L9 S. N7 L$ [: L
你只要掛進去前呼叫 time.initial();
- O7 U. p& E. G3 @結束呼叫 time.finish(); 5 v4 \9 i' B( q2 @0 I8 {
2 N' d" a+ w/ e6 Y. [
5 Z9 m$ }* ?# W& {* H$ n9 x
4 q, X' S: a1 H& U, t
5 R" s8 R+ A0 @% Q" F- }作者 : fushunwu(fushunwu) 3 P& {4 H5 x3 v4 y
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ] % `, o# l- B* I6 J# [# W' a
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
" Z% Z/ t: X- \+ H2006/9/7 下午 04:19:31 & U, `% Y3 K0 U% U6 ?( n! Z2 {
2 N v1 L4 j4 V5 M& ]
謝謝. 但我還是有幾疑問想要請你幫忙,麻煩你了.謝謝 ~
' }/ b0 N7 Y5 e* }
`: E, w& j3 H4 I' c/ [(1). 因為我要固定放現在的時間字串和BMP圖在被我Hook的Game上面,所以我必須要知道那一個OpenGL的API是一定會不斷地被Game來呼叫,這樣子Game畫面才會不斷地更新. 1 |) z" C, C, x+ L( L. p2 K) L
時間字串也才會不斷地被更新而BMP也會不斷地貼在Game上面而不會被Game遮掉.
, ^$ K3 {7 Z# x像是DirectX Game中的Present API就會不斷地被呼叫,所以我只要把現在的時間字串和BMP圖放在這個API裏面就OK了. ( m9 \9 s# R2 u6 v# F2 G
所以我想問的是OpenGL Game中是不是會不斷地呼叫wglSwapBuffers這個API,讓畫面不斷地更新 ? 還是有其它API是一定會不斷地被OpenGL來呼叫 ? / C" x( d" D+ h& L1 t9 o
; t( B& l; J3 _: u0 @* W
: O+ s% l, L: h2 N: v& e a(2). 現在OpenGL Game看起來都不是用Pure OpenGL API來製作,比如說像是用Glut
5 r0 H# }+ I. ~來開發,他們是只是封裝起來底層還是需要用到Pure OpenGL的API 嗎 ? / |0 V( ]; J( W* E
這樣我寫的Hook才可以通用其他非Pure OpenGL的Game.
& D# R/ |+ X9 [( S b
y% t: @0 ~; B- ?(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
' M9 g/ ], v6 x; P# W! H
# @8 d) k, d0 i6 p! O7 Z3 H2 x: i. m" Y9 u! C
& ~! A+ X7 o6 N# t5 A! F
! J" c1 ~. J% u. @/ {+ Z4 J) q4 o; q" k5 e) |
作者 : dorkas(aming) ! V" ^* u& [* h4 I! f, c. b7 S
[ 貼文 2619 | 人氣 4536 | 評價 11790 | 送出評價 2 次 ] . T# q! S6 A2 v5 b8 S6 b+ J8 O3 v
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
+ f- F( t2 F( Y2006/9/7 下午 05:31:01
% X4 X q" M7 P" c
$ u/ E* ~, M8 g+ F1 d8 ]1&2
, l: g$ w- q$ P5 i5 u" l我對OpenGL不熟... . L6 x8 c4 {- _6 |3 X8 R0 D
+ O3 H4 j! Z" b$ V& w>(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
8 R" x& z. K l% I' X q
: j, r/ x# t! z& |# i6 P
0 G& w; R% i1 z- Q3 T* k初始跟結束都是做一次的就好了
. e* \( Q( A4 w: @" Y. F你高興要擺在迴圈裡面也是可以 & E$ A: D1 z$ E+ w) i
5 f- ?" y$ \, Y
程式的要訣就是 起 承 轉 合
( {3 _, e' {7 [initial & o! B6 ]/ S0 j/ `2 t
upDate . `/ `' q6 n( T8 q$ T$ ]
change # W" d. p D2 |- b- d! a
finish j' @5 d _! V/ N" e
物件也是起承轉合 ! M4 W& Q3 X9 P3 }8 e; b/ T
函數也是起承轉合 0 R0 M. k7 P/ d2 }9 [# \
迴圈裡面也是 起 承 轉 合
6 G& i) @" k- t% W! h) w8 o$ r
6 f4 ?3 W$ u; P. d7 y起 9 L3 O F% h2 Y5 p
for(起;承;轉) , C1 U: |0 K7 X) z' {
{ " z7 Z5 {0 q" U7 j) N2 l' G- v
起
; h/ K( g. m5 o- R) k9 z# x d承
' h) J# J* F2 u轉
9 n0 y7 `( S* k7 r合 7 R+ P& S. h1 D: q* C! p; i
}
; ?2 C4 ?9 D; D8 j, a7 E合
; D, m, V# W/ h$ ^0 ?
& D- x8 N# Q& ?/ r只要你分的清楚 屬於那一塊的性質就好了
5 S& ]+ l" |# p; [! A' q* Y2 C: d
" u& A i$ w, D3 }# N
* k7 h$ g$ ~' k$ _0 u
; O' a& W6 f" M4 O* H' O4 E( D0 P- f3 f1 p
9 z3 |4 X* ~+ Z2 X, b& Y0 Y
作者 : fushunwu(fushunwu) % ~0 {- M* E, b3 X% x
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
4 B0 q- T" W/ ~) T+ S; e+ w[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
. W$ Y; y- P+ V+ g2006/9/8 上午 10:32:26 1 E* c/ \# A% O& `8 }; n& W" u
- P4 a$ a R8 S3 A3 w恩,還是要謝謝你,目前問題還是沒有解決.Quake4和CS 顯示的狀況還是不一樣~
) m$ m/ |# T: x
8 g/ M! X3 B9 M- s像是Quake4這個Game它就沒有使用到glBegin這個API 所以我hook不到glBegin % P: X7 |+ R9 m+ Z& }+ e
所以我就把顯示字串和BMP圖放到swapBuffers裏面去做,字串可以正常顯示但圖秀不出來
# S) J$ O# e: s+ v我在想是不是因為座標還是矩陣的問題 ? 0 o& f2 e4 t) P" W$ t( X" w) k. [
$ l. ~" a9 a" V: b7 J但是CS放在swapBuffers圖和字都顯示不出來,但是因為CS有用glBegin所以我就把同樣的code放在glBegin裏面,可以顯示字串只不過會顯示很多個,我在想是不是也是因為座標還是矩陣的問題 ?
' p5 T2 b8 d6 K! l+ y& W至於BMP圖在CS片頭時可以秀,只不過會秀滿全螢幕而且是顛倒的占滿整個畫面. $ _" x* w1 e' b6 T! M3 J
L9 U( z8 z) `* o W; C4 }* x所以我才想說有沒有一個統一的方式可以讓我把同樣的code放在某個OpenGL API裏面去然後每個OpenGL game都可以正常顯示. |