这篇文章的一些思路和我的某些思路类似,留待以后参考。 ' \! _# d' a8 n2 t5 V( r. T4 b
建议还是看原文,比较清晰,为防止原文失效,贴一份在这里。
* `4 D! K8 H* w; h# B' v; W" b' ~( ?) f% z {: L& ?0 p
原文
) u' S' ^5 V3 {1 M: h& r2 fhttp://www.programmer-club.com.tw/ShowSameTitleN/opengl/1654.html ; j. R7 r3 a7 N, h
' S# U7 Z5 [: v5 W6 p大家好,
) _# D4 e; Y8 m! u* @; @$ B+ r, _. p' X
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable , u" \2 d, S. z- i' H
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣.... # q! |$ B6 }! ^
2 I4 w5 @" P4 K
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個
+ ]5 T0 L+ V' o+ A" W 但是BMP圖放在wglSwapBuffers卻顯示不出來
- z0 P. ]( G0 E(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一
( ], w) [ w9 r4 G樣的時間字串
3 I0 L& o6 I, i! N" ^ f N, j* v8 |, A$ B/ h. @: C
% O, W- L7 Z8 y. z* s4 [8 J8 |" q+ W4 i8 B* Y
作者 : fushunwu(fushunwu) , G7 g) R2 ~8 y% s7 @* N) C; I$ `
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ] 2 L$ a$ W9 J6 K6 h; b0 g) T* c
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] : P1 E* h# {5 l _7 f" Q
2006/9/5 下午 03:21:34
2 r \, N1 _, n! M6 s9 T7 a3 p. t, Z8 |
sorry,按太快還沒打完 ..
! N0 i% ]& Q4 Q, @9 S( f- O4 e; A! z' o6 A, c' l1 j: ?3 U
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
6 r% v5 W5 \: `* Z: p% [,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....( 我使用MadCodeHook的API)
$ \3 R& l1 `& ~ K" l2 Y' f d4 ]9 f# Q6 @7 S& l2 T3 Q
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個. 但是BMP圖放在wglSwapBuffers卻顯示不出來
' o+ [; K, j9 g4 b7 N% C(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一樣的時間字串 ; BMP圖放在glBegin中中在cs片頭中還可以顯示,但是圖會顛倒而且會占滿全部的畫面,進入game中再開圖就掛了. ' c) @- o2 p9 O2 g
" L" f- K# Q3 R$ k7 u
想請問各位高手,有沒有一些好方法可以解決 .
' S2 X0 ^, s4 i
8 i1 z( B. U8 w. U下面是我hook opengl API的code : + F; i0 V$ l2 _$ a" U
// hook wglSwapBuffers的code; hook glBegin的code也一樣 $ q& i2 S# i: @' Q4 H
void WINAPI wglSwapBuffersCallback(HDC hDC) : b' g2 O& }* k7 d3 q# f' c( e& r
{
2 N) n# f3 B+ ]" j
3 ]2 t. K* }3 F8 k# H2 rif(!ininstializedfontshit)
, L: W3 }6 |( B1 F{ # ?3 X6 U0 T/ E7 R0 z( T
font.InitText();
$ e# K$ O8 e: S6 ]) @* Fininstializedfontshit=true; - V# ^" t1 [2 S1 Q- S# t
} ( S* t1 K T4 B
! s, E9 s- a% U! H B& gSYSTEMTIME SysTime;
; U. L2 d7 a; {1 z9 P# I; DGetLocalTime(&SysTime); - J8 y8 Z. r. L9 L
glPushAttrib(GL_CURRENT_BIT);
* m( T" z+ C9 o4 e8 z R // 顯示現在時間的字串 ) x) j9 e5 A$ Z2 o
font.Print(140,125,255,0,0,0,"Time: :%:%",SysTime.wHour,SysTime.wMinute,SysTime.wSecond); ; t! D* n$ D1 \: Z; H
! l! n, G" \, y9 [% c& S1 w // 顯示BMP 9 p$ L, B4 P$ c: `
& K$ T. W2 ]* Z, c6 ~ byte Texture[]={IDB_BITMAP1}; 6 \6 T1 x) ^9 T$ J5 ~
glGenTextures(1, &texture[0]);
# k' ~/ w, J4 jhBMP=(HBITMAP)LoadImage(gl_hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0 , LR_CREATEDIBSECTION); # V% T$ {+ C* N J
! \- c, t7 M- |5 H; B( l
if (hBMP) // Does The Bitmap Exist?
" s: H8 L& N, c5 s2 v, M{ // If So... : b! y- j% z$ J2 r) t* J, A
GetObject(hBMP,sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object
* c% Z/ f8 z1 m4 |( x G// sizeof(BMP): Size Of Buffer For Object Information $ w( Q' m; a1 F* b# ?
// Buffer For Object Information
1 Z5 F8 I, g1 f4 O& @glMatrixMode(GL_MODELVIEW);
) W ~/ a! I* t) {glLoadIdentity(); & F- H! h' X: k
glTranslatef(0.0f,0.0f,-1.0f);
5 F7 H" Q B; Q5 t+ w: d$ J7 c+ LglPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]);
2 @! r: ~* ?2 A) F: G# ? // Bind Our Texture : j& s( r- b+ _5 y# M
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST ); // Linear Filtering
$ ^7 ^# i! I" k9 v' F glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Mipmap Linear Filtering / C% g. r8 a4 g0 s. L( q
5 G% [, p% u; m. R5 k
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, BMP.bmWidth, BMP.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, BMP.bmBits); m+ E) N7 ?- k6 E7 r) ?
DeleteObject(hBMP); // Delete The Bitmap Object # m1 r* C4 ?* ]% U: S
} , m, g3 e) R H* q2 C4 d6 S
glPopAttrib();
. a8 M" j; C7 ?: c6 ?1 e
2 H r4 ?: I' [+ Z& K- M
c: p) q d4 K8 _- J& B} ) S" e. v+ [& r" _
wglSwapBuffersNext(hDC);
) _0 n" z9 T4 J} . `0 U! x( ?+ h' Y
0 @4 U% g T, V* ~/ w* p. [. F
* j$ ]1 D) n" m1 z- X5 r
: c" z3 @ D# }4 G& ^1 O- _* V& X- V5 u0 @
" n- J" z" B- `( ~' E
; r2 X& P( F2 Y9 K- s* I9 p作者 : dorkas(aming)
5 ?) O7 d5 z! d8 y, y* N$ y0 w[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ]
3 x3 u$ L" p5 v3 O+ W2 ^" B[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
' n! o( x0 F2 S/ P4 i ^2006/9/7 上午 10:30:03 2 L' Y; o o ~& W
( P K4 K4 Y( z7 P* ]' k6 S1.貼圖動作錯誤
; s7 V: t/ K* q5 [6 V
- Q& A& w2 L/ Z7 L2.
' Z+ r2 P" I% u3 i; E3 ]2 m每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡
, A% Y3 H# ]& U5 `; K- K1 O; U# Z! A
0 f# J+ j( _6 X2 Mstruct MyTime 3 y, |! O5 T2 }, y; _0 O. K) |
{ : R. z/ j' n. b5 t! b( u
byte Texture; / S. s3 f# i, c, j& I
FontGL font; # j8 s1 x5 T# Z8 H& `
void initial(void); v7 P7 U1 U1 q5 L
void finish(void);
' Y5 q, a, b" j0 R6 h) O void draw(void);
) }# l* p& P$ U$ ] @};
, F1 } I: s! P; @void MyTime::initial(void)
8 z* g8 D# }( i% F{
G8 s* `3 m( o- d. Q // 載圖 初始字型 5 X% _2 Z! w% a% i0 i; \6 }4 x+ q
font.InitText(); : d- o; o' R9 T
glGenTextures(1, &Texture);
& {5 @$ ?, f$ E+ ?7 V7 Y) a} e0 b7 u" Y3 F/ g7 q0 g8 B) x. |
void MyTime::finish(void) 6 `" v2 R1 S. {+ T, ]" k
{
% \- F1 N( u) Q, E' K0 [" s //釋放圖形 字型資源
) r* A+ N8 T6 K0 u}
- E; `9 Y% t- S( Q/ ^) i% E/ C$ b! A( C6 }" W) R( a
void MyTime::draw(void) 4 q1 X h, Z& g/ u& w* M
{
, n+ i' l7 f" g4 {/ \& h$ h // 顯示現在時間的字串
. u' U- ]2 i! _3 b font.Print(......something...); 8 [, Y) D7 ~* ?7 h+ n5 z+ C
// Buffer For Object Information ! E% V; X X# {% k5 K$ v$ p3 @. B# ?
glMatrixMode(GL_MODELVIEW);
' C9 L4 |. O: v1 U glLoadIdentity();
8 }3 X1 ~ q6 y0 ~6 S glTranslatef(0.0f,0.0f,-1.0f);
( J, @+ _1 B z: v7 A glBindTexture(GL_TEXTURE_2D, Texture); ; M& Z& C* s% @1 w# H6 x0 v! \6 z
1 W v- X X- z ..... DrawSomeThing
$ V% z$ ~+ H+ I T9 \ 7 s% F7 ]; ]& L& ]3 j4 n
} # s: {6 Y2 e+ E8 F* E! S
( X, B j- i E7 c9 O* B
; O4 r- e) N; j7 u7 MMyTime time; $ s( ~, j4 P2 n( j4 l# e
void WINAPI wglSwapBuffersCallback(HDC hDC) ' E3 H ?. i6 B+ o; X
{ 1 Y1 H q+ z4 k% W% c
time.draw();
" E2 D" x& i3 f L2 s wglSwapBuffersNext(hDC); 2 q% V1 B+ k5 d. }+ t+ Z
}
* f7 p9 b1 _, A4 V9 S7 W- v; k" S- f) r, A! N% o
你只要掛進去前呼叫 time.initial(); 7 a: {; {6 Q3 b! r2 U
結束呼叫 time.finish();
7 s8 z7 U- ~9 x, |
; p& C# ?9 C* b$ L
. P$ R7 F$ n2 q7 ^2 P
& H+ a9 U' l2 O, [ L$ Y/ g2 X1 K/ y. L0 ^1 J. l( k
作者 : fushunwu(fushunwu)
$ F2 J6 T5 ]( P- ]" Z7 q2 G- _[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
6 c8 Y2 u8 J( ~( X' C h9 p[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
1 ` r! @) I8 B! q$ O& C7 ]; V: V2006/9/7 下午 04:19:31
7 B$ Y3 t0 Z" V& T# S e% N/ [3 W" A: W p( X
謝謝. 但我還是有幾疑問想要請你幫忙,麻煩你了.謝謝 ~
" X& n' l9 M6 Q1 l; I8 H+ X, V9 C0 O2 |3 J7 I! D5 k
(1). 因為我要固定放現在的時間字串和BMP圖在被我Hook的Game上面,所以我必須要知道那一個OpenGL的API是一定會不斷地被Game來呼叫,這樣子Game畫面才會不斷地更新. 8 F! |" s; Z$ a) J
時間字串也才會不斷地被更新而BMP也會不斷地貼在Game上面而不會被Game遮掉.
3 ^& f+ U1 p" H像是DirectX Game中的Present API就會不斷地被呼叫,所以我只要把現在的時間字串和BMP圖放在這個API裏面就OK了.
7 @4 ~5 y$ | e+ g4 e7 M所以我想問的是OpenGL Game中是不是會不斷地呼叫wglSwapBuffers這個API,讓畫面不斷地更新 ? 還是有其它API是一定會不斷地被OpenGL來呼叫 ?
+ @* F% c* y2 S& o) O" @! a' L; d) t
. K. H+ |# W F" H
(2). 現在OpenGL Game看起來都不是用Pure OpenGL API來製作,比如說像是用Glut # m5 E; d4 V) m" ^; s6 X
來開發,他們是只是封裝起來底層還是需要用到Pure OpenGL的API 嗎 ?
/ c2 U# N# u n \& ~8 `0 Z5 Z 這樣我寫的Hook才可以通用其他非Pure OpenGL的Game.
% z, ?5 h) ~2 W' o' Z
! m! U, I9 l# r! t/ Q5 A(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ? : p9 C7 q; I/ O6 e% G( s( |
+ w: h: c* N& J7 f4 G8 ~+ E2 `0 K2 b. j* D: T9 b
# |, ^, s' }) M2 s4 p) J) J5 i
+ `! {) A4 d- f* v$ L4 \& d, l( ^! |- z* b) p
作者 : dorkas(aming) * }% J" w/ ~! B/ b: [( r+ U
[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ] , l) g8 [% }* b( m
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] # I7 g1 x6 m5 b3 E
2006/9/7 下午 05:31:01
* j" t% _$ {0 h7 p9 m9 I9 p z" r/ ~
1&2 ! u1 |8 g- r% [1 D# J8 w! S' J
我對OpenGL不熟... / |# Z; W+ N/ ^6 {; [+ e# J3 h
A% v/ w; z4 U! y>(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
H% N# \, {+ O; @( C+ L. T
* c- Q) t7 D" r; ~3 _
9 p5 S5 S* R4 E% K初始跟結束都是做一次的就好了
; s" w1 G7 a. l& V" v你高興要擺在迴圈裡面也是可以
. g+ w6 t& }% g' e Z: f0 B- L" k
, m6 ?7 k, Q$ E, `$ ?- a) }程式的要訣就是 起 承 轉 合 $ _( c4 u; p% H w) m' {
initial 2 `* p. l/ C* Q9 p( R
upDate
# s# W9 P9 k. G' [& gchange
6 l2 Q0 }7 V3 }9 C0 r- Hfinish + ^& G$ E# W8 M6 [ x3 f- q
物件也是起承轉合
# m% a8 X' Q- X' o. \3 O* T函數也是起承轉合 * V/ @& o" h1 y: z: {
迴圈裡面也是 起 承 轉 合
~. ]+ @$ e P8 [0 }' \1 Z& m; I7 W. D) g) T0 \1 u
起 ) I& p+ C, w) _) r. K
for(起;承;轉)
" A. D& R1 q3 {& Q{ . b. G8 u+ Q* i$ u+ _7 z4 e
起
; X& Q) L6 G' Y' n1 N& S/ B6 \, N承
% a, d4 x* ]3 e4 \* n轉
! H5 t i9 i4 H' z4 C( l/ ^合 ; U. G- z- a: _0 V/ v
} 0 S/ M3 {* Q/ C7 D: p& G- M
合 & I% l: _) M+ w% b/ U( B
2 ?2 b* C" c2 A, v# J1 n. z只要你分的清楚 屬於那一塊的性質就好了
/ I! }- m! q8 R* T6 j; E8 D: E8 q" l) y2 f
t! A' I( u, Q1 H$ C" m& o
5 x6 n+ y1 o; H8 e3 @% _! d' J. `* A6 Z: b6 j, p7 D5 O, w
6 T6 M6 D- Y D/ Q9 k* ]作者 : fushunwu(fushunwu)
9 e2 {5 m& l/ w[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ] 4 {' S) o: K" A& }$ O' k
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
: p/ T! m1 T2 m6 |2006/9/8 上午 10:32:26
& U7 d3 }+ s8 x. W7 J s8 ~7 o8 | G. R' o; V9 _' Y
恩,還是要謝謝你,目前問題還是沒有解決.Quake4和CS 顯示的狀況還是不一樣~ $ }, T; [4 b3 E" E! l* @
/ b2 n- n" _- w* a
像是Quake4這個Game它就沒有使用到glBegin這個API 所以我hook不到glBegin
8 \, ~/ w% [, E- ^ e6 ~所以我就把顯示字串和BMP圖放到swapBuffers裏面去做,字串可以正常顯示但圖秀不出來
4 j( B4 \- D1 _/ a3 p( n* j我在想是不是因為座標還是矩陣的問題 ?
- }: I: ~! c8 `& b9 s9 f: G) K$ v4 ~# Q- l# O+ E$ x
但是CS放在swapBuffers圖和字都顯示不出來,但是因為CS有用glBegin所以我就把同樣的code放在glBegin裏面,可以顯示字串只不過會顯示很多個,我在想是不是也是因為座標還是矩陣的問題 ? , T4 o5 `1 z/ I) R, J9 c4 X
至於BMP圖在CS片頭時可以秀,只不過會秀滿全螢幕而且是顛倒的占滿整個畫面.
0 n/ H3 J9 a2 W8 a9 G+ X
; U5 l* U! w- d* ]所以我才想說有沒有一個統一的方式可以讓我把同樣的code放在某個OpenGL API裏面去然後每個OpenGL game都可以正常顯示. |