这篇文章的一些思路和我的某些思路类似,留待以后参考。 . P4 s0 l$ s0 z4 d; e
建议还是看原文,比较清晰,为防止原文失效,贴一份在这里。 $ r" c- f- _7 }- V5 s
* R; `5 ]* n m i原文
9 `" u v. G( Z& Nhttp://www.programmer-club.com.tw/ShowSameTitleN/opengl/1654.html 5 l& v8 i* E$ T* d; H
' o0 P" o& n% a大家好, # O, Y9 }$ Y% ^2 T$ s/ r
1 }" h/ m/ P$ F+ [4 I5 x' k7 @+ e我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
# ]7 i- L5 F7 A+ Z5 m,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....
$ P5 s+ J# ?9 l; E0 G& |
/ ~( \5 R1 o0 G; O1 i z( E7 `(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個 * D3 P g/ v& ~" ]7 ^
但是BMP圖放在wglSwapBuffers卻顯示不出來
: N, E) D0 B5 j+ O8 I `8 K(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一 8 _* x$ ]. p6 I0 I) x
樣的時間字串 - v% M+ s* \% V ~
* U2 X( H8 X) |/ _8 I1 z* [
: T. R" U- |7 E) e( Y' S& u, W
- ~1 Y: `! T, |作者 : fushunwu(fushunwu) . U4 j7 j7 L4 Z5 q
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
6 ~% K8 h; g- c$ d[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] 2 {/ \1 R! h' W9 Z- C
2006/9/5 下午 03:21:34
/ s; C2 }8 C5 B. m# H. \! N; D# o H4 j- d# ?2 e
sorry,按太快還沒打完 ..
4 Q1 X1 Y) ~4 c- Q9 m( X) h* G$ z' h: h$ o$ K: S! C% Z! A
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable ]( J/ C! E/ t8 c
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....( 我使用MadCodeHook的API) 3 T. T. m' V; k. c7 S% g: [' `; a
9 f6 l+ S: U; E+ F3 A
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個. 但是BMP圖放在wglSwapBuffers卻顯示不出來
+ y1 n. y! v. ^: S0 X* W6 @3 q(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一樣的時間字串 ; BMP圖放在glBegin中中在cs片頭中還可以顯示,但是圖會顛倒而且會占滿全部的畫面,進入game中再開圖就掛了. " }! X1 F5 R' U: k. W
- i) i# A4 {* z3 Z, m想請問各位高手,有沒有一些好方法可以解決 .
" A, \7 b+ ` _0 U# d
/ O" I+ N# R/ L2 v下面是我hook opengl API的code :
/ Q& G. x3 h5 e// hook wglSwapBuffers的code; hook glBegin的code也一樣 % p) j0 k$ J8 Q6 X/ g7 \
void WINAPI wglSwapBuffersCallback(HDC hDC) : |8 L- T2 ^4 G6 _6 e7 j+ k* S; h
{ & B7 S& V" W1 v4 t- p8 S# x4 i
# o; A% F [7 b$ R: L$ t# xif(!ininstializedfontshit)
3 f. ]2 o+ ~$ U( Z/ V{
- o# z9 Y, ]. e: M8 b4 tfont.InitText(); $ n! L* ?( t5 t; S) y+ k
ininstializedfontshit=true;
2 w6 [( K. ^8 T4 b: Y9 i}
* {0 m3 R2 g! Q/ w8 b! `6 P/ M) s' G6 X+ }# G( ^ u0 |1 j; V
SYSTEMTIME SysTime; 1 D# E# L7 B: C
GetLocalTime(&SysTime); 2 P1 ?: F, `/ [3 ~0 |, T
glPushAttrib(GL_CURRENT_BIT); 9 M5 J7 x! R; ]/ R
// 顯示現在時間的字串
- K4 a( b0 O- X: I! n# V3 gfont.Print(140,125,255,0,0,0,"Time: :%:%",SysTime.wHour,SysTime.wMinute,SysTime.wSecond);
3 j) I4 d! T5 p1 H, L9 ^) R# v/ m! k' Z8 Q) }- e! u* j! F
// 顯示BMP 2 ~7 W- q7 @' X) v- O
% D9 `- M. c4 [) P
byte Texture[]={IDB_BITMAP1};
% u. S: s1 r+ y/ L- u/ c( g+ h/ a glGenTextures(1, &texture[0]);
6 o* _7 k* t+ l+ _hBMP=(HBITMAP)LoadImage(gl_hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0 , LR_CREATEDIBSECTION);
! M8 H! S8 V% y Q8 U0 R5 K% s7 q; ^2 E8 r+ b) P& y) s8 s1 R7 X. @
if (hBMP) // Does The Bitmap Exist? 5 Z0 V/ `& D1 o) a8 [' X
{ // If So... 1 @7 `' A, Y2 r6 W) W) X' V5 ~
GetObject(hBMP,sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object 8 } S1 Q4 n+ p0 r3 S( }/ }
// sizeof(BMP): Size Of Buffer For Object Information
# i9 `! V# U0 M+ K4 {- v: a// Buffer For Object Information
7 B E' e( `5 k0 IglMatrixMode(GL_MODELVIEW);
/ j; P! c+ p5 t/ ?9 V% K5 qglLoadIdentity();
& c! @2 v+ M* T1 K, s# OglTranslatef(0.0f,0.0f,-1.0f);
7 x; O7 [9 K/ w7 g0 ?5 t- d0 v9 r3 jglPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]);
e5 ^ d; U8 h6 r0 k // Bind Our Texture , V: D+ t5 h; Q2 b' {2 w1 P
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST ); // Linear Filtering 2 e& X5 A* r8 R0 w, t
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Mipmap Linear Filtering
0 q8 |' p$ @1 z; e9 Z0 a/ J3 H* `- w, C, J; D8 w/ }1 R8 i
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, BMP.bmWidth, BMP.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, BMP.bmBits);
( `5 g! O0 }5 zDeleteObject(hBMP); // Delete The Bitmap Object 1 |$ K; N: x; u& G2 N" Q4 r- n$ B
}
~9 c4 O/ n5 Y3 g# fglPopAttrib();
) ~5 U" T, S( Q. L9 q8 ~6 |2 [9 N* M0 D
' @1 h! }0 \; c2 y1 { z1 [} 9 }# m: {) o3 c
wglSwapBuffersNext(hDC);
& ~& G4 ^9 {, Y8 R. w/ v( |} 6 l/ L: v7 S& q8 X- \5 Y
+ j4 W! P& Y% A% m v8 h
, D/ A' Q8 M. [
* _0 u. p2 [$ J) c+ M* s* ~
) n# q2 U0 c! E8 y
# q5 k1 |- J. `4 X6 l7 k! I0 S* | R$ m$ m, {6 X3 Q* F8 }3 }
作者 : dorkas(aming) s* z# E$ [+ v2 V2 c, D" q
[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ] " @7 U2 U- P5 d% u$ ~. U: E
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
+ [3 \; Y9 K/ F( j* a# T: z2006/9/7 上午 10:30:03 ( T3 f1 d' d8 y$ l; q& ~: [/ ]
+ k9 w, d E3 B6 g
1.貼圖動作錯誤 4 ~8 V& S/ V3 m* ~: I! i
0 b# h& x; W) a$ c4 m" A0 a2. 6 u# j$ Y6 U) e2 p
每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡
@* p7 s2 x5 Y9 k0 N, V0 j( x3 e, V# a% `+ t
; n- p! b/ e0 E; n9 K) S! Astruct MyTime
7 C$ z# K7 M! e) X; x1 g) e7 s{
9 S! m+ w9 X7 e, `. r byte Texture;
7 `4 \$ O0 W+ ^0 y1 h) D1 A6 J FontGL font; + s- W" [- x2 o9 z$ [, b; s; z6 Y
void initial(void);
5 x8 o; I" R1 z7 j: Y0 x/ F void finish(void);
7 \1 q4 W( E) M) p void draw(void);
# V( N- c" N1 y3 N& B}; 6 d( g o" x* a' Y
void MyTime::initial(void)
8 |; p& p" E4 [2 ^, X, ~2 k{ % O& S. B( u0 d. I! H
// 載圖 初始字型 ' r: _6 I1 f9 A2 j, h
font.InitText(); 1 J* N: I6 s& a; w6 B+ R: t2 n
glGenTextures(1, &Texture); 3 u8 F, n3 O) J+ L! o$ b
} 2 }* N" {4 Y5 K; P) S
void MyTime::finish(void) / {/ t* f! X- a4 i Q2 v
{ 0 C( t% V( f1 Y. i, o
//釋放圖形 字型資源
8 V) m" K A) S/ {} % u- F5 j. v: h; ~- q
3 \" j( m7 Y* q9 F: n+ }6 n
void MyTime::draw(void) * J. p3 z6 o* ~3 i
{ $ D, n6 }, B. o M
// 顯示現在時間的字串
( g* d+ {: G/ `& [, v$ | L! F font.Print(......something...); 0 d2 K$ K+ C* l) a; ~# o: R" o6 x
// Buffer For Object Information
# h0 x8 q6 c5 `8 l( q( }/ w glMatrixMode(GL_MODELVIEW);
- m/ S) ]2 Q, \6 ^9 b glLoadIdentity(); 2 @; U5 G5 j' k
glTranslatef(0.0f,0.0f,-1.0f); ! N4 E: c: T& T+ r! ^4 C9 K9 w
glBindTexture(GL_TEXTURE_2D, Texture);
( D: r' c9 W2 M! U$ e( E8 C% L& c- d3 |& l5 Z/ `
..... DrawSomeThing
: ^3 n6 v* ^7 _% c' c0 C # d6 T9 k8 G( b. { n
}
- f1 [( m& j; n1 l0 x( v' h) w1 k1 q1 r
5 V! `. u' B' A0 `
MyTime time;
9 p% H! ]# x1 f/ y7 h5 T; Fvoid WINAPI wglSwapBuffersCallback(HDC hDC)
" x# g; ^. g- {6 i4 o{
$ a0 a4 _1 x# I7 c/ r: x time.draw(); ; b& j; k- {; o& S; Z7 \
wglSwapBuffersNext(hDC); * k' e$ U5 w5 A j6 b
} - y Z, w: s" {9 c8 O
( M- b4 I3 G" T7 n你只要掛進去前呼叫 time.initial(); & L$ ^' s/ p. B% v3 c0 ?9 ~
結束呼叫 time.finish(); 4 F+ ^" g6 x0 K
( K( W* S# X/ Y \5 _# H& V# W6 o5 e. k3 O5 H2 Z$ {
0 [6 Q- |& U* D9 s! T3 D- a- }
作者 : fushunwu(fushunwu)
7 _9 U* l% u" i/ U[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ] / d% H6 O7 k2 ^0 E
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
?- t5 ]7 v0 q/ w% ^2006/9/7 下午 04:19:31
# S& r* H" Q) }" \- l7 }+ g1 ~1 w$ Z; ?
謝謝. 但我還是有幾疑問想要請你幫忙,麻煩你了.謝謝 ~
+ Z# _. o5 v2 X& D6 M% h4 P/ ?
( u5 `1 L" o' v f2 B- J+ m% k(1). 因為我要固定放現在的時間字串和BMP圖在被我Hook的Game上面,所以我必須要知道那一個OpenGL的API是一定會不斷地被Game來呼叫,這樣子Game畫面才會不斷地更新. 4 H/ W! T @. W( j
時間字串也才會不斷地被更新而BMP也會不斷地貼在Game上面而不會被Game遮掉.
+ Q/ O+ n# c6 H+ n# ^3 Z1 Z像是DirectX Game中的Present API就會不斷地被呼叫,所以我只要把現在的時間字串和BMP圖放在這個API裏面就OK了. : e9 J5 x |1 }4 s5 v2 l
所以我想問的是OpenGL Game中是不是會不斷地呼叫wglSwapBuffers這個API,讓畫面不斷地更新 ? 還是有其它API是一定會不斷地被OpenGL來呼叫 ? 6 T' M7 q) `% I5 J- p) s. e( w
2 w5 q4 Y; w% e: t! P' b4 h7 T6 t/ o& R4 ^
(2). 現在OpenGL Game看起來都不是用Pure OpenGL API來製作,比如說像是用Glut
9 Y0 t2 i1 u: H 來開發,他們是只是封裝起來底層還是需要用到Pure OpenGL的API 嗎 ?
+ Z# B! k" Y4 |( g, Y 這樣我寫的Hook才可以通用其他非Pure OpenGL的Game. 6 G! j0 z$ o3 E
2 H9 |, b2 u3 Z8 Q+ b; Z
(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ? D- L5 N, C8 v0 P0 s* O
! p8 Y I4 M- W) v- n$ c6 q' \0 x+ F! ^$ U& m
- Z- M; s, a7 }! s# D p
, A# k5 Y* Y' F0 x7 |3 C, ~
' Q7 U& [! h% A5 |0 p作者 : dorkas(aming) 2 U) o8 e6 q0 V2 u9 w1 X- V
[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ] 6 o, d& L% e4 t" e$ `
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] * l6 N6 Y5 P! O2 O" T3 \' w
2006/9/7 下午 05:31:01 # {5 C8 y7 A( d( T: Z( w2 h* R9 E/ W
% P( `$ }8 T; L( o3 u' i, D
1&2 7 g e, N# z& c: U W# L
我對OpenGL不熟...
2 g( o9 ^* K" N; s
8 r: U4 H a2 L# O. U0 c0 o( ]4 n2 \4 _5 M>(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ? 4 W9 w' F4 ?( T5 G: i: V6 q
0 o' h' M1 ^5 b. ?! V+ O/ w8 i- V
& @! P* G* V3 w$ G" i( j
初始跟結束都是做一次的就好了 ( s/ d3 ]* x' u- A) z2 D
你高興要擺在迴圈裡面也是可以 / Y, z) C7 G6 y$ @) S# G
& R5 }: D7 D7 m$ `+ b7 c# ?
程式的要訣就是 起 承 轉 合 ; z$ g7 Z1 X% @; [
initial
$ b0 A! l% k; LupDate
7 r- v' C4 B7 y( vchange / }5 l7 |3 F# Q% \
finish ' m% B8 o) u! W+ o& R8 v$ J) i: n
物件也是起承轉合 6 Q8 W/ [' \! J3 _* z+ ?) {9 F
函數也是起承轉合 6 o; H- h% f. i7 V: h: X
迴圈裡面也是 起 承 轉 合
t' h0 S5 q& p; x6 n/ Z5 |9 A/ ~/ D H# H5 q& a m
起 ) ~8 V8 T0 E/ L0 y/ ~; L
for(起;承;轉) - e) m9 ?7 Y. [- a
{ % s9 X d' o! i+ s7 {/ X
起
' p1 t* K# F) ?1 d承 7 l5 z Z1 q! c% k3 I
轉
7 \$ n& Z& N4 D+ b4 N; f合
* d5 c0 M1 Y7 \- [# v} 1 v s2 ?' t2 P8 w# ^6 P
合 + S' u+ w. I5 t- v) W( W
7 b' j4 J( o- ~( k- E+ V8 L只要你分的清楚 屬於那一塊的性質就好了 / y; ?1 g8 D: a7 P, P; _; C
) S% \: f! N3 V( `
# J4 I; A$ `' }
9 ^* x# a# m: b8 z, ]9 k9 r
2 n7 a% g# P; H1 m% h; [
( B. @' c: f& J+ ?1 k作者 : fushunwu(fushunwu)
2 E% W: a/ n; ^! n# I! a5 b[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ] * d9 p- S |' Y+ [
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
, O5 W/ K; |/ a% L2006/9/8 上午 10:32:26 * n7 [) G) b4 \; N
5 L+ w/ J/ F- P, q; f8 C
恩,還是要謝謝你,目前問題還是沒有解決.Quake4和CS 顯示的狀況還是不一樣~ . J% \5 [7 Z0 v2 b8 v5 _
) F. N6 P5 s( Z1 B# }% G, T* B# |像是Quake4這個Game它就沒有使用到glBegin這個API 所以我hook不到glBegin H, v; L6 u; y
所以我就把顯示字串和BMP圖放到swapBuffers裏面去做,字串可以正常顯示但圖秀不出來 1 R7 ^( I4 i) o
我在想是不是因為座標還是矩陣的問題 ? ) `" I4 P% ]7 f/ k9 Q$ h) g: C
1 X' H4 X# e( i0 H6 {6 N( g! s) R
但是CS放在swapBuffers圖和字都顯示不出來,但是因為CS有用glBegin所以我就把同樣的code放在glBegin裏面,可以顯示字串只不過會顯示很多個,我在想是不是也是因為座標還是矩陣的問題 ? % K* o; v( A+ X8 W, M( c* L
至於BMP圖在CS片頭時可以秀,只不過會秀滿全螢幕而且是顛倒的占滿整個畫面.
y$ M% c t- U+ [* E( i/ J# _9 v
所以我才想說有沒有一個統一的方式可以讓我把同樣的code放在某個OpenGL API裏面去然後每個OpenGL game都可以正常顯示. |