这篇文章的一些思路和我的某些思路类似,留待以后参考。 : q. F, I3 U9 n, F+ E0 M# h
建议还是看原文,比较清晰,为防止原文失效,贴一份在这里。 ) b5 l' e, r7 r- p3 }- D; a! a
8 Z& g i* m: ^9 O5 {" b1 C原文
! Q. N* j' G2 y. |1 Y5 Uhttp://www.programmer-club.com.tw/ShowSameTitleN/opengl/1654.html
% X9 z/ n+ r0 K& f( k! C
% x m* y$ c/ x* ^大家好, 8 p) A8 x$ Z) N6 K) m
0 [- f2 P$ e7 X% H/ j我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
B) K; [3 T: I1 U2 @/ \$ _& _& s,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....
& d& t. z4 T( w9 Q: a9 m4 W
/ d+ @; P1 T$ w" W& \0 c(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個
- {' u. j% u9 F4 ?/ G 但是BMP圖放在wglSwapBuffers卻顯示不出來
4 M! L% e8 v0 k(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一 1 H g( M. k( v9 _! T2 j7 W) m' O
樣的時間字串
, d+ {/ }. f X+ s* u0 A$ q9 h. K0 u0 [3 Z
7 Y% L% r9 i2 r E2 |
5 e$ m8 l. P, \/ F$ E; C. P) D4 g
作者 : fushunwu(fushunwu) : O- n( t+ V4 g' h- ^
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ] ! \" r/ Y+ P7 V3 s9 g+ I8 u
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] 7 B1 t/ z# B3 k& z
2006/9/5 下午 03:21:34
6 D5 o/ v1 k" n/ F. t% }1 @; R7 o* L5 A
sorry,按太快還沒打完 .. ' H! d7 f& F2 b
% e L+ i% ~7 e# }2 j, ?% Q6 [
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
4 O( R3 d1 D8 j7 D1 s3 X,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....( 我使用MadCodeHook的API) & L% w+ o+ {* Q! ?# ?. N% F
; D* ?: h0 N( ? o* }" ~
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個. 但是BMP圖放在wglSwapBuffers卻顯示不出來
5 Y* V/ I! j& f& W( _& ?# u2 j(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一樣的時間字串 ; BMP圖放在glBegin中中在cs片頭中還可以顯示,但是圖會顛倒而且會占滿全部的畫面,進入game中再開圖就掛了. 3 H) W. j" ]( x5 F! b# {, O
6 [" b1 I5 E" @- W+ G( G a6 Q想請問各位高手,有沒有一些好方法可以解決 . * ~8 r* {2 G7 z7 c3 p
+ K- t6 E! _1 i: W下面是我hook opengl API的code : 3 [) G, q% h% n( R8 l& N
// hook wglSwapBuffers的code; hook glBegin的code也一樣
, x8 n$ p: U+ g$ x6 Zvoid WINAPI wglSwapBuffersCallback(HDC hDC)
# R0 n7 [5 P( S! g- _$ a {
. P2 [7 E+ K `+ Y
) k& T" i4 A0 I" a( ^6 y) W; ^if(!ininstializedfontshit)
q6 w: P( e' g6 d) S7 y5 d) {4 p{
( o( [5 q) c( c N; Cfont.InitText(); 2 l4 [. C) M8 \8 W( \
ininstializedfontshit=true; 3 s% [: r: L5 o2 `3 [
} 1 z9 ?) k l% h' u: A
& ?( B1 [0 m2 L: r$ vSYSTEMTIME SysTime;
6 w2 R5 p* m' x! b) o7 ^GetLocalTime(&SysTime);
N r& W, s" M* u" N! hglPushAttrib(GL_CURRENT_BIT);
* i3 \6 _' N0 q8 x: `, e# I // 顯示現在時間的字串
) N- D _* p. ^font.Print(140,125,255,0,0,0,"Time: :%:%",SysTime.wHour,SysTime.wMinute,SysTime.wSecond); . k! k/ [+ a' N; I; R
$ d: Z. _" X1 z; M) C* p. [ // 顯示BMP 8 n# Q f4 ~5 H/ Q- j$ F& F
; N: F( n d9 {. H
byte Texture[]={IDB_BITMAP1};
1 Y: r$ H9 T5 K" I% N glGenTextures(1, &texture[0]); 1 G2 d# [8 s) c4 L7 g
hBMP=(HBITMAP)LoadImage(gl_hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0 , LR_CREATEDIBSECTION);
, m* _+ a# H- |- W' y- \9 K3 k( o9 D0 l8 m
if (hBMP) // Does The Bitmap Exist?
5 i1 c- h. z: d2 Q7 R{ // If So...
4 @( D' a. T# Z- T+ X, i5 F4 s% n+ O8 ^GetObject(hBMP,sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object
; b% F/ U' d( {! v: Y// sizeof(BMP): Size Of Buffer For Object Information
5 K( M5 c3 d x- b/ c: K// Buffer For Object Information . A: A1 n8 r. ?5 h0 i( p5 h
glMatrixMode(GL_MODELVIEW); ) y4 {9 y2 U# }% }7 z) x0 `# D
glLoadIdentity();
' L& V E3 k2 X( lglTranslatef(0.0f,0.0f,-1.0f); 1 R+ N% B1 z \3 U9 h
glPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]);
+ W- F! @5 i& `" l* p // Bind Our Texture
* R. x/ n6 @1 U2 R glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST ); // Linear Filtering " f) t0 p O' I7 P/ J0 [
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Mipmap Linear Filtering 5 y! Q' n: R5 g! t) {. n+ E& j1 |& V
1 T* H6 C5 A; |' k5 }
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, BMP.bmWidth, BMP.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, BMP.bmBits); , r) V6 {. G9 I0 ]8 W3 K
DeleteObject(hBMP); // Delete The Bitmap Object 1 L; C, O! E9 Z" u$ W
} ; R& C" Q: X) V J, q( o
glPopAttrib(); ( P1 {" w1 _6 b3 L% `* J' A
3 T2 f3 D9 T, Y+ z) ]
& K m \0 ]9 S1 g3 q$ j
}
R, J0 H' y% w5 N& HwglSwapBuffersNext(hDC);
0 w# t2 S- N/ ]" s* `$ h}
+ C% ^( d' r% m M- S' K2 _7 o2 {; b; u# F
( E2 L% F6 v7 G1 E
* P) h* o9 U1 }: G1 ?0 ]0 f2 O
8 Y, v% e: z5 U) I8 O G! U8 i% t2 x! G$ h! N
, t+ c1 P' S" q, d
作者 : dorkas(aming)
5 _' Y& D% a- b' ?" E4 t0 u6 d[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ]
, ^6 f; l3 N; G& I0 B1 U[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] ' t. \# @; L5 F9 h4 h
2006/9/7 上午 10:30:03 2 t1 K1 i6 H7 ~- }( p8 }& L
% d. G3 _' T6 Q8 Q1 \) S
1.貼圖動作錯誤 ' w1 V4 b( _1 r7 t& O+ i
: ?4 l" O0 Z; e# }2.
* l6 v0 c+ ]3 v( g/ R# ]- {每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡
9 i3 k* K |7 P; Z; d1 y9 q3 X% q7 x3 K# R
3 P( g5 i0 b; h! n% o' e9 ]
struct MyTime 5 W* l& y* x# P: D
{
0 w- S& x$ @5 [0 A byte Texture; / F* Q2 g9 d. t# ^& j' Z
FontGL font;
7 Q$ Z& U; t1 o9 ^9 Q2 _ void initial(void); 3 M4 I7 d- _1 o/ H2 [' Z7 J7 z
void finish(void); ; V2 Z* R3 [& \+ c/ V' a: Z- O: h
void draw(void); ) D2 g# N8 H# o y
};
- v+ \ h/ x H: O3 m) f* Ovoid MyTime::initial(void)
! A" R& b8 t8 Q{
/ d$ R) D3 K9 D. z! h. W/ y // 載圖 初始字型
) ]3 |- C0 O) O* x font.InitText(); 3 m7 }; k& w1 N- N
glGenTextures(1, &Texture);
G) `! N' I9 W# a- V2 C! ~} / [9 F7 t: T6 k0 {% p+ c4 @. P2 M& Z
void MyTime::finish(void) ) J/ Z9 I) U, Y* m) T
{ 1 C- o2 W, {8 c3 q6 l
//釋放圖形 字型資源 ; l9 N/ [6 L K# D2 m* ]
} ' M9 u% Z# G' ]" Q6 V7 x' Z6 o
3 b# Q& {; V1 K, Lvoid MyTime::draw(void)
i, ]- }1 y2 R/ s, Z. I{
I$ ^- u5 @% p" ~- I. i // 顯示現在時間的字串 6 G' T4 o, h. O; B5 S
font.Print(......something...); 7 N7 B& j& b4 ^' _
// Buffer For Object Information & q/ e$ G4 }4 I0 m: v
glMatrixMode(GL_MODELVIEW); 1 }7 Z) q" ?$ h; n
glLoadIdentity();
! _$ y& R8 [) [) d8 F glTranslatef(0.0f,0.0f,-1.0f);
) y+ P, s( W& ~/ W: y& R2 o$ n glBindTexture(GL_TEXTURE_2D, Texture); $ q. o5 N6 z; S/ D& J( D) f1 p/ _
4 M) f' t/ w `2 v8 @
..... DrawSomeThing ! }. [- |1 W( G" s( {) F
4 \5 p* M7 _+ G. f1 I3 R* G1 l}
+ e7 _' l8 f( ~: Q
' M: n# b: _7 A8 ^5 w5 Z; W
0 X1 a# {/ s4 ?6 C+ OMyTime time; 2 r# W7 i# K0 N7 W+ ~1 h- u# B
void WINAPI wglSwapBuffersCallback(HDC hDC)
. m2 x1 c, d5 @' k{ 3 x! g! V! o+ ]! E6 k1 s
time.draw();
% p* Q/ W+ g7 L$ e9 y2 l wglSwapBuffersNext(hDC); - f8 S! [/ R0 S% [6 q# _3 _0 G6 B7 H3 v
}
1 q6 o* O5 ?( L$ p$ a' F0 N: j$ O9 N* i6 b" m
你只要掛進去前呼叫 time.initial();
. g3 j4 {6 I; k' {! `結束呼叫 time.finish();
3 j0 p8 J. ^ Z( j
! D6 R* o& @! J( |& Y- _ P, u) |1 _+ h
0 k! T! `. X- s; J' y i' u
. W2 H$ w- S: B q作者 : fushunwu(fushunwu)
?2 Q3 ^' e3 Q! Y& l* l[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
$ F% G* Q( K" h9 P[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] ; C: F5 H! Y* P. N
2006/9/7 下午 04:19:31 , t6 [" v1 _0 \1 O. z. T R
& x* v! d# C' j3 O- b6 h1 M! f$ H謝謝. 但我還是有幾疑問想要請你幫忙,麻煩你了.謝謝 ~
0 j, e$ B, F1 k" x ^- ?/ U; Q
; H$ b( a0 v3 j: C5 a(1). 因為我要固定放現在的時間字串和BMP圖在被我Hook的Game上面,所以我必須要知道那一個OpenGL的API是一定會不斷地被Game來呼叫,這樣子Game畫面才會不斷地更新. 1 W# |! q5 z; L2 }9 I% R
時間字串也才會不斷地被更新而BMP也會不斷地貼在Game上面而不會被Game遮掉. ! {+ ^" `! r- P/ s; ^" H
像是DirectX Game中的Present API就會不斷地被呼叫,所以我只要把現在的時間字串和BMP圖放在這個API裏面就OK了. / U3 S# {2 w. ?; ~3 a7 H7 m+ P
所以我想問的是OpenGL Game中是不是會不斷地呼叫wglSwapBuffers這個API,讓畫面不斷地更新 ? 還是有其它API是一定會不斷地被OpenGL來呼叫 ?
* {" ~# M/ B4 k! @" G6 o' u, K5 ~# E2 _+ D4 B
6 R. H' Z0 ?8 N2 m; Y3 v. }(2). 現在OpenGL Game看起來都不是用Pure OpenGL API來製作,比如說像是用Glut * z# h9 `" Q8 |2 H2 B' H
來開發,他們是只是封裝起來底層還是需要用到Pure OpenGL的API 嗎 ?
, v, T# _6 g6 O6 I# ~ 這樣我寫的Hook才可以通用其他非Pure OpenGL的Game. 3 D+ _1 u$ s8 [4 G) N; A
* Q+ m5 K1 e1 O' h4 G# U# f
(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
5 W% X1 _ a h T4 \ a
: i8 O, W# Y& b; g( S' R6 u# [ G
" u$ ]9 f+ C+ a9 r0 ~$ }5 g7 C% X6 e
% W6 x7 f# Q0 H2 `7 G5 [
# H" B7 _ S! i- ?作者 : dorkas(aming)
6 O Y7 X G) J2 N9 i! _/ R[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ]
' d! L& k4 v/ z4 b+ y7 I[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
# u. H# J# R+ c4 b$ P2006/9/7 下午 05:31:01 ( K+ s8 g) s6 K; P) D
4 g% ^6 r t# n% p7 j5 x1&2
; Z& J& |( a1 F/ h2 ]我對OpenGL不熟...
1 P% [- F8 b6 |, l$ r9 j# ?& q0 E, }2 r' H
>(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
% W6 v1 j0 g# [" c7 k% j, X" ~ |8 {6 \6 Y9 y; D/ ]5 h' I1 p
+ S+ ~/ D. i/ @( N; e7 ^1 s
初始跟結束都是做一次的就好了
8 D: v! F# ^; \6 O3 h你高興要擺在迴圈裡面也是可以 ; a! b' d. ]" @" `1 N3 I f. N
" c) g- U# j* o( U5 S; J
程式的要訣就是 起 承 轉 合
8 Y0 w2 r8 b* Pinitial
0 m4 ]& R, \' C$ q) ?/ I7 JupDate
; A P& u# {+ s0 |6 c# @ {5 |change
* G" h+ t( s$ @! lfinish
" j1 q9 y% w- g4 a& M' y物件也是起承轉合
* V% C0 X {( p% S0 B2 M函數也是起承轉合 $ U% S6 I6 U3 {# I+ Q- |
迴圈裡面也是 起 承 轉 合 ) r( Y* [. L4 L- H$ C H6 C
9 Z) W) e5 P6 j; X起
( M5 C/ }) m5 D: ifor(起;承;轉) 4 \! Z( k4 H/ R0 m
{ # a2 S; Y8 j3 P( M
起 , P3 l4 O5 L+ m; L, q
承
4 {8 D4 x0 ?$ R2 f轉 + s+ ]" {4 B- n! U
合 5 J* ~& ]6 O" c! W
} / d2 {( L& q: I2 l; Z, v: a
合 / G! m3 y9 h, O
6 T' R8 O6 h$ H
只要你分的清楚 屬於那一塊的性質就好了
/ A8 D: k# i1 W6 z: ?
" u3 x7 c* T# _( }- Q. B. ^* ~/ {5 W3 h O E
1 [- s: Y. b( \1 s; P8 T9 A$ U4 v
2 v; Y# G- m0 K6 F q5 N( v1 g+ r$ ^ X5 z6 @9 b J4 g& ]1 V' h
作者 : fushunwu(fushunwu)
5 U( }: M- h6 E: n/ @) p[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ] : ~7 H% y: O z% D
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
: m# c( S8 A" N& H2006/9/8 上午 10:32:26
7 X6 u8 ?) j- c( F+ X0 d- ?( c; L. H1 L
恩,還是要謝謝你,目前問題還是沒有解決.Quake4和CS 顯示的狀況還是不一樣~ ; K- e+ \7 [. r' J7 Z7 q1 A
+ O9 q$ O5 i7 ?+ g, `& h/ O2 z) \
像是Quake4這個Game它就沒有使用到glBegin這個API 所以我hook不到glBegin * \8 q3 H: R& l
所以我就把顯示字串和BMP圖放到swapBuffers裏面去做,字串可以正常顯示但圖秀不出來 # V+ t' H5 P& U! y8 O/ u' h! T
我在想是不是因為座標還是矩陣的問題 ? 7 N W8 p3 C5 P1 E$ D2 [5 w: \
5 E# L0 R! j' M, p2 d' L
但是CS放在swapBuffers圖和字都顯示不出來,但是因為CS有用glBegin所以我就把同樣的code放在glBegin裏面,可以顯示字串只不過會顯示很多個,我在想是不是也是因為座標還是矩陣的問題 ? 3 }8 `) k u3 _0 ?
至於BMP圖在CS片頭時可以秀,只不過會秀滿全螢幕而且是顛倒的占滿整個畫面. # b3 N( g+ W9 ?5 K$ o
7 g6 G7 r/ E! v( r
所以我才想說有沒有一個統一的方式可以讓我把同樣的code放在某個OpenGL API裏面去然後每個OpenGL game都可以正常顯示. |