这篇文章的一些思路和我的某些思路类似,留待以后参考。 9 L. W" k( \0 L2 l3 n4 P! R
建议还是看原文,比较清晰,为防止原文失效,贴一份在这里。 p8 i* T* D. x1 I) y
! |* [; P3 W& U$ ~; X! J
原文 0 R( P3 l9 E1 z* Q: u
http://www.programmer-club.com.tw/ShowSameTitleN/opengl/1654.html 6 G3 |: ?4 ]" L) H4 Y
$ M$ Y6 C& | ?9 L
大家好, # N" I" G: d5 {
# d0 a8 V/ S: O' s" Q3 |# N) N9 Q& R
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable % \2 Q/ p4 n3 n O% D! ~+ S( V5 f9 \
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....
7 i$ X4 @1 U! ?' D4 M0 Y- R) A) H
) T* X) X0 H. u/ o4 ?& {4 L* {(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個 6 P8 L% q5 M/ x# y5 S
但是BMP圖放在wglSwapBuffers卻顯示不出來 8 R2 M( {7 Z$ Z. l6 I
(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一
9 R9 N$ i# c" f9 c, [樣的時間字串
4 W0 V9 s6 ~7 m1 l. O* q* U: t% B) e( W. E7 [8 {6 ^
2 n. q: F5 l8 w, w( a+ A* E
% N. G$ J0 M( {7 h9 n4 K; Z作者 : fushunwu(fushunwu)
" j9 N) C4 U# O% C8 b) @( S[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
* z' {# y: B5 D+ x' h& ^) S4 i5 W% K[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
: {5 r \0 X1 K& v2006/9/5 下午 03:21:34
* @" J6 h5 t# n6 N
6 q. z8 e7 i- z8 msorry,按太快還沒打完 .. ~; Z: C0 j2 C5 F7 ^
- p9 ]" a. A+ m( N7 V( v0 U& S: b
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable 5 L$ Q5 e$ n7 R5 P! i h$ N7 |: {
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....( 我使用MadCodeHook的API) $ t% b# D6 A$ f$ H2 \, q. ]
7 }: R. j @& ^" _# l7 K
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個. 但是BMP圖放在wglSwapBuffers卻顯示不出來
4 {6 c+ m% u: N# w. u3 y T+ k( j(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一樣的時間字串 ; BMP圖放在glBegin中中在cs片頭中還可以顯示,但是圖會顛倒而且會占滿全部的畫面,進入game中再開圖就掛了.
7 z9 ^9 j# r1 [ b. n# ?# h: |+ ?; T
想請問各位高手,有沒有一些好方法可以解決 .
* r* }, b; x3 p# K5 Q$ T
' C/ l" V5 \' v0 {: ]( i下面是我hook opengl API的code : 4 V4 U; {' k0 Y5 k0 H, j" y% W
// hook wglSwapBuffers的code; hook glBegin的code也一樣 ! E3 Q% x [: c% I1 ]5 i
void WINAPI wglSwapBuffersCallback(HDC hDC) ) u s2 {- [* N' {
{
; h. ?) I( \! F; y# O% M' _
( ~: [6 @% z [( Xif(!ininstializedfontshit) $ J" { n1 ]& m5 o
{
: t$ Y, q. m5 r3 Mfont.InitText(); - v& }4 x3 z" v4 }! A6 D
ininstializedfontshit=true; : E1 N7 B1 [8 {2 C3 p7 c7 X
} + q/ ]( @6 W i" o7 Z9 t) ~
& r' x u7 Y- q8 B8 s9 SSYSTEMTIME SysTime; , Z8 w5 K. E4 I/ m! g
GetLocalTime(&SysTime);
0 d2 D- L* X5 b) w, dglPushAttrib(GL_CURRENT_BIT); + O: _- @4 L; U0 G& g( g
// 顯示現在時間的字串
9 k% j# a! S! nfont.Print(140,125,255,0,0,0,"Time: :%:%",SysTime.wHour,SysTime.wMinute,SysTime.wSecond); . S8 Z/ f" L( F, e2 \6 F8 E1 a( ^
3 R% q" q% r% ]# z1 a- u+ U // 顯示BMP
; H) [9 s, J9 ]
" U, w1 q7 v1 T, Q0 j byte Texture[]={IDB_BITMAP1};
; W" s% }- z" U glGenTextures(1, &texture[0]); $ p5 D% u( A3 w# J0 y/ v
hBMP=(HBITMAP)LoadImage(gl_hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0 , LR_CREATEDIBSECTION); " v! ~* }: T# n9 l1 b0 o# _
' v& P# M) l. d& Y, g& R5 q/ k
if (hBMP) // Does The Bitmap Exist?
6 {% j# w0 d/ g1 X{ // If So... t9 |6 M. V9 g0 E0 `. F
GetObject(hBMP,sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object ( @+ h( ?* |9 \
// sizeof(BMP): Size Of Buffer For Object Information 5 s) o P* ]( T* `3 q: G# d
// Buffer For Object Information
9 M8 e) ] R I$ ^glMatrixMode(GL_MODELVIEW);
- Q* k9 D$ V3 b$ v* ]/ `3 e1 VglLoadIdentity();
' H2 S+ A. a% M, |* uglTranslatef(0.0f,0.0f,-1.0f); 2 P, |2 I5 n) w
glPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]); ! R- c9 J, }8 o0 ]
// Bind Our Texture + S0 t8 v, O5 N7 A
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST ); // Linear Filtering
K5 ?$ a3 V: q8 ? glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Mipmap Linear Filtering 2 f4 a) ^5 x5 A
% `3 N+ }* D4 r* w. fgluBuild2DMipmaps(GL_TEXTURE_2D, 4, BMP.bmWidth, BMP.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, BMP.bmBits);
( j2 D7 t x* u5 jDeleteObject(hBMP); // Delete The Bitmap Object : M. x! G1 ], X A% f
}
1 Z* M$ ?. J) h/ v: e1 CglPopAttrib(); ! e' f- h9 l% q# m7 v! t
3 D' n0 l3 L! u- g- F
1 T p) c0 v" ]8 s} $ c0 P7 K2 V. L! o5 [6 {0 E
wglSwapBuffersNext(hDC);
4 p( A, L5 G0 j}
% H* G- ?! V; f2 _) x( O/ E
* F0 b* l; K: ^3 P4 r3 H, [9 v6 P
* Q5 F T" S" [! [5 z
: F# n9 U2 C) O# @* k4 \3 E* P% A+ |8 q6 M+ c) `4 i
& b6 g [+ n" _, T
: v* \$ p1 v: B5 F
作者 : dorkas(aming) # z0 F g6 }; _. K4 O
[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ] $ a. W& L% t4 C" F$ ~4 Y. E* C
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2 Z+ L( x3 l5 z( M2006/9/7 上午 10:30:03 3 p* |4 o5 J) T3 H6 H
/ r- w3 r" z! F7 W1.貼圖動作錯誤
: i; B" J( K5 j5 C* M6 k3 G4 o0 u
6 T9 i0 K' M5 e6 J; k/ q) L" |2. & C8 _5 V* @; }2 Q5 C, D8 h' _5 v
每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡
, |4 y. N! e5 P0 y, a
" |- ~0 J! h% {+ [
; v8 Q D1 ?8 z; Rstruct MyTime ' y- r& U) F' C( ]+ {3 [
{ * O. B8 }* S0 C
byte Texture; ?4 v! p; a3 R F) [! v
FontGL font;
: b) l# s* a+ X" E# V& o void initial(void);
7 i3 z( O1 Y+ N- G void finish(void); 3 R1 K, V- i+ d
void draw(void); $ @+ R; N+ Z K+ t3 u" L" E3 ]
};
+ ~- {' H) c: k8 t. }void MyTime::initial(void)
0 H: w- O9 C1 e: H1 M* j: h' W{ - K5 h3 [, z; S8 d5 _3 R
// 載圖 初始字型 & o' @) A' C! a" c
font.InitText(); 6 d. g# N0 f1 A# ^3 Q$ s
glGenTextures(1, &Texture);
( l+ }! b" k. h3 o}
: C- Y4 J! Z2 w) v* S, Q+ Avoid MyTime::finish(void) 6 S; [7 T& ^% p' m4 ^* G- M y: p
{
5 f# d9 c* w! S8 z8 B- J4 V% } //釋放圖形 字型資源 + y p/ h+ X. e' v4 a% {7 @
}
- H& H. s8 k( q1 e
$ t5 R2 k! U" }" X3 v/ Kvoid MyTime::draw(void)
8 c( C u( e- D1 u) e" z7 c{ 9 B6 u e5 P. E
// 顯示現在時間的字串 0 e9 o* a E) N( V
font.Print(......something...); 9 @) o! |& k7 u8 o W* b0 s
// Buffer For Object Information
/ {4 g3 k! q; N glMatrixMode(GL_MODELVIEW); 4 E# {# W- ~/ Z) x {2 G: L
glLoadIdentity(); , w! l% L/ n' B0 m4 H
glTranslatef(0.0f,0.0f,-1.0f);
5 I1 Y7 `, J/ _3 J. E: | glBindTexture(GL_TEXTURE_2D, Texture);
- g `# Z8 o3 K1 A# u+ j. e/ o+ G J
..... DrawSomeThing # V* K( t1 i5 Z1 c% |8 ?: ]
$ u! b9 _- M' O9 p} 7 _: q8 c! {* O
- m" U% X7 O; v; p5 K: F: S) v
- @; o. w5 S; O$ [& e/ b6 EMyTime time;
: Q8 O9 B* s7 j8 D: |7 C" Ovoid WINAPI wglSwapBuffersCallback(HDC hDC)
0 R2 Y. \- b- t% s8 h. ^{ . g: E2 L, z _, f `
time.draw(); 4 o3 I4 d I8 C' g
wglSwapBuffersNext(hDC);
0 g. L6 c0 [( } n6 a9 U1 K} $ c: u8 j0 K- j% d% U
2 J. u! m, d3 k你只要掛進去前呼叫 time.initial(); # m8 o2 p5 w, L* {
結束呼叫 time.finish();
4 T# P6 @8 ]% _9 Z3 i
T/ X( X2 t. o H5 W# g' {6 z# ? i1 m) l) s( K% w; j5 H5 _! H
4 }' H; G9 F) g3 k1 w
2 w0 [- ?2 {" H作者 : fushunwu(fushunwu) $ f p. d; b d
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ] - Y* _1 v2 K+ t6 A
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] 4 m+ }2 R, w0 [( i/ u
2006/9/7 下午 04:19:31 " Z/ U* a# J2 p
1 _- {! U; V5 N1 g$ V- c, G+ [謝謝. 但我還是有幾疑問想要請你幫忙,麻煩你了.謝謝 ~ & R. y1 U4 A G. f0 R
! E$ [; i- B9 \(1). 因為我要固定放現在的時間字串和BMP圖在被我Hook的Game上面,所以我必須要知道那一個OpenGL的API是一定會不斷地被Game來呼叫,這樣子Game畫面才會不斷地更新.
, U7 i! [7 Y* m時間字串也才會不斷地被更新而BMP也會不斷地貼在Game上面而不會被Game遮掉. 8 F7 O+ `2 H, V3 A" T8 U" H7 N/ z
像是DirectX Game中的Present API就會不斷地被呼叫,所以我只要把現在的時間字串和BMP圖放在這個API裏面就OK了.
8 ?4 ^' j# U3 h2 [: }6 @5 s) d! f所以我想問的是OpenGL Game中是不是會不斷地呼叫wglSwapBuffers這個API,讓畫面不斷地更新 ? 還是有其它API是一定會不斷地被OpenGL來呼叫 ?
% u5 A \7 h! ?) e4 P) g8 \. P9 ?: g6 v7 ^6 a# R# ^
8 ]3 Y: t, n1 A! d(2). 現在OpenGL Game看起來都不是用Pure OpenGL API來製作,比如說像是用Glut 9 ^5 G& g; r# [( e1 E
來開發,他們是只是封裝起來底層還是需要用到Pure OpenGL的API 嗎 ?
" C3 T% ^* m0 h! {+ B% z$ g 這樣我寫的Hook才可以通用其他非Pure OpenGL的Game.
+ M U# p3 X+ `) o9 l! \% W
- r% J5 g5 k0 t' S(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ? : o1 H8 g# A, p' v2 ?# k" B, e7 s
3 O; W( D1 @9 z) Q. M( E) f x" c% B; s
3 H/ Y5 Q5 a, m1 Z# P7 O
2 P$ N( y4 ?4 O1 P* {
M: G# K6 [& n3 l" v! h- q5 {作者 : dorkas(aming) 9 B' a! Q/ A. v
[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ] . B) ?9 ]0 Y6 o* Q0 _; S. _# C
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
/ R, P4 e0 O" S$ M2006/9/7 下午 05:31:01
* t; y" a' }, V# g; b& j i
, }# [2 U, m' ~- a: d1&2
& q S- C& \- g/ o, x z我對OpenGL不熟...
$ ~8 T3 t5 S0 h% X. p S0 e
' @* e3 d+ R3 x% ]$ h& E>(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ? 5 a- c2 I! o* S" {3 N
}# _ x/ K' e6 G" c( s+ ?
& D+ R& V( x) D1 y. O0 i
初始跟結束都是做一次的就好了
- U- d1 U4 D S" N' d你高興要擺在迴圈裡面也是可以 ! X) A" N( h6 R# \0 {9 z' K
; ~- E) r# | K, ]
程式的要訣就是 起 承 轉 合
" p' I: x H& G0 V4 x! Z! Linitial
& X8 B6 [1 ^% \# w% k2 _: f9 SupDate
: R8 F B9 U$ v* E& x8 j' ]/ \change
! [/ E# c* e4 I9 @* x) tfinish 2 I% e; {* _! E$ D$ C6 U
物件也是起承轉合
1 ~& G& F1 R# c: ^8 G4 y( d2 B0 U+ ], h函數也是起承轉合
2 j' u, n2 _. z* h4 D; C迴圈裡面也是 起 承 轉 合 3 D8 M5 F, a# N7 N& D2 h0 i: l9 G& ^
# u) p7 \4 |& `2 K: S1 ]起
|! F4 ?- K2 b D6 N$ s4 M# M& B! L8 zfor(起;承;轉) * P; u. n' _. c! q4 V h8 o
{ " e+ n1 I$ k: L. Y
起 8 I6 ]; P: P/ S* {3 W' @/ f1 \
承 4 j d1 z4 U$ W0 w9 x$ _, N6 B
轉
R! g5 I( P, `; w3 I b合 5 x( Z7 }9 q* |9 I
}
% r. S, D, Q# J+ c3 a2 E1 C. G/ O+ y合
4 p3 n: A& g/ y+ X8 F0 T
$ P' |2 ^$ p3 }) [; O. M: z只要你分的清楚 屬於那一塊的性質就好了 9 k: C8 a% h+ H0 _5 X
8 ~4 r. _2 n3 U2 [$ N$ j i( `8 Y4 y( p0 _+ @. u
8 L0 J0 O" `; q C
: \" B: M2 _& _; B, B$ p
- |7 y/ H; q3 w2 q: D3 s. h作者 : fushunwu(fushunwu) ' w9 M5 l' R( N* H
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
5 n& k2 ?2 u( H+ _5 Y[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] s' \2 X! T: o: a5 w& T
2006/9/8 上午 10:32:26 . O# Q( A1 C, S6 t; ^
- a* t9 p, E ^; v
恩,還是要謝謝你,目前問題還是沒有解決.Quake4和CS 顯示的狀況還是不一樣~ : o7 Q- x# x, \$ [! e) k# n8 t
+ A0 X( S P' C0 c) y1 O- {! j
像是Quake4這個Game它就沒有使用到glBegin這個API 所以我hook不到glBegin
+ Q9 U5 t4 u1 S+ O( o9 K所以我就把顯示字串和BMP圖放到swapBuffers裏面去做,字串可以正常顯示但圖秀不出來
% X5 U! {; i" w. ~我在想是不是因為座標還是矩陣的問題 ?
7 R" [" x! q5 c" W6 n7 y+ J, Z1 g
5 W- @5 \5 x" ~但是CS放在swapBuffers圖和字都顯示不出來,但是因為CS有用glBegin所以我就把同樣的code放在glBegin裏面,可以顯示字串只不過會顯示很多個,我在想是不是也是因為座標還是矩陣的問題 ? & U+ m4 m- w% A" z! Y# f
至於BMP圖在CS片頭時可以秀,只不過會秀滿全螢幕而且是顛倒的占滿整個畫面. ( l& b$ a- i0 E; j8 }
- \# M, K. i8 I; N2 h+ N
所以我才想說有沒有一個統一的方式可以讓我把同樣的code放在某個OpenGL API裏面去然後每個OpenGL game都可以正常顯示. |