这篇文章的一些思路和我的某些思路类似,留待以后参考。 3 k5 J, E. B6 ~- l4 V1 j
建议还是看原文,比较清晰,为防止原文失效,贴一份在这里。 * f% ]3 f: N `$ t
) g1 w) T9 @7 d9 L2 d2 v6 [
原文
2 T P& X3 g s+ `http://www.programmer-club.com.tw/ShowSameTitleN/opengl/1654.html
/ D2 m" i" r% Z. Z1 K, I M
- t N/ N3 y/ f6 S* m大家好,
2 N7 Y( D( P/ Q) g7 V1 ?+ ~: n$ X2 G7 X$ i7 M
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable 8 @3 w5 o6 W6 @4 @6 i0 e
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....
5 E$ y8 f! y) G/ P5 X' z+ D. P( z/ X: x8 w' k& K2 [! |
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個
1 R6 O: p b8 F$ `9 U 但是BMP圖放在wglSwapBuffers卻顯示不出來
' }) f4 S. X3 @(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一
4 v$ u8 ~# Y9 ^6 a+ R樣的時間字串 % z4 q' H. [8 d5 w
( A2 z! v4 k" x) v3 }$ D6 o4 z, L/ E% w) Q' |$ n
' T8 A# d8 w" X4 T# Q% N& j作者 : fushunwu(fushunwu) 2 l. A- x# \) v& _! \. b# F4 c
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
x) @. u R* f* S[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] , N/ V. P5 K5 f( C) z+ n8 Y! {1 j
2006/9/5 下午 03:21:34
, t" }+ o' [ y% C# ?5 |- r
( s" U2 w( [) N6 |6 v' L) {sorry,按太快還沒打完 ..
* [! b2 {- r6 M) P p, K
, K( N9 j& Y0 Y) B5 B! Z, B我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable # v0 [6 L4 R4 C+ u% [* u/ U! z
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....( 我使用MadCodeHook的API)
" ~" c) y0 p, n3 |/ F3 ?
% T6 Q" p- B$ M) ^4 a4 ]& D(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個. 但是BMP圖放在wglSwapBuffers卻顯示不出來
6 A4 ^+ d+ D7 f1 g( E(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一樣的時間字串 ; BMP圖放在glBegin中中在cs片頭中還可以顯示,但是圖會顛倒而且會占滿全部的畫面,進入game中再開圖就掛了.
0 l& |$ i. N% w+ _4 o6 j
. L! }6 O1 t+ E* W( g# L) J想請問各位高手,有沒有一些好方法可以解決 . # C V2 [% @! U8 [. w" T* {
9 D. I4 F6 X+ p/ b; N* X* r下面是我hook opengl API的code : 8 j" j/ H9 Q( G" y9 f
// hook wglSwapBuffers的code; hook glBegin的code也一樣 % w/ Y4 E7 f4 }0 T: s/ S/ r
void WINAPI wglSwapBuffersCallback(HDC hDC) : P" c# i$ A; K3 y: r: z& ~
{ / J" M( F/ i& |5 H5 }% g# n0 A
+ f) D* m. ]# o0 C) G, C! aif(!ininstializedfontshit) 2 ]9 g# s2 f. S. l/ v
{ - N& O' n6 N |0 a \# R; k3 P
font.InitText(); 6 K) H, u; H1 @7 U) P* c7 u
ininstializedfontshit=true;
6 @, @8 Q0 n% n5 S% `6 L}
/ X$ I* c1 B0 l4 `/ h; L+ ?1 C l/ H3 K# \* ` M
SYSTEMTIME SysTime;
8 d* X$ k% s' j) T7 L+ OGetLocalTime(&SysTime);
* {8 b; H. O, I& BglPushAttrib(GL_CURRENT_BIT);
( w9 c: V* }- E {; O. f; l4 t3 a // 顯示現在時間的字串
Q; v$ D# [* ~+ afont.Print(140,125,255,0,0,0,"Time: :%:%",SysTime.wHour,SysTime.wMinute,SysTime.wSecond);
+ n1 L6 j$ u* [* B5 V; o) V( h* G! B- J: s: k/ ?7 Z
// 顯示BMP
4 G5 K) ]+ T- F1 N( t5 n5 R
7 \" r9 _8 e) v byte Texture[]={IDB_BITMAP1}; : \) @4 A' a- ]/ g7 D9 H' v
glGenTextures(1, &texture[0]);
5 x( S% I- p# ?hBMP=(HBITMAP)LoadImage(gl_hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0 , LR_CREATEDIBSECTION);
9 ~+ [7 H; N6 |+ g
" }% c; R( |9 gif (hBMP) // Does The Bitmap Exist?
5 X5 S( n4 c! w2 J6 K6 N8 r{ // If So...
! y. a! L! B- `$ q% Q) iGetObject(hBMP,sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object
" T/ y: Z: [8 _1 o9 B8 ]// sizeof(BMP): Size Of Buffer For Object Information
" i$ k+ N$ q) y, x6 A% D4 \% v/ l// Buffer For Object Information
5 B$ ~" \; S8 Q! q( Q# _/ a/ eglMatrixMode(GL_MODELVIEW);
( ^+ R. M* h2 U. n# R% Q ~glLoadIdentity(); + c9 W4 O8 t1 R0 {* Q" ]* ]4 i
glTranslatef(0.0f,0.0f,-1.0f);
0 a6 p% n2 Q& |0 Y- T1 HglPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]); ; c6 t' ~* h L
// Bind Our Texture
* s# m8 p2 | U. J& ? glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST ); // Linear Filtering - y! g4 s/ h3 P6 k( Y7 M% |
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Mipmap Linear Filtering 0 ?# ^" V- Z; @' p2 A+ g0 D
* Q' _( [4 y4 f& U$ i4 ]. ogluBuild2DMipmaps(GL_TEXTURE_2D, 4, BMP.bmWidth, BMP.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, BMP.bmBits);
; Z1 M6 G, V$ G: o9 c" W1 U( CDeleteObject(hBMP); // Delete The Bitmap Object 7 A9 M8 e9 Q) k
} w. `, D- {" D
glPopAttrib();
' N, s; R; p/ J0 N6 E: l9 X+ \
* R$ r7 x' q4 z/ P1 X1 A( t `
# s" _9 e- A; R5 A. y- K0 @+ [4 Y} 5 N( d( B9 O3 d1 \: ^" P, T6 S
wglSwapBuffersNext(hDC); 6 D3 |; j5 h. Q- X3 P
} ; d+ z* a$ R5 g- |' A
2 c6 H5 Z5 Q$ L* U7 s% R6 d" O
2 O) A& Q+ s- _9 m* U9 l2 f8 \: h) [( P& N8 f7 C5 Q
5 c; [' t+ I, r% z# O$ Y9 n9 N' n+ c4 i2 E; t7 t' U8 p
& e X8 z1 X. S7 m5 Z作者 : dorkas(aming)
( l) e/ j2 k. X5 E0 B[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ] : F; b3 Q; k S; w! c: X: t8 P) |
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] 0 v4 W; G# [" B# ?
2006/9/7 上午 10:30:03
% v" {9 t0 L! l1 M1 S( ^
; K" Y& z, s- ~, H6 S7 v$ J1.貼圖動作錯誤
4 d' i0 w( Q w2 \/ [9 V/ [/ Y( ^5 v; o6 e F& l( R; v
2. 2 @' A$ {7 _, e) j+ j$ j
每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡 . L$ x: }. M9 G. U
# B8 g" n( c- ~( q3 I p$ ~
6 a5 W$ K( H* rstruct MyTime 0 ~( ]" }0 O4 V1 P! F3 }* t. d
{ 4 Y3 r7 b1 L# F8 Y* `
byte Texture; 3 F) Q# F: K. G/ h! F; J
FontGL font;
3 t, u/ }/ Y, m- k0 y# M) c' W void initial(void); 2 d6 e+ D5 H9 Z8 E
void finish(void); " @+ Q6 x0 ^3 W% U: B
void draw(void);
V: X; R# I, o};
. g, o8 I* O4 w! N- S8 Fvoid MyTime::initial(void) ; @4 N! y k5 w9 l
{
2 T0 H, r4 \" d* B* j! b. f( ~2 o // 載圖 初始字型 4 v( d% o: w. [5 I+ O
font.InitText(); 6 V9 ?- H: t' T0 ?4 k9 ?* P) [
glGenTextures(1, &Texture); % N( u+ C6 [& s2 S9 a: P
}
4 c% w( ~' q- _) R C- @* @. j! J$ dvoid MyTime::finish(void)
$ g4 a$ s. v' c7 e d0 A& y$ N{
8 C5 A/ y3 ?3 P \& d //釋放圖形 字型資源
& d3 _! f# @% M6 f& h+ T- l; `} 2 {* X) d" z- J! M1 n o$ K
/ r' t$ _6 m3 D9 T. Zvoid MyTime::draw(void)
" d, b) ]0 U; U7 _0 c) z+ H; X) s O$ r6 S# ]{ / d& T7 O- g% j1 ?6 M
// 顯示現在時間的字串
( `& V# s5 k0 f font.Print(......something...); 6 K) {5 M- ~4 x9 O1 g3 ?! c3 q3 o
// Buffer For Object Information 2 J" [' h5 E) V- u. ]9 W8 F; I
glMatrixMode(GL_MODELVIEW); * _3 N6 C1 f0 ]' W
glLoadIdentity();
" _8 p: ]* j% Y" e5 U5 X/ @ glTranslatef(0.0f,0.0f,-1.0f);
! c" M* Q9 ]! L% W4 h glBindTexture(GL_TEXTURE_2D, Texture); - _3 p+ M4 \: z
+ Q" o0 X9 M5 Q, {3 B' b# _% Z ..... DrawSomeThing & _8 X1 @5 ?. D/ H
5 _- A: {0 P+ H( n0 B D
}
1 k+ Q+ ~! p4 u# q% Y; o
% _9 _8 Y4 f7 y# f
) f$ U& O* I$ D" q6 X. dMyTime time; 2 d/ l& X. z. n/ q. D7 E
void WINAPI wglSwapBuffersCallback(HDC hDC) + X% G: @ V) |' c- ~# N% ]. m
{ ! e- J; R9 [9 _# r- P1 c2 H
time.draw();
$ M, y/ n7 R) | wglSwapBuffersNext(hDC); % M" T& _) r ], n
} & F- n- m8 W$ l; j& D, Y
5 X! {$ i8 i8 f, w: G9 S5 ?
你只要掛進去前呼叫 time.initial(); @- b! W. F9 |" h' q
結束呼叫 time.finish(); ) g: r) h7 T; q) s/ V- {
$ A; j2 k; F/ d# `: [# f
% R( F# K% o5 b/ l
8 E; Y5 V/ g7 G0 o; w
/ j/ t( D5 c1 d! T5 B0 u, U1 E. U
作者 : fushunwu(fushunwu) 6 n* _" m( C& y1 ~
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ] 3 q$ |/ z$ q: {5 s7 P/ N* y( \
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] 3 F# t1 J. p1 I9 W
2006/9/7 下午 04:19:31
& {+ e6 K, J: {5 s+ j' ?! z2 w, o) e) L8 F2 N0 a$ S& \
謝謝. 但我還是有幾疑問想要請你幫忙,麻煩你了.謝謝 ~ / `3 F1 Z0 ^/ _, T
* B1 \0 g4 N1 r! B c4 p
(1). 因為我要固定放現在的時間字串和BMP圖在被我Hook的Game上面,所以我必須要知道那一個OpenGL的API是一定會不斷地被Game來呼叫,這樣子Game畫面才會不斷地更新.
( s9 W1 ]% C4 Z t9 }4 a6 }# H時間字串也才會不斷地被更新而BMP也會不斷地貼在Game上面而不會被Game遮掉. ) R* ^) x2 v8 X# \: h( u
像是DirectX Game中的Present API就會不斷地被呼叫,所以我只要把現在的時間字串和BMP圖放在這個API裏面就OK了. , `, k( `( D6 d* o4 D
所以我想問的是OpenGL Game中是不是會不斷地呼叫wglSwapBuffers這個API,讓畫面不斷地更新 ? 還是有其它API是一定會不斷地被OpenGL來呼叫 ?
! `- }4 R! y* F+ b2 S2 O9 H6 }' M; K! u, r/ Z7 v$ @0 D, w, M- o
1 T+ ?' ]2 T/ f! d7 x(2). 現在OpenGL Game看起來都不是用Pure OpenGL API來製作,比如說像是用Glut * C' ~0 U, p" y
來開發,他們是只是封裝起來底層還是需要用到Pure OpenGL的API 嗎 ?
5 T# |) E8 c/ w% ?3 [2 f8 C- A 這樣我寫的Hook才可以通用其他非Pure OpenGL的Game. ! B) }$ {! c" e# ~0 m: {
5 M3 D1 \7 B8 R
(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ? & s% A7 J# _' t# T6 \/ v# r! a x
9 H( Z: z; H& _9 s
* {, t _. ?: Y" \, A3 s( H0 Z) W) M1 a( e ~9 J
9 d% H' ~ o: ]# T
( K! h6 j5 l2 A' T
作者 : dorkas(aming) ) J& \ ]2 ]# Z5 [1 Y1 ?/ t+ s$ g
[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ] ) y3 w6 |# F, I8 z# e( {1 \
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] ! G$ c5 V x+ d% P/ S# X4 {( {
2006/9/7 下午 05:31:01
: m. d! o* Y6 C9 F( r5 }! g' u- Z0 k/ p4 o3 ]* |- L
1&2 " C/ g1 i0 k9 R) u; P2 Y
我對OpenGL不熟... 6 h2 W$ D6 {/ s0 p
6 r3 S% y1 `+ Y" v5 c+ {>(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
# |& v& l2 [% u, m% c4 x
5 c8 a" D/ Z7 M
/ j3 g7 ?+ S+ y0 Q6 m4 S初始跟結束都是做一次的就好了 1 |4 K- |- T+ z* [* T$ H
你高興要擺在迴圈裡面也是可以 # H: P% y& _4 q6 o6 y
! D( l; f0 t0 s6 R& F
程式的要訣就是 起 承 轉 合
/ b) l7 H3 c9 x- Z- i- K! x# ?& ^, Zinitial
Q8 T7 g9 r& w% ?upDate 7 S7 r( F9 w% v- D/ s
change
B8 q% ~, p0 I: x5 B+ [finish
% ^+ M y) b$ D8 s物件也是起承轉合
3 G. q! ?& ?4 C4 b Q5 I函數也是起承轉合 & \$ }& S9 m' Z
迴圈裡面也是 起 承 轉 合 : U: w0 o/ m$ M
& D' E/ R0 N; ^/ c
起 4 m; p8 y* D- G) U
for(起;承;轉)
. u- P( |% i: T3 e d. n' m" F4 `8 L h{
& x: O* j2 W$ h6 r& w6 T起 4 u9 ^$ e$ H( q4 |' W+ R( G
承
. \% F7 B) z# d( _轉 % v5 W' r$ d0 C7 k# o+ ~. e
合 6 y: y% f- k( C/ N' W7 E) O
} " ^9 b/ `; B# E* N* q- P
合
4 l! |9 G% |4 p& f) N6 d# o
. @* Q% o( n m g只要你分的清楚 屬於那一塊的性質就好了 & l% K) A- m3 H; i4 u5 i6 N0 `
' J3 ^$ i$ i5 L
% J4 U6 {. J6 b6 _- o# j& ~
9 e0 g( a; p; b/ ~" u- G/ R }9 c$ g2 l! d
e, ]; Y4 K4 c) V5 G
作者 : fushunwu(fushunwu)
: S) {6 \3 s9 l# V1 ? w[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
; F# H5 K. S: F2 w# c[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
* v- _0 I1 w4 @2006/9/8 上午 10:32:26
0 H4 h I2 f# M( P
) }! k: L" k+ ]0 s恩,還是要謝謝你,目前問題還是沒有解決.Quake4和CS 顯示的狀況還是不一樣~
6 n1 g8 J/ k9 Y: {$ U/ b7 F( \
4 ~! n+ D8 d& D; [3 m像是Quake4這個Game它就沒有使用到glBegin這個API 所以我hook不到glBegin 3 i# ] F, c! U; H: ?. }
所以我就把顯示字串和BMP圖放到swapBuffers裏面去做,字串可以正常顯示但圖秀不出來 8 e3 }0 i6 t2 n) ~
我在想是不是因為座標還是矩陣的問題 ?
S! v8 G0 l2 s8 |- I/ u p) [1 c0 \/ ?
但是CS放在swapBuffers圖和字都顯示不出來,但是因為CS有用glBegin所以我就把同樣的code放在glBegin裏面,可以顯示字串只不過會顯示很多個,我在想是不是也是因為座標還是矩陣的問題 ? 3 n- [$ ?! M; ]0 X8 K
至於BMP圖在CS片頭時可以秀,只不過會秀滿全螢幕而且是顛倒的占滿整個畫面.
0 ?& ~6 Q4 _4 d3 |
% d4 W6 o* P# e$ ?5 Q所以我才想說有沒有一個統一的方式可以讓我把同樣的code放在某個OpenGL API裏面去然後每個OpenGL game都可以正常顯示. |