这篇文章的一些思路和我的某些思路类似,留待以后参考。 7 ^* ?- O z* \+ A% t' T% g F- W* z
建议还是看原文,比较清晰,为防止原文失效,贴一份在这里。 4 O5 o" ~ I2 [. Z" G: K
6 G+ |! }; ~0 i% l; _. p3 k2 I( f$ o
原文 ( z/ O: L" ~, D( ~9 n
http://www.programmer-club.com.tw/ShowSameTitleN/opengl/1654.html 5 O6 [6 x" d; i* F g0 F+ z
% G8 ]4 U$ N- W f0 e
大家好,
3 @2 C7 T' `0 V( x7 \
8 J* [' N# M+ ?5 z& c& ?: Z0 U我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
6 w8 j2 @# R4 w& _* Z$ s,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣.... 6 K$ C4 s. p: C8 S5 w; b
$ A2 L. N Z7 }- M3 o(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個
# z* l0 }/ |1 L& i; E* X 但是BMP圖放在wglSwapBuffers卻顯示不出來
! R" o: Z; q2 r9 v) ^4 V(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一
% V, Z8 H' ^: e9 X$ P& W樣的時間字串 " t4 ]- A5 O8 f
2 B. g$ a U; q8 I* b6 ^, x; M8 T
. P7 G' F- V" E1 [; ~4 _4 u作者 : fushunwu(fushunwu) 0 T5 {9 N3 i8 B5 K( O+ @
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
a; {: H0 o; M( N[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
, w+ P* `& O# u, K3 n6 j7 ?* c2 A/ q2006/9/5 下午 03:21:34 ' J8 @' B% B$ u) e8 w w& C$ O( v
* [% e5 Y( f# J$ x: h
sorry,按太快還沒打完 .. `$ q) h( U$ x$ B7 z+ }3 V
7 } W% P/ N. `- P y我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
- p" |. o' f3 _3 V; `/ c8 _: M. ^,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....( 我使用MadCodeHook的API) 8 @! }: W- Y2 |5 E
% x6 l9 l* y* Z) x2 Y: M5 I% X% h
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個. 但是BMP圖放在wglSwapBuffers卻顯示不出來
3 Y/ m/ L8 Z2 V! W" R, z(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一樣的時間字串 ; BMP圖放在glBegin中中在cs片頭中還可以顯示,但是圖會顛倒而且會占滿全部的畫面,進入game中再開圖就掛了.
2 T ?/ o) B2 u9 d5 U7 p. U; F6 Q) x6 X- V, g$ z h5 n
想請問各位高手,有沒有一些好方法可以解決 .
# T: F. d* [$ l3 y9 K1 D; ]% a' Y$ ]) }5 g
下面是我hook opengl API的code : 2 n# ^& ]6 N5 }! r1 i* h
// hook wglSwapBuffers的code; hook glBegin的code也一樣 . r4 S. A8 m* l6 Y8 |8 s H' I) z! R" l
void WINAPI wglSwapBuffersCallback(HDC hDC) + B& X$ B$ F& w. t3 ~% s+ z
{ $ y* U/ d! B6 ?) \
. \. J8 e' L I- F( D
if(!ininstializedfontshit) 5 x* t' w- \+ |, E5 X/ U8 Z' }8 ~3 R9 z
{
0 l' E8 W2 p# \. p3 w2 N, @: vfont.InitText(); $ W: t) c9 _6 f6 Q. M8 N
ininstializedfontshit=true;
# I( \2 q/ X% R; R3 X& x}
! ?7 j. f* K' |! @/ P& R5 g, {# |$ ?0 u% c0 f) }% b
SYSTEMTIME SysTime;
" ]8 D; u7 t. I* ZGetLocalTime(&SysTime);
) A8 z q( ^2 v- X- o- dglPushAttrib(GL_CURRENT_BIT); " U3 o2 C6 g# a! w# f
// 顯示現在時間的字串 9 d+ `1 M; h+ [8 d$ G
font.Print(140,125,255,0,0,0,"Time: :%:%",SysTime.wHour,SysTime.wMinute,SysTime.wSecond); 7 c/ b% L& o! S( {
: a5 c1 R+ Q3 y/ [& g8 x // 顯示BMP
8 v- R4 V9 U1 F& f" t! p5 y) z8 G2 J
. Q( _3 Y9 S) P! W1 I+ m0 k* _ byte Texture[]={IDB_BITMAP1};
4 p$ v, a# E! |# @' i# m glGenTextures(1, &texture[0]); 3 O2 a6 l; N8 V
hBMP=(HBITMAP)LoadImage(gl_hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0 , LR_CREATEDIBSECTION);
. f: C6 E4 a3 M+ {3 ~9 f, W2 B
! R* @; \: y; d' n5 S$ @2 sif (hBMP) // Does The Bitmap Exist? ; ]' E1 E3 p- w8 t4 v9 _+ Y0 p
{ // If So...
1 t0 k8 I; o9 Y# O% QGetObject(hBMP,sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object
( X& U8 u2 J! p) W* Z// sizeof(BMP): Size Of Buffer For Object Information
& a4 i7 _7 u" N4 u9 B* i// Buffer For Object Information . E& @, G0 f; c% }5 c5 Y$ J' n" a
glMatrixMode(GL_MODELVIEW);
2 d: |3 n+ S3 K+ o9 HglLoadIdentity();
: f+ F( v6 B4 SglTranslatef(0.0f,0.0f,-1.0f);
! [& l: \- v. Y8 tglPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]); . t( t' w0 k& u% ~. {
// Bind Our Texture
0 Z$ W5 J; n; _, l% N glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST ); // Linear Filtering
& r4 U7 V5 m0 _% l$ x# H& Y glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Mipmap Linear Filtering
4 i) e! e& ]$ g, _" D
4 H+ B; z8 {, [; IgluBuild2DMipmaps(GL_TEXTURE_2D, 4, BMP.bmWidth, BMP.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, BMP.bmBits);
3 F+ u) i0 E4 l" TDeleteObject(hBMP); // Delete The Bitmap Object ( U. w( {0 f: x' J& N+ \4 z+ Y1 ^
}
: B: ]/ m) \% f A4 oglPopAttrib(); 1 w- Q4 a# z/ ^- Z, h
* Q) E1 t) D% J: x9 t* p: h. F1 z% a
3 u4 U$ ^' M' L}
2 g! m) B# }+ U& A, V6 t$ jwglSwapBuffersNext(hDC);
; o9 F# R9 q, H8 ^& u/ N} - L0 [" t4 o' j" J: `
/ r; l& s% c, e& Z! z7 M, _0 [7 S# ?, J
! O( o2 B9 Z' q0 r" }, k, t
6 c# m7 X; S2 |/ O. w% h _0 i( S' ^; Z! q% Z. Y0 r; Z/ q
" k; E- ?# _% J5 w! I4 {+ F6 \作者 : dorkas(aming) 7 y$ ^2 U6 I+ L
[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ]
" I8 V5 f4 X( M1 Z3 T/ Y[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] + J& s1 @4 d: Z S( l: \6 S
2006/9/7 上午 10:30:03 8 L. G! c, c; {4 z- `3 N
) F9 n+ V( x4 u
1.貼圖動作錯誤
6 ?# z I& |$ Z3 u E9 s+ r" a' x$ D0 s
2.
4 k+ a9 _; E, B' f3 G6 V1 n* Z每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡 3 S+ T6 p* ^( Z8 G! J9 R
" W# M5 }0 k! m7 r& J; @+ u
7 Q6 }# B& Y* o2 X" q+ o
struct MyTime * Q4 n L/ p3 K/ c" B6 L
{
) y* Q( S' v2 |3 }4 L; B byte Texture;
, I8 g. w( c2 l FontGL font; ' x7 ~9 ?8 F/ o+ t' k' o
void initial(void); . Z' C. ?. m% K! z: b. |
void finish(void); 4 h6 x' q" F% ]+ X# d ?/ R% B
void draw(void); # {2 i2 Q; r( y0 x
}; 9 O1 \* I5 [1 O' {. {8 `5 W
void MyTime::initial(void)
1 z, H2 R0 c5 o* X{
! i, J) d( j" j) H" d' j& }4 b // 載圖 初始字型
) d5 ^- I8 c6 ^: a- G$ g( _- F font.InitText();
; T8 V- t/ H( k6 b3 |, Y0 V" l glGenTextures(1, &Texture);
" t: C( z) q' V# h+ y; M0 c/ a} ) b* u; l' l6 ^( _5 C7 K
void MyTime::finish(void) & }" F0 X8 E( R3 j+ r0 L9 l
{
+ k4 l6 x" m$ b, J" n/ Q //釋放圖形 字型資源 . _6 H8 M" x/ m8 O6 Z2 }& c/ c. N) b
}
5 w3 a; ]+ M" E3 F3 ^0 j5 p2 P2 u: B- F: {
void MyTime::draw(void)
$ C! |* }2 S. C; m# ]{
" k# t! }: Z* s7 g, z; b // 顯示現在時間的字串
' q7 k |' S" Y5 R2 { font.Print(......something...); # r4 M# _5 C% n7 f) F# d1 w
// Buffer For Object Information . H/ z/ ^! J k5 V; U
glMatrixMode(GL_MODELVIEW); ! v }& T3 I, F, L) y' C. i+ F% l1 P
glLoadIdentity(); " J; W j! P: J8 C
glTranslatef(0.0f,0.0f,-1.0f);
. v* _* Y) P( y. I/ p2 R* {0 J+ Z glBindTexture(GL_TEXTURE_2D, Texture);
( t$ j+ c( L! v' C- U+ K% q \' L- ?% T0 _
..... DrawSomeThing 2 b* W3 W, Z6 `& R0 S
5 d" W! L! z: I/ |} W$ i+ z }' R1 `
$ i8 c- I8 J2 x% H- y* u5 g$ c+ }/ f; L3 ]
MyTime time;
( `) P) p$ q2 Z/ f1 ]3 g0 ^1 ~void WINAPI wglSwapBuffersCallback(HDC hDC) : x5 s& t& i6 G# q6 s c5 t
{
% g$ B$ K0 w. H+ K time.draw(); & }& v" I4 X. m& t6 U" D
wglSwapBuffersNext(hDC); + {, _. g3 x( H) F0 J9 E
} . z! \7 D0 z4 c p
! _/ |5 k' M) h, e+ Q9 Y* ^
你只要掛進去前呼叫 time.initial(); ) A4 J9 ]8 v' H
結束呼叫 time.finish(); 5 L4 b& Z" P1 ~9 q
0 Z4 x2 w6 u9 Z7 \ T# G2 X8 L, v" }1 X5 V3 i
4 u! e E( F; l8 n) g" p
7 n" ~. i- R3 l1 I/ D( X/ U
作者 : fushunwu(fushunwu) 2 D7 N, r2 M+ J
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
$ s |, b+ v) S! |) V% H+ d[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
5 U; M* [* _; B; b' g2006/9/7 下午 04:19:31
9 a4 }, ~. M7 Q, s2 ~
2 _3 s; m/ _' F謝謝. 但我還是有幾疑問想要請你幫忙,麻煩你了.謝謝 ~ : `5 x' `/ n5 M
3 @- E& j/ q7 }' N. J; s- u0 x(1). 因為我要固定放現在的時間字串和BMP圖在被我Hook的Game上面,所以我必須要知道那一個OpenGL的API是一定會不斷地被Game來呼叫,這樣子Game畫面才會不斷地更新. B3 _5 q! O" c/ d+ n- @
時間字串也才會不斷地被更新而BMP也會不斷地貼在Game上面而不會被Game遮掉.
4 [+ R+ M( D7 E8 l/ @3 z$ _+ c, r& G像是DirectX Game中的Present API就會不斷地被呼叫,所以我只要把現在的時間字串和BMP圖放在這個API裏面就OK了. . v& s3 y! L+ S0 Q' Q2 b
所以我想問的是OpenGL Game中是不是會不斷地呼叫wglSwapBuffers這個API,讓畫面不斷地更新 ? 還是有其它API是一定會不斷地被OpenGL來呼叫 ?
! ?5 S; @" `: ]9 r" F- N/ V$ L% k9 r1 z8 x8 n) I" E- x, i! r- Y
3 h8 e3 C0 o) T; t9 t(2). 現在OpenGL Game看起來都不是用Pure OpenGL API來製作,比如說像是用Glut $ ^5 I8 A7 j' z3 [. a8 t
來開發,他們是只是封裝起來底層還是需要用到Pure OpenGL的API 嗎 ?
& a& v" S: I( ^1 \4 m. ^5 c 這樣我寫的Hook才可以通用其他非Pure OpenGL的Game. 3 [4 g/ X6 L% N
6 F& m+ n0 B! K7 _+ x4 o5 t( ]
(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
! ], T) Q$ }( ?$ ]$ p0 N* L1 L8 l$ N# ^ p4 A) W
( R) w! Z2 n% W( j, Q$ M( d& f4 _
; G0 z% P7 B5 r5 P4 h! [' f: C0 p
: q* d* b3 F" ]. g' n; H) Q% Q+ l
+ D( O" W0 P, O7 U1 n7 g3 k" i1 v) G1 @, h作者 : dorkas(aming) ) f; G7 _, L/ h8 ?( C% S
[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ] ) R, ]4 a2 c k9 F$ E
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
! y% N9 t8 }# Y2006/9/7 下午 05:31:01 6 n) s. J1 M, n/ Y6 e- @( Q
) [% ?; b. q f% {; Y1&2 % j0 O$ g$ }2 O
我對OpenGL不熟...
~0 \) h; `% b% T3 i
* ]& L7 i5 v& W3 z>(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ? ; L" M) f! D( k2 S* x- m9 ]
5 L/ y3 y9 P6 K V, q5 V
. B7 z" C# O4 [# E/ N5 o7 ~初始跟結束都是做一次的就好了 / m4 H3 Q% q7 K' T
你高興要擺在迴圈裡面也是可以 4 I5 ]: }+ L% E p$ J9 e' b
9 b+ v* j: |4 `+ |9 X
程式的要訣就是 起 承 轉 合 ' N0 h: W. ?* r
initial
" ]. W9 s0 ~% A' w9 e6 yupDate ' l; A& ^! C. _& U( c/ k
change 6 [9 h+ ]& d, U; F
finish 8 N% T$ T4 w5 k j$ f
物件也是起承轉合
/ P, B9 W9 E) J" y+ F2 L函數也是起承轉合
, l2 [4 n/ g0 J迴圈裡面也是 起 承 轉 合 % J+ ]5 z7 s9 G" p1 N2 X/ q
* e! a& V) s9 O# i) p O
起
7 [- z+ g) n% c. Vfor(起;承;轉) : F8 J1 f0 e: o+ W& L
{ 8 z- j. T+ E7 [8 N' F
起 3 ^% Q/ i* p8 q! o# P
承
& f0 S; @1 Z' I, P# E) r4 j轉
/ c& J. s! f# r$ U8 ]合
, L: A+ n+ B4 O0 |/ z6 {0 R} 1 ]8 u2 O8 g1 C7 O
合 # w$ k5 o. f% g4 \5 ^' W
" @$ U& X2 r! E
只要你分的清楚 屬於那一塊的性質就好了 7 l) w6 c5 n! q0 @# g
2 G) {+ c7 }/ u4 L+ h: Z
) z4 L3 m) k) R' l# w0 L2 @
: x: q9 ^5 }/ u
$ ]. L$ u9 F# m" {. b3 J9 D2 A0 t% m) Z( A: p
作者 : fushunwu(fushunwu)
- U1 ~& @" D. m; `; Z4 R3 O) R( z[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ] " E' l5 [' N. P4 n: y
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
t" ?* h T8 f$ d V5 ?2006/9/8 上午 10:32:26
# q8 [4 O: y3 L: r1 D! M, h q
& T7 j( v8 n/ A9 ?恩,還是要謝謝你,目前問題還是沒有解決.Quake4和CS 顯示的狀況還是不一樣~ 6 w2 K2 e# A' b
3 M& B. J$ C. K3 t* h. y- B+ h像是Quake4這個Game它就沒有使用到glBegin這個API 所以我hook不到glBegin : T" A- T/ X. T7 P4 I
所以我就把顯示字串和BMP圖放到swapBuffers裏面去做,字串可以正常顯示但圖秀不出來 - F+ w( n$ L; Q
我在想是不是因為座標還是矩陣的問題 ? 1 `+ C) `+ `( K
$ R& R7 a/ K9 y" R
但是CS放在swapBuffers圖和字都顯示不出來,但是因為CS有用glBegin所以我就把同樣的code放在glBegin裏面,可以顯示字串只不過會顯示很多個,我在想是不是也是因為座標還是矩陣的問題 ? 6 ~" y' Q5 e0 m4 M
至於BMP圖在CS片頭時可以秀,只不過會秀滿全螢幕而且是顛倒的占滿整個畫面. 3 V% i. r3 K7 E+ t4 T. z ?! L
4 j) @, M4 b/ n! o/ f( n# U所以我才想說有沒有一個統一的方式可以讓我把同樣的code放在某個OpenGL API裏面去然後每個OpenGL game都可以正常顯示. |