这篇文章的一些思路和我的某些思路类似,留待以后参考。 7 n+ p* S. W, \1 t; _- R5 @ e
建议还是看原文,比较清晰,为防止原文失效,贴一份在这里。 ( h( `( o% o4 T9 }) R4 ?2 Y3 C
) Z% o( j& j9 _4 A原文 ( D' N4 D" H: |) n: x
http://www.programmer-club.com.tw/ShowSameTitleN/opengl/1654.html 6 m: E+ i$ o( x& J2 J
5 v2 ]2 t+ Z% I9 D
大家好, 0 Z' w7 M f' P- l9 P# C
" F5 D$ m# p+ v& D6 U. t我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable . t3 S: h R6 y# D1 u* w
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....
2 m! f7 Y9 Z8 c, u; p9 S
2 n2 e* S' R+ N! V& v& j$ }: g/ u+ N2 x(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個 * Z6 \5 q$ y3 G' [
但是BMP圖放在wglSwapBuffers卻顯示不出來 ' w! z0 l! @+ w
(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一
# u& }, T0 x* p# j, c, \3 F樣的時間字串 1 ?2 \0 S( G. T! L1 u
; b6 Y7 Z. E! J% l' ?3 l/ J5 y& d; u) R; y) B d
2 q+ X& e4 H9 w* j1 h4 m作者 : fushunwu(fushunwu) $ p8 _* K4 T' x) \ F/ U H( M
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
8 N1 `( g# i, E0 H$ R! d[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
3 J! G! C, J) X& I$ l% @, ~2006/9/5 下午 03:21:34 : |! K* [$ D i% a* ~% y1 E% ^2 k
* v/ T* z3 T1 S! ^7 ?0 F+ q1 d6 Y
sorry,按太快還沒打完 ..
/ K8 x3 R* M7 n! }" p1 V$ l7 f ~# c; h# l0 l
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable - _) ?2 E6 c t
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....( 我使用MadCodeHook的API)
2 U ?7 C2 Y- x: M, m: q# x
% v5 V" U8 I3 k7 d(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個. 但是BMP圖放在wglSwapBuffers卻顯示不出來
4 H) W0 g- V( @9 h. [(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一樣的時間字串 ; BMP圖放在glBegin中中在cs片頭中還可以顯示,但是圖會顛倒而且會占滿全部的畫面,進入game中再開圖就掛了. - m6 F+ _9 O: w* x/ ~
$ J A5 o. e8 M, ?
想請問各位高手,有沒有一些好方法可以解決 .
. u2 D7 i3 U3 ]) m9 V) `& Q
' y1 N3 d! S. [5 Z: X! A下面是我hook opengl API的code : 4 O3 X# ^& W: v8 b7 g! ]
// hook wglSwapBuffers的code; hook glBegin的code也一樣 4 D9 b1 V$ [! O
void WINAPI wglSwapBuffersCallback(HDC hDC)
3 t F5 q3 y S$ m/ M- Q* Z) u { 4 ^! X1 i$ d: y" k: v1 S
- s2 A9 N! L- g8 g2 ?, g
if(!ininstializedfontshit)
' K# w, x) F- B Q{ , C/ z8 z9 f& z* p; E3 o. _
font.InitText(); 0 r; `4 f+ a9 {+ Q y6 _0 K
ininstializedfontshit=true; 0 m' F! A2 C. d8 {3 v9 O% i( m- ~; e
}
J: o t* b/ S
% G0 M1 a. e4 H: p( d8 ?' B# Q. z* ESYSTEMTIME SysTime;
! u0 Q9 q' g7 ?( O1 r' a' _GetLocalTime(&SysTime);
/ ]/ V- F$ P, H& D1 m5 BglPushAttrib(GL_CURRENT_BIT);
' V# h- U$ Q' z( ? // 顯示現在時間的字串
, s: [" \" F% Dfont.Print(140,125,255,0,0,0,"Time: :%:%",SysTime.wHour,SysTime.wMinute,SysTime.wSecond);
$ d% r5 X2 _1 w. B( g, y4 d' @8 y) K
// 顯示BMP
$ h* ^! W8 t* P
1 G% h% V/ w( L+ s7 m byte Texture[]={IDB_BITMAP1};
' T+ z6 X, l. z0 H7 e0 r+ { glGenTextures(1, &texture[0]);
/ D% ~+ J) F% o3 ChBMP=(HBITMAP)LoadImage(gl_hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0 , LR_CREATEDIBSECTION); . @& ^# n7 G$ D- {
0 i( v: W9 I, W- Mif (hBMP) // Does The Bitmap Exist? 0 o) t6 W* T6 D7 @$ @5 N7 D
{ // If So...
" Q& @0 m7 c; V6 hGetObject(hBMP,sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object
& P# J. n5 w3 T! \( J/ M* K/ p+ W// sizeof(BMP): Size Of Buffer For Object Information 2 D$ ?! |/ u4 r2 z8 ~
// Buffer For Object Information 7 g8 w0 {' L5 w- \) _3 s
glMatrixMode(GL_MODELVIEW); 5 t: J8 I0 y4 ]; ^5 R+ W+ r
glLoadIdentity(); + c% @- [4 I7 V/ ]. T
glTranslatef(0.0f,0.0f,-1.0f); + g& y: A; l0 G3 n, X
glPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]);
+ \; ` I3 [1 i+ `' t // Bind Our Texture
) B7 Z4 G6 ^# ` glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST ); // Linear Filtering
- E! F5 X- g/ t5 z% } glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Mipmap Linear Filtering * Q, z6 ?" A! j! @
$ ]; J* O9 s+ x cgluBuild2DMipmaps(GL_TEXTURE_2D, 4, BMP.bmWidth, BMP.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, BMP.bmBits); & G+ n6 Z l4 ^ O! ^5 s- ]% j
DeleteObject(hBMP); // Delete The Bitmap Object 2 G* y+ I7 D5 `* S; [" A2 W
} ! Q6 x+ g* C+ t, A/ C
glPopAttrib();
( s7 R; ~1 a, x% z, ]$ x" I+ |4 p) Y9 O2 }3 _9 g- l- v
f0 ?( t9 Q) a}
( r3 w [) u" b4 y* v$ ]wglSwapBuffersNext(hDC); 1 F' e- n7 t/ T( O: N( ?8 ~
} 8 W/ |6 o8 T, _% n
) Z! O3 B3 ^& C" V; w
* m( p" Z& P' A- ]: }8 ]) i: B( e3 h$ s, r. A# ?' T% w9 b
1 m* Q- v% r" P/ Q! y
: `7 N+ m+ K' K6 n
! S7 a$ c# F5 A0 X作者 : dorkas(aming) % r0 J% ^! _& y4 p
[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ] $ @/ n! P/ I; E d& q
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
( q+ b% W* n A: i; W$ o2006/9/7 上午 10:30:03
# j L- f' w4 L( i/ b0 j2 c" u5 H+ }" C
1.貼圖動作錯誤 * v) f; ~4 G9 S* ], X( X/ W
I0 ~/ J5 w/ J2.
8 P [, J1 n& U每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡
/ }5 C! H8 l7 q0 h5 V% n; o8 Q6 @5 s: ]# C8 ?
, |' Y9 a# S; y( K7 g
struct MyTime $ [" A; f! d5 }
{
0 h! \- \( x, u( [0 |, B D, p byte Texture; ( D/ ?# A9 O' {
FontGL font; 7 c" K5 n. U) b S# d
void initial(void); $ k* z k4 ^: H0 T" A# g
void finish(void); , B! I5 F9 N, s* @
void draw(void); ( C( C. W( b8 }: ~. `' T- F5 ]. p- A
};
* ^ c1 {( Z6 u( Cvoid MyTime::initial(void)
, ~: N: B% Z2 I. k: L) A! \ e{
3 _* e4 R% ?; U4 X5 Y // 載圖 初始字型
: e% ~) i. Z) a! h font.InitText();
* ]& d! X9 m" r i J glGenTextures(1, &Texture);
; F0 l0 C; }' H B) U; N( b4 s}
/ t# l5 z% ^# j$ O% C K- f* r, t5 Ivoid MyTime::finish(void) 4 n7 _# Z$ l7 u5 p2 c$ |5 J& `
{ ! L. [5 T( r: F
//釋放圖形 字型資源 6 |; S3 D6 T. ~5 ]2 B* |: v
}
! ~2 P; E2 P; S, u" t+ ?9 m
6 k; Z8 y2 i) Y5 x* m$ zvoid MyTime::draw(void)
) Z) Z. v( B" ^, X3 p; `% D) |# s{ * A( j2 ]1 r1 K0 d
// 顯示現在時間的字串
6 ^- g% N, ]& u7 M9 x font.Print(......something...); & p [( E8 Q( w: p9 P
// Buffer For Object Information
. v: g1 t3 x: |; ?6 P glMatrixMode(GL_MODELVIEW);
2 m) Z, z" K' j2 ?: L$ I. Q2 X1 b glLoadIdentity(); % a6 E0 y) H3 X% o1 J
glTranslatef(0.0f,0.0f,-1.0f);
1 a" _& |* |( F% f, c glBindTexture(GL_TEXTURE_2D, Texture);
5 F/ P2 p/ O/ A% s$ e9 Y1 w' U. S, r3 X2 Q; y" j4 [% i$ J* I: i+ X
..... DrawSomeThing
2 r, M- g6 ?0 j/ d! _/ M9 l Y% n# p1 z( R2 L+ m4 @ Y
} 0 a5 C- `# C9 Q, F! w0 g
' _. u D2 g2 z9 c' [7 T+ j! G4 P2 M- ]
MyTime time;
6 c) N* F$ Y! K; G8 F9 nvoid WINAPI wglSwapBuffersCallback(HDC hDC) 2 }, X$ m. j4 U' ^" R# @6 }: o0 i
{
( M& S" S( n# P* C0 L& n! Y time.draw();
, C/ |6 J, h" L1 e Z/ Q wglSwapBuffersNext(hDC);
, r: v1 a# o+ m: H0 m+ O/ U}
! p7 E: S2 F% c8 k2 L+ X& t+ M3 V, R2 J. M/ @( q7 ~" ]% x
你只要掛進去前呼叫 time.initial();
& {7 F1 x$ r+ q: f& F) t! ]; ]$ ~結束呼叫 time.finish();
7 T, F3 O! b; J ^; Y6 N W4 p6 t
( C* _# z" R- L# G- Y& R2 w0 p
& E6 |$ N- S% V: ~$ q. ]5 `
$ g1 o c+ g7 z& `) {
8 A0 g8 |2 L1 c) n/ L! F: j作者 : fushunwu(fushunwu)
4 x7 j' j; J5 Z# M, i7 p* M[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
* s+ m* H3 Y! Q% u8 n[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] o6 e- P; Y; o& p- }
2006/9/7 下午 04:19:31
6 N& s8 P+ J+ z! c& `4 c) s
0 D5 ^7 `( u! F3 ^謝謝. 但我還是有幾疑問想要請你幫忙,麻煩你了.謝謝 ~ 0 [* J4 r3 g# x/ `3 W
( F- h( `/ w, ~; O) q
(1). 因為我要固定放現在的時間字串和BMP圖在被我Hook的Game上面,所以我必須要知道那一個OpenGL的API是一定會不斷地被Game來呼叫,這樣子Game畫面才會不斷地更新.
) J0 A% F p- i時間字串也才會不斷地被更新而BMP也會不斷地貼在Game上面而不會被Game遮掉. $ ]( G- p5 j; s* ^1 `; [% U9 Y
像是DirectX Game中的Present API就會不斷地被呼叫,所以我只要把現在的時間字串和BMP圖放在這個API裏面就OK了.
, y* W3 x; p& D' x+ Q$ ^& Y0 W所以我想問的是OpenGL Game中是不是會不斷地呼叫wglSwapBuffers這個API,讓畫面不斷地更新 ? 還是有其它API是一定會不斷地被OpenGL來呼叫 ?
; Y8 o# Y' m/ s4 l$ i8 o2 s: e* I; H4 n
+ n) S" A) n* o6 W3 A3 p(2). 現在OpenGL Game看起來都不是用Pure OpenGL API來製作,比如說像是用Glut 4 J9 a6 T) y/ h4 S% z6 I6 H2 v: u
來開發,他們是只是封裝起來底層還是需要用到Pure OpenGL的API 嗎 ? ?% d2 U, i4 s, f* W
這樣我寫的Hook才可以通用其他非Pure OpenGL的Game.
! d) D: b. m+ i! |$ B2 M' v! g2 C: \1 t3 J/ X
(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ? 4 x; x# X# l6 E8 V
* ]: v1 E; v( b# E
- r/ d% @* Q' z7 j5 B8 c0 {/ B
# E: s& K( W ?) x
0 I, Y$ H* F; W9 w* r
: c! E- G: r9 r, R3 \* q' {- R作者 : dorkas(aming)
7 F% \) d! u2 ?/ I6 o5 g$ v' l7 g[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ]
7 a* P6 T0 q/ O8 j/ p2 ][ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] % j" b* n* j1 S1 R* q
2006/9/7 下午 05:31:01
7 S Q. y4 O# p' e& P* s( A2 h7 S
1&2
/ g$ W: ~7 }; b E. O& _7 o6 G7 S我對OpenGL不熟...
- B7 R2 Z! z, Z4 J: U; K1 f; O m1 _: B8 a
>(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ? % j5 i* p- {% Y* i( f
! `+ ?6 V& \8 ?
6 e5 N0 R( i( Z7 w& n; @; z初始跟結束都是做一次的就好了 $ X* M7 M& y/ u7 T
你高興要擺在迴圈裡面也是可以
$ @- R# R8 y j( h
/ n ^& ^( X1 \+ m$ w7 h9 [程式的要訣就是 起 承 轉 合
4 e7 `# O Z6 ^initial
7 |" k" S+ b, L( y5 q' Q% ?5 eupDate
. ~1 y0 l, F6 @5 [change & n0 z, T% Y [; `7 K- y% c
finish
4 U8 `! l8 A3 f! {/ d物件也是起承轉合 * J0 d, I- m$ K/ c- ]
函數也是起承轉合
0 D2 q0 X. j9 Z- v/ H6 m迴圈裡面也是 起 承 轉 合
3 H8 i6 |" x" d' m' b5 U g2 X: f
) V+ e9 }- y; e起
9 y5 g' M z) T# ^9 ifor(起;承;轉)
/ D$ h( e+ C1 f/ F{
$ C5 P0 S6 {( \) q- b4 J& k' p起 9 b5 V" t/ E7 H8 f+ J/ K7 P
承
. G5 |( t) @2 n" a8 K* P* z; v轉 , ?2 ~6 `+ i+ E
合
# n& X9 R) s- ^% S1 H$ R9 M! h4 Z4 E} / n, t- f4 ^7 Q' ~# a& D2 @
合
+ H9 u( F" W. y' s8 j
# x, w5 B3 q3 `" ?/ I! ^只要你分的清楚 屬於那一塊的性質就好了
) W$ z- h, v+ O# n' {) _- x1 }7 Y
' Z8 Y0 ^9 Q1 n F+ P
! P8 R, j q/ |' V0 Y* D& U1 {4 n" v3 |
1 H2 W" |; q1 [4 A4 b7 h
! k! k7 C% u& k/ ~作者 : fushunwu(fushunwu) * X: c/ j5 [: O; q$ p' Q6 |+ z
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
* ?* `) M" k6 Z7 Y' r[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
( a' y* U/ r7 N% J8 |2006/9/8 上午 10:32:26
/ u8 c/ p/ I; k0 X; g# w3 S( Q4 H- R7 \# h# p; o: W
恩,還是要謝謝你,目前問題還是沒有解決.Quake4和CS 顯示的狀況還是不一樣~
6 r9 ? K5 ~; p0 M
3 w) d" q, ]7 u% d7 ]! D* s像是Quake4這個Game它就沒有使用到glBegin這個API 所以我hook不到glBegin / w# j& f$ t& i1 s+ H
所以我就把顯示字串和BMP圖放到swapBuffers裏面去做,字串可以正常顯示但圖秀不出來 . p# Z, e) z& L8 Q: f* @* n
我在想是不是因為座標還是矩陣的問題 ? ( b5 }8 X/ j( ]( _1 S7 W2 R# S
. ?4 `- P& F2 S d. O7 \但是CS放在swapBuffers圖和字都顯示不出來,但是因為CS有用glBegin所以我就把同樣的code放在glBegin裏面,可以顯示字串只不過會顯示很多個,我在想是不是也是因為座標還是矩陣的問題 ?
2 @, J' U, G8 j3 E8 j: t) m$ ?至於BMP圖在CS片頭時可以秀,只不過會秀滿全螢幕而且是顛倒的占滿整個畫面. 6 b9 ^) K$ A4 N. G: L. q$ @
7 I( _+ B8 W/ j# Q; C+ Q
所以我才想說有沒有一個統一的方式可以讓我把同樣的code放在某個OpenGL API裏面去然後每個OpenGL game都可以正常顯示. |