在分析Scratches是我发现这个游戏使用了OpenAL32.dll和wrap_oal.dll。 # {) ]1 T' J9 L/ X" l
所以估计使用了OpenGL的API,以下资料可以作为研究的基础资料。
8 W8 w Y& x0 m& H0 c
9 m7 c A2 Q, a5 f/ j" ?& ?* c' ^, s+ H6 {' G7 d6 d
原文 6 [% R7 T3 h/ a0 M
http://www.programmer-club.com.tw/ShowSameTitleN/opengl/1654.html
: h0 W. Y6 j2 n( {9 {
+ ^9 ?% ]7 {9 ^5 V- O# u9 o大家好,
2 |4 |5 g, r) U8 n. u+ d
, |8 \1 U- B( i% W我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable - @1 Q! g! g) ~- _0 n3 P8 e
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....
) s/ G/ c& u1 g
. w R& E. g6 n' z) e1 j(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個 + E# I8 w3 E- s' H1 W; L
但是BMP圖放在wglSwapBuffers卻顯示不出來 X/ z% n% L7 Y J& a- t, q6 {% n, {
(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一
- A2 o% n" m0 Z2 `0 c: |. _' n樣的時間字串 : e" m0 N! T! U
' j8 B+ q0 F2 _" X0 S v! W
+ D: F7 a1 s, a8 x5 p. _4 u
. x6 c7 u# O3 [* s# M' G; ~- o9 X2 {) j作者 : fushunwu(fushunwu)
" d' r$ ]* Z0 L" F& l) ^- a[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
" z1 B- F1 f7 L( @: z+ h[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] 9 U0 o& o1 R) ]: e- h d: y8 L0 a
2006/9/5 下午 03:21:34
3 K3 R8 o2 f9 ]3 n3 Q$ `% ?$ t
& E( Y3 E1 g; r {sorry,按太快還沒打完 .. 7 }! [& y+ I% u& G# ^! y8 m
! ^7 S, W9 G& @我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
2 a/ L% p) o5 V9 b3 s,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....( 我使用MadCodeHook的API)
0 n; R; s( p W. l3 E. s- v1 a2 @% Q% u
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個. 但是BMP圖放在wglSwapBuffers卻顯示不出來
8 A/ b, b7 y) S) ^& x(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一樣的時間字串 ; BMP圖放在glBegin中中在cs片頭中還可以顯示,但是圖會顛倒而且會占滿全部的畫面,進入game中再開圖就掛了. : O: [9 a. k6 t; o
: V) X- i0 ]* s9 U: o想請問各位高手,有沒有一些好方法可以解決 . S3 h5 i) H8 \& `3 P
F6 c: a* F! @" K8 Q
下面是我hook opengl API的code :
5 ?' e# U+ a: n, w/ ~$ ~" x// hook wglSwapBuffers的code; hook glBegin的code也一樣 9 _7 q& t4 H* l
void WINAPI wglSwapBuffersCallback(HDC hDC)
& ~. @. j, M! G8 {) P' Z h& z( l{ & n" B+ K! D' ^7 Y
" g3 E" M4 j) mif(!ininstializedfontshit)
5 q. a# J: w, }! Y- N7 N. M{ $ l P& E4 [0 N5 e$ v' N' P( X
font.InitText(); $ F8 T* n; J' b* Q3 x
ininstializedfontshit=true; / X+ u& a- t% O7 y* b' k
}
2 e4 _, d& r/ f* ]4 j# D% i* F& s. N$ G( s8 w7 K7 ?1 r
SYSTEMTIME SysTime; $ T1 G% {" Z1 M* |% E. l
GetLocalTime(&SysTime); 9 d4 R3 i# V: F% u
glPushAttrib(GL_CURRENT_BIT);
% |/ U7 S0 r2 q0 L: ]1 s// 顯示現在時間的字串
" p5 g1 @4 e1 n& K) w5 [font.Print(140,125,255,0,0,0,"Time: :%:%",SysTime.wHour,SysTime.wMinute,SysTime.wSecond);
4 w8 s- L6 E5 i3 N/ J p4 \9 @
' P2 W9 P+ P3 y1 Z* L: f0 |3 V// 顯示BMP
- f5 ?( E, ?- c( z3 i% q6 w& F" J+ R# P; I
byte Texture[]={IDB_BITMAP1};
2 I' \: V) U& K1 j$ v: {) T! _glGenTextures(1, &texture[0]);
1 j) B! c) q3 U: XhBMP=(HBITMAP)LoadImage(gl_hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0 , LR_CREATEDIBSECTION); 8 z7 Y! N% b7 M0 G( R( Z3 _- u( T
& J s* q4 Z2 r' \" e4 }3 Zif (hBMP) // Does The Bitmap Exist?
8 w+ v- ~! G( o# X- Y{ // If So... 9 Y% B0 N1 F# q
GetObject(hBMP,sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object
' H5 d. e6 W- ^# M& |// sizeof(BMP): Size Of Buffer For Object Information 6 F# ]9 }1 c: u+ H7 V% v1 G Q
// Buffer For Object Information
- |) {$ W5 @: s- ]7 KglMatrixMode(GL_MODELVIEW); 8 I o( \, [# U% ~
glLoadIdentity();
! h, `" e: f4 uglTranslatef(0.0f,0.0f,-1.0f); , n" d2 d- i2 t8 T$ N- n C" V
glPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]);
# C5 |+ y( _; o3 }: k% y// Bind Our Texture
) X$ Q. S7 G3 w9 b. ^# u& SglTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST ); // Linear Filtering
1 D; I( X% J+ |. f+ ?) X1 Y+ dglTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Mipmap Linear Filtering # w( o0 Q; ?: S
& @2 J; d; T% I/ N( egluBuild2DMipmaps(GL_TEXTURE_2D, 4, BMP.bmWidth, BMP.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, BMP.bmBits);
# [. P# v; Q# m+ L9 c# I$ tDeleteObject(hBMP); // Delete The Bitmap Object
7 e& e2 \: ~! U# Y5 B# }. D} + u" T$ J' }! K# W; q
glPopAttrib(); ( }7 P. F. {+ Z
7 P4 ]9 b: V3 q4 r5 F. N9 a
, F4 e. ?/ j* z: T0 v} 2 R& ^! W. h& P+ [0 y; x0 }. h
wglSwapBuffersNext(hDC);
% k& L# J2 f# `. K5 A0 U' u} 5 n8 \; ?; A* K$ L U6 O$ i+ c
$ }% J6 d7 i, Y) d5 V& P7 a
% ^. r& I4 H( W( t/ b$ z3 w( c& K" c+ E0 B+ n9 j5 T
( g5 }" |9 F* W, C6 |- u( ?6 T G$ w" o- N# M4 J
9 A4 `& t U% O4 ^- s% z作者 : dorkas(aming) $ ?8 N0 h# ]8 U+ d
[ 貼文 2619 | 人氣 4536 | 評價 11790 | 送出評價 2 次 ] - t P F* W2 m4 [# E$ o* W7 e
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] c4 v( l+ s, A* y6 a
2006/9/7 上午 10:30:03
* u2 q' |7 d) B& ^) k, k' S- g) [6 i( E% v2 F8 u8 {
1.貼圖動作錯誤 ' \# V. S" N4 d' N3 N0 J% |
* L( b; ]$ U! q8 v% l
2. ; K7 D' V) S& |4 l
每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡 0 y1 m' ]" C& U# y' N
2 c3 T2 a* v" c% D. C
' q# | g1 t- T7 Y0 B( _$ \3 h
struct MyTime
+ z0 b$ C5 S# q+ J9 J! P{ # q: z6 {% A @& p' @+ e
byte Texture; 3 }; Y: ?( c4 P, M& W' W' D
FontGL font; / R* y& _. b6 |/ I
void initial(void); 6 h) R! A3 V, d
void finish(void);
; ~ P. w% c% @% qvoid draw(void); # `5 _/ O8 ~4 G
};
0 |2 b; h/ @4 ^6 W q1 h4 k3 E& zvoid MyTime::initial(void)
6 h9 D+ O8 Y0 L! F7 K* `{ 1 c( B8 a6 |$ f' V2 y# j# {
// 載圖 初始字型 6 t6 l* f' M( k' @! T3 ]
font.InitText();
" \4 v3 M0 a+ GglGenTextures(1, &Texture);
* ?* e) @7 ^; s0 Z" V}
, G# l! Q" b( S# x' ^8 Mvoid MyTime::finish(void) ) N" g( Q& ^! Z# J
{ 3 {' z% g* A- |% c# Y: M2 U3 o
//釋放圖形 字型資源
% ~$ }2 O" E8 J: J$ _, d1 p}
- Z3 w5 l' I- W6 z# J9 s d% C4 Z$ V {$ u G1 B) i
void MyTime::draw(void)
" K7 }& q8 A$ k8 J{
9 o6 x) r5 U7 \/ u. ~1 G/ v9 k7 P// 顯示現在時間的字串
2 t" d: B9 l, z! x3 b. ffont.Print(......something...);
' t4 V- c: w& _' A4 J/ X// Buffer For Object Information " G8 L- ^* C6 A* h
glMatrixMode(GL_MODELVIEW); 6 c8 e9 o2 i3 U" C; G) a. r
glLoadIdentity();
2 L" o Q1 J; S/ hglTranslatef(0.0f,0.0f,-1.0f); 6 ]: A; k T) Q: |; Z: N: w
glBindTexture(GL_TEXTURE_2D, Texture); + g- C. T7 D) F6 i* Z: {
% c- H B1 G8 I+ r& z) Y
..... DrawSomeThing ) l2 K5 B V' D
2 P7 Y% q% e; R/ W5 x! v0 N
} # `) j2 d4 z. x! v i7 y
2 |6 U: h: L" s8 a/ d
4 S: T* O. m6 l* ~ C* Y" XMyTime time; # Z" B0 k) H1 d" X$ P/ H
void WINAPI wglSwapBuffersCallback(HDC hDC)
+ X/ a. d; z, h+ {$ h2 V4 ^{ 7 P) Y% u n5 M& ]
time.draw(); ' Y- W; K6 Y0 d3 @: q% n+ M! ~
wglSwapBuffersNext(hDC);
- w) W1 T2 i1 A g4 ^} , _% A7 w& H0 o/ _. Z! W! M, ]
: S& U2 ~2 C) l. j1 \# Z+ O' o
你只要掛進去前呼叫 time.initial();
6 w- ?# t" ]5 G& X, x9 z a結束呼叫 time.finish(); * Q- s( ] f4 ^) Z" U! p I ]% B
! V5 u4 z$ X/ ?* z5 S. N1 a) L% e E0 N" N
0 E( g" y$ w6 u; c# V6 u0 U* ^- \( t; ^: I0 M* A# B. g5 c* }# B
作者 : fushunwu(fushunwu) ' I/ q6 N+ I8 M" I7 D9 r" u: e
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
/ \+ o# O$ ^( Y0 q/ A2 i* e[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
& m. d! Q- G3 J4 U$ ^, R/ h2006/9/7 下午 04:19:31 " Z* ^- t: ?8 n: f
/ ~1 b! s& v7 {2 x8 a2 z0 Q) G' b* H
謝謝. 但我還是有幾疑問想要請你幫忙,麻煩你了.謝謝 ~
9 [' p: M- L% y/ Y7 ^/ N5 s0 D4 Y
O4 ?' {# i$ I3 [3 @" a5 l(1). 因為我要固定放現在的時間字串和BMP圖在被我Hook的Game上面,所以我必須要知道那一個OpenGL的API是一定會不斷地被Game來呼叫,這樣子Game畫面才會不斷地更新. 4 ^, [( R4 }; A' Y7 d
時間字串也才會不斷地被更新而BMP也會不斷地貼在Game上面而不會被Game遮掉. - w; m5 J; C' I* C
像是DirectX Game中的Present API就會不斷地被呼叫,所以我只要把現在的時間字串和BMP圖放在這個API裏面就OK了. 0 P! J% V/ @. i0 r% J3 p: P- {
所以我想問的是OpenGL Game中是不是會不斷地呼叫wglSwapBuffers這個API,讓畫面不斷地更新 ? 還是有其它API是一定會不斷地被OpenGL來呼叫 ? W# U& f, Q% l( u R
- j4 I: X/ l( B2 |- N8 y5 |
" l0 d" a9 A2 f(2). 現在OpenGL Game看起來都不是用Pure OpenGL API來製作,比如說像是用Glut ' l* x% {6 m* t% l: E1 O
來開發,他們是只是封裝起來底層還是需要用到Pure OpenGL的API 嗎 ?
: r: E4 V+ ?/ _& T這樣我寫的Hook才可以通用其他非Pure OpenGL的Game.
4 o/ @" o7 R, p @
3 I% n" a7 b$ ]9 u$ _* k(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
1 n& \0 R8 t8 z. Z
7 U: n5 h) K, ]/ C% x. V7 I4 o3 I5 ]1 o; M$ h! j/ M) e
2 c3 u ?3 `' F
" r4 Y8 E {# C% Q
) h& C2 T# c' Y6 L' l作者 : dorkas(aming) 6 l/ i$ T5 a& \: g0 j
[ 貼文 2619 | 人氣 4536 | 評價 11790 | 送出評價 2 次 ]
+ f5 I/ C3 _& C+ y1 C8 S- @[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] / B: C5 e; u2 t( Z, \# O- `4 m9 I
2006/9/7 下午 05:31:01
4 U4 {# g. K9 o+ r. P" }5 H$ Y4 j* |) V' r! s$ @: z
1&2
. L* L& m6 ]% k# ^& x4 W0 M3 v我對OpenGL不熟... & G2 O4 s/ n: U" i) s, \# Q7 @
1 {2 K4 u7 d0 L) W: X7 }>(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
3 n0 ?9 @4 R! Y) ~, U/ O
2 j7 |9 _5 C9 w4 i
- N: f/ J: M O4 `0 B& [; Z5 y! J初始跟結束都是做一次的就好了
& Z# B6 K3 m5 i9 B. s9 w& n. R& @你高興要擺在迴圈裡面也是可以 3 _- ]6 I* g" W8 p3 S- W
+ \" n# C( C2 j# [程式的要訣就是 起 承 轉 合 7 Y( `/ M% V# r; m+ q
initial
% v7 f _, b6 L# U/ a' _upDate
8 `: \; \/ u# T$ H0 f6 Q; g0 P) t1 T4 o# bchange
9 ^# C* D% z0 y+ E+ ~finish
# w# h. b+ [9 O- k E- ]0 D2 H物件也是起承轉合
/ y/ m! Z8 E3 s% ?0 o- A函數也是起承轉合
: E9 [' @. J# [! ?% M- v迴圈裡面也是 起 承 轉 合 4 q: R( @! [1 g( O
! N3 @+ g# Z; X9 `9 `! i
起 " p8 n! {2 [& H: B9 D4 ~, e3 i
for(起;承;轉) 5 d# q+ C+ F" X, A& D' q, [
{
/ }0 ]8 ^/ F+ s& W- N& Y起
0 P. h0 c4 g5 A, |4 a9 \承
2 E' l9 @+ d, l0 G' y轉 , \: D( S5 s( w8 u4 q, d9 V* s
合 , y- G3 J' I( \* T7 I r
} . y3 f o n1 n# `
合
) r5 V5 u' @0 K1 K" G! i7 ^! `
! v. H! k+ z6 a; C$ F0 |只要你分的清楚 屬於那一塊的性質就好了 4 a8 d% `' O6 ^. G8 b: j
( Z1 o- V& v; Z0 x. e
; _4 u, k2 ^/ p4 k; I
2 { S9 k" z( e9 o4 c, F! y
! C0 q4 |/ J$ \7 l7 T# u
0 D& Y6 z* t7 c% ?8 L4 f
作者 : fushunwu(fushunwu)
; O, N3 O1 Q* H# u- K6 q[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
% h6 g1 Z: S5 a, U' u[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] 9 E8 A5 i% [, E% Z) G: B
2006/9/8 上午 10:32:26
% G2 i% j6 K! B/ x8 W2 x5 [% ^$ F: \" E1 p Q) G
恩,還是要謝謝你,目前問題還是沒有解決.Quake4和CS 顯示的狀況還是不一樣~
; }) `( q/ |: Q3 O1 g9 y+ c: T) ~: c) e% S% F
像是Quake4這個Game它就沒有使用到glBegin這個API 所以我hook不到glBegin $ S- B1 e: c$ A, G: P R% a& s" ]# o
所以我就把顯示字串和BMP圖放到swapBuffers裏面去做,字串可以正常顯示但圖秀不出來 . {% e: z$ J3 }0 j4 ?7 x
我在想是不是因為座標還是矩陣的問題 ? 8 k* e0 U- @! \ R3 }
7 @* \7 Z4 ]0 ?
但是CS放在swapBuffers圖和字都顯示不出來,但是因為CS有用glBegin所以我就把同樣的code放在glBegin裏面,可以顯示字串只不過會顯示很多個,我在想是不是也是因為座標還是矩陣的問題 ?
( E/ |9 ^1 e7 @% b至於BMP圖在CS片頭時可以秀,只不過會秀滿全螢幕而且是顛倒的占滿整個畫面. - \; U V$ ^# p$ l
9 Q ?4 f7 _1 D2 y7 h( W所以我才想說有沒有一個統一的方式可以讓我把同樣的code放在某個OpenGL API裏面去然後每個OpenGL game都可以正常顯示. |