这篇文章的一些思路和我的某些思路类似,留待以后参考。 9 V, }+ R/ M5 J
建议还是看原文,比较清晰,为防止原文失效,贴一份在这里。 . p2 q' o- J) B3 g, K" s
$ W5 K% ?% h1 |
原文 5 w; [# t1 I" s& M+ z' B
http://www.programmer-club.com.tw/ShowSameTitleN/opengl/1654.html
% H7 F2 h5 {; i1 M! J: P5 `5 y5 _6 t5 a9 [" X" W$ C
大家好, " T2 z1 \% L8 r% D- O5 k5 q) |, M
: m* ?" W8 k7 E# I+ \- m7 w我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
) S. ]+ n# F4 m) V" o$ c" K,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣.... 9 b5 ^7 I" N& T y" h' ^. ?2 C
# o% M& ~6 _/ f9 h- m# R(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個 ) [0 d1 t0 H$ D+ S+ e# d. h
但是BMP圖放在wglSwapBuffers卻顯示不出來
" B" Y. @$ O* Y: T% x1 e' b, E(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一
* u% R0 R5 R8 U1 j樣的時間字串
- f) O- n; J+ \* u. V, B0 k& `, @8 h5 X* c6 ]
$ \- l% n( [4 }& b; d( V! ]0 v
' Q: I" w ^/ d! \7 U; O$ {/ t& C1 C作者 : fushunwu(fushunwu)
0 ~4 j8 Z, T, ?: L* K/ H- O G[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
- i9 z( ?; I6 ^. r! U X- h[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
: ]5 W$ F% A5 t u2006/9/5 下午 03:21:34
) F/ _' ^9 ^, g2 [
9 k" I" P' W$ \( [5 _" R- p+ vsorry,按太快還沒打完 ..
2 k' X/ _1 }6 _) C8 l& F
s+ w4 } R# R# l$ f- p* f我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable # h+ a; |2 Y5 M9 l) B! p/ i
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....( 我使用MadCodeHook的API)
- u9 v2 g; Y1 I9 {! `4 C3 R0 S- S! i/ o" y9 @/ u
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個. 但是BMP圖放在wglSwapBuffers卻顯示不出來
( R, ^0 i+ s8 `- c% z(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一樣的時間字串 ; BMP圖放在glBegin中中在cs片頭中還可以顯示,但是圖會顛倒而且會占滿全部的畫面,進入game中再開圖就掛了. B( H% S. g7 g% Y7 `, X7 E9 o
8 y; w3 u+ B2 [1 s' p想請問各位高手,有沒有一些好方法可以解決 . 8 |! D1 X3 l& s' k
* \9 H) i; s1 U' t$ C( |下面是我hook opengl API的code : " ?1 ]: G8 t7 C9 O
// hook wglSwapBuffers的code; hook glBegin的code也一樣
% V: E u5 n5 m/ Jvoid WINAPI wglSwapBuffersCallback(HDC hDC)
$ n/ u/ h9 G' a" s4 I {
& {% n7 q1 g. z7 u; h8 h' L; G
# W$ l' Y# s# Z/ I' A( Wif(!ininstializedfontshit) 9 q, g: A9 O7 D) o' K
{
2 ~, R. W2 P( _: T$ kfont.InitText();
$ v. Z$ _9 U; n& {$ H; Q5 x' u3 Bininstializedfontshit=true; 1 d* v2 S: ~3 v" O5 q- W
}
* @- _2 D# b7 T5 G; z3 i( n& c+ Z( E' {
SYSTEMTIME SysTime; 2 h' C# j3 a" ?' e
GetLocalTime(&SysTime); ! R# q+ ^. |7 O: C; C* `
glPushAttrib(GL_CURRENT_BIT);
0 L. V/ {; d, I2 y' y" H // 顯示現在時間的字串 : Q, i* q. T' l: w0 q+ }
font.Print(140,125,255,0,0,0,"Time: :%:%",SysTime.wHour,SysTime.wMinute,SysTime.wSecond);
4 i: s: F- L1 B7 s) J5 K: D9 _; j: ^. I5 K! I
// 顯示BMP
7 i" C+ K0 P' }( w4 \
1 e+ }( c; u: e' T/ x1 G% C# v byte Texture[]={IDB_BITMAP1};
" N. e: B) L: y! b/ f glGenTextures(1, &texture[0]); 4 v+ W T0 {5 u! h0 P4 D
hBMP=(HBITMAP)LoadImage(gl_hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0 , LR_CREATEDIBSECTION); 9 a; v; g* C5 i: I0 q" j' f
8 ^( W4 f T" K8 \5 Sif (hBMP) // Does The Bitmap Exist? " J% l+ {5 u* A; B* @8 x
{ // If So... * [1 A! H: }0 b# f( Q, ^) V
GetObject(hBMP,sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object
. B8 {. I' k( [// sizeof(BMP): Size Of Buffer For Object Information
2 g2 n n1 ~' Y4 A2 W( Z- X* j" I// Buffer For Object Information m$ g0 I3 W% V: H( c: C- _
glMatrixMode(GL_MODELVIEW); + Z$ e$ Z( {& g
glLoadIdentity(); ) {* R' r' T E; Z
glTranslatef(0.0f,0.0f,-1.0f);
4 ^ |) N- c& ?: vglPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]);
( H7 q7 q3 A( ?1 P // Bind Our Texture
: c- V6 P& |! v Z0 G glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST ); // Linear Filtering
. K) C! H9 s& P! p; E glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Mipmap Linear Filtering [" B4 x/ j9 Z7 ?1 F& m! f
" U2 y/ `+ _7 e/ `gluBuild2DMipmaps(GL_TEXTURE_2D, 4, BMP.bmWidth, BMP.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, BMP.bmBits);
& N- c- h( O8 Y, Q# c1 KDeleteObject(hBMP); // Delete The Bitmap Object 5 [" {" u6 L/ p
}
% K+ z1 @; c: S$ J1 \/ `! @glPopAttrib();
4 Z8 b5 s( l* P3 d7 y7 S# r8 A! A9 @! o6 e
- W- M5 I. ]+ y( K1 Z}
$ K) c8 O! x [& ~$ _9 PwglSwapBuffersNext(hDC); 8 U' u9 {2 G7 A" o% W9 q
} , U: q% r5 Y( i, w% S4 U
6 Q5 w6 }% S0 j" l, i! w4 u
5 C4 }5 E4 V1 z* K: P" ?
0 ]6 }5 @4 ^5 L" k" H" z0 N6 r5 m! q( v3 F( P3 V9 d( y# ^1 W6 e
s% T% A1 A4 ]! Y% H- W- R2 ]2 u2 Z: E4 d5 Y
作者 : dorkas(aming) - h* B8 |8 {$ r6 \ \$ s: R
[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ]
7 [8 ^6 G X1 k" n[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] $ ]- D$ m3 a5 \ |7 q6 h4 \' q
2006/9/7 上午 10:30:03
" h! ?/ _- s- E* |# T0 b' p( W- w1 \; a; P: r7 f' }! W2 S
1.貼圖動作錯誤 3 ^! D$ `/ P: S. r$ d O
" c. R5 z! m) R& t/ V" E/ j2. 0 k* ~! `# [% ]/ @
每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡
( _" q$ H9 @* V, z3 A, R0 o) p( @) h4 b
1 w: t; i- |: u$ j" Bstruct MyTime 6 v: {8 o, M G
{ 2 I5 p* Q# \) w
byte Texture; , ?) w2 u7 ~ L7 z8 I& W
FontGL font;
2 J0 L* L! K; \; C5 |) G+ U void initial(void); ; `8 C5 h. A# J, N
void finish(void);
; |8 y0 n' o! U/ p- K4 e: Z% I void draw(void);
3 m; ]- Q6 j4 N+ J% T};
' G, f' U3 s! k: L- Avoid MyTime::initial(void) - W6 f( J2 W- y/ u
{
3 `) U# m) O7 P; D4 ~& n/ d; [* @7 K // 載圖 初始字型
5 I( N6 z" k3 q( F font.InitText();
8 s, m' O/ G4 w+ f+ X glGenTextures(1, &Texture); : D3 q( L: L y9 [
}
- @ b. s# r: M6 ?void MyTime::finish(void)
8 u# N2 Y/ T6 Z* `$ N B; p! D{
2 ^. e: h. g/ V //釋放圖形 字型資源 ) e2 K0 z8 N8 M8 @# d. J0 u
} / ^: f% K- M2 E" m
3 N7 h1 u: _2 `7 b+ }
void MyTime::draw(void) % w3 W* H/ T4 ?0 y9 n8 D
{
/ s/ {/ [9 U; n/ ` // 顯示現在時間的字串
8 D1 f8 K# e5 z font.Print(......something...); ! E; S M0 |5 j0 I/ I2 L
// Buffer For Object Information / M0 l4 D. ^7 |9 k7 x4 S3 Z
glMatrixMode(GL_MODELVIEW);
4 K Y# ~/ f. k2 ?# z. U2 c; V8 e+ \ glLoadIdentity(); , E' _4 e/ f: O X1 M* J1 e |$ w. F
glTranslatef(0.0f,0.0f,-1.0f); 1 V. p5 b* h( j# I$ [9 n: u( G
glBindTexture(GL_TEXTURE_2D, Texture); 4 @* S9 p% F2 m; [$ d; e
! r4 I; @8 l8 I t1 [" h8 Z4 q
..... DrawSomeThing
9 l. z5 X2 b' ~" e- _9 q: h% O * V5 b2 _7 K/ [
} ; L9 V, b3 x0 E
+ ?( G" i+ D; w& }: d
* h7 M. o) F3 \" s4 bMyTime time; 9 b5 l0 R4 K7 @. t' y+ I7 g
void WINAPI wglSwapBuffersCallback(HDC hDC)
% l0 R. g# m* ^7 }& I5 H{
8 q9 ?& k& }2 ~' v time.draw(); " k5 G0 { V7 Y' k! `- _
wglSwapBuffersNext(hDC); ! `( H0 g$ e" m0 s; o
} 7 N5 i7 ?4 X$ F' O% E0 z
0 L& g+ Y; s& \0 F t. \
你只要掛進去前呼叫 time.initial();
S* }+ c7 @( p* _* x9 Y: ?結束呼叫 time.finish(); * L8 ^ B, ^( y$ ?
: a0 F" ?1 H+ M9 n% ?
1 r- ]1 l9 `! a# G9 x, t
% f2 X$ L3 ]+ V0 x! i* Y/ `$ q* F- {+ K( X& X1 t, i
作者 : fushunwu(fushunwu)
. [: {4 x( l& M3 H( a6 ~ ~[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
. Z! G7 g6 P0 x0 ^* X' L2 F[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] 9 j8 e" n, q' v" y! `; s2 M
2006/9/7 下午 04:19:31 $ x( w* I1 L6 i
, H, b# b; \# i; P; m8 r3 \8 F+ h) S謝謝. 但我還是有幾疑問想要請你幫忙,麻煩你了.謝謝 ~
; M" U* X) B0 G' m' k; w, T9 \+ M5 }" Z
(1). 因為我要固定放現在的時間字串和BMP圖在被我Hook的Game上面,所以我必須要知道那一個OpenGL的API是一定會不斷地被Game來呼叫,這樣子Game畫面才會不斷地更新. & w4 B7 S" o# n' J/ f
時間字串也才會不斷地被更新而BMP也會不斷地貼在Game上面而不會被Game遮掉.
' r6 L) G. y$ f, I/ U像是DirectX Game中的Present API就會不斷地被呼叫,所以我只要把現在的時間字串和BMP圖放在這個API裏面就OK了.
: u2 Z. Z* m0 C" A9 Q2 F所以我想問的是OpenGL Game中是不是會不斷地呼叫wglSwapBuffers這個API,讓畫面不斷地更新 ? 還是有其它API是一定會不斷地被OpenGL來呼叫 ?
, x+ D1 V: ^* X* {& [
0 {4 F2 f+ L" r" o8 X$ d- Y! Q/ J; z7 x" w' R! x
(2). 現在OpenGL Game看起來都不是用Pure OpenGL API來製作,比如說像是用Glut ) K* ]) w; Q, @: M0 {
來開發,他們是只是封裝起來底層還是需要用到Pure OpenGL的API 嗎 ?
% @# l9 K2 O9 n- T8 s0 g A* G 這樣我寫的Hook才可以通用其他非Pure OpenGL的Game.
j. d/ K& s% S7 @# h2 K! K8 j. v! I3 M/ c. O% D
(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
8 K" y j; b3 V' x! q5 {/ `% R1 I+ l
$ O D- {! z" n' @
" S; ?1 _- F% a( I" J. R9 @. j, u( q5 D. ~$ H( `) N, w
/ c% Q( g" R1 { X! K" f1 |& N4 E
作者 : dorkas(aming)
3 |( j! p! f$ y' ]3 I[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ]
( ^5 T6 B7 V; H H+ T$ G[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
% e y/ ^9 s! H( l2006/9/7 下午 05:31:01 . }/ ^: H9 A, w% F! q
0 u1 q, I3 p3 W" M/ a" R
1&2 9 U" @" j) V2 d2 f
我對OpenGL不熟...
9 X4 }8 p1 t) B2 m; w$ i
/ U0 ~* {9 [ I9 }1 }>(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
: b( ~1 r" D! n, I. F
1 E+ Y6 X9 s% E* L8 |. K
+ [+ f1 g i% ^2 Z1 R初始跟結束都是做一次的就好了 8 q2 f1 ~$ Q- h5 x4 t4 i: ~
你高興要擺在迴圈裡面也是可以 Z8 L& p/ R+ l8 l Q$ w
% N. a- u4 |, C( G, k3 S
程式的要訣就是 起 承 轉 合 6 u: B2 I/ v+ k" S0 _) w, _ |
initial 8 @: t# T! ~2 F. F
upDate
' U6 C- f% @* ?change + h1 m) [) A$ X# Z
finish 0 Q# P R: ]2 Z; P' z4 Z" W) x( \
物件也是起承轉合 ( H: g" N$ j, i, Q
函數也是起承轉合 . b9 h3 _& r% S0 k; u2 F, ~
迴圈裡面也是 起 承 轉 合
. H3 x4 e a6 I: y) J- f
% K$ d" X1 g& @4 `( ~# B起 $ a! l. x0 x+ X' m; }1 M
for(起;承;轉) 2 h% e2 e' u2 _1 j* T
{ 2 M c, Y! Y8 \: I1 \, o! Q
起
7 s+ `" d' f3 d3 F& B r; V承 & g; n, R* {. C6 `
轉 ; t; n/ |' k2 P8 F8 |( p0 [
合 6 X5 x# R/ q, U1 p- e* S* M
}
8 d4 v3 g0 ]) ?合
/ i- J) C S6 Q: I7 r* t1 r+ d" |& V/ k' _. l# F
只要你分的清楚 屬於那一塊的性質就好了
8 V6 Q" v1 o4 V2 o' s2 J9 o% L: _: W- i; ?
7 [9 E9 y! T% j( s' B% I- p
. _/ w7 n0 k& X1 {0 ~
- q" ?9 {( G' r+ X% _4 p/ |8 e1 t8 e% M$ [$ X3 }) b3 @
作者 : fushunwu(fushunwu) 0 J6 |" t9 |' d8 w" W( g$ A
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ] $ G4 T% U8 x! K$ m y% `
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] ( }5 ^1 z/ Q3 i$ e% K" b( r
2006/9/8 上午 10:32:26 7 G6 _; w! m; A
1 U$ H$ A9 d+ u9 Q, J/ _
恩,還是要謝謝你,目前問題還是沒有解決.Quake4和CS 顯示的狀況還是不一樣~
- e7 ?$ y5 a# d3 _
. T% a" L5 c% D9 v* K像是Quake4這個Game它就沒有使用到glBegin這個API 所以我hook不到glBegin
, e/ P" V4 y6 }' ^8 Q+ n! e所以我就把顯示字串和BMP圖放到swapBuffers裏面去做,字串可以正常顯示但圖秀不出來 " t! k2 D- ?: ~$ ?) A8 \/ g
我在想是不是因為座標還是矩陣的問題 ? . M( m- r( n/ ^0 D) w& s- P% G5 D
/ B' p5 ^8 }: {$ I# x7 S* ?但是CS放在swapBuffers圖和字都顯示不出來,但是因為CS有用glBegin所以我就把同樣的code放在glBegin裏面,可以顯示字串只不過會顯示很多個,我在想是不是也是因為座標還是矩陣的問題 ? 1 y% A1 g. ?. N! {$ }1 t4 x1 m
至於BMP圖在CS片頭時可以秀,只不過會秀滿全螢幕而且是顛倒的占滿整個畫面.
( m. m2 a% r' g& m6 j9 F$ g! h
6 H) a; `! Z0 O2 `+ G/ ]所以我才想說有沒有一個統一的方式可以讓我把同樣的code放在某個OpenGL API裏面去然後每個OpenGL game都可以正常顯示. |