冒险解谜游戏中文网 ChinaAVG
标题:
【汉化资料】Hook OpenGL的問題
[打印本页]
作者:
shane007
时间:
2009-6-6 15:44
标题:
【汉化资料】Hook OpenGL的問題
在分析Scratches是我发现这个游戏使用了OpenAL32.dll和wrap_oal.dll。
! f8 C* M% y7 ?% @, V
所以估计使用了OpenGL的API,以下资料可以作为研究的基础资料。
# w# I$ v* e! \. s8 B9 s% @
+ d c* i v2 I2 b6 i- v5 Z6 ^0 _
) i" Z& ~6 ^0 S7 p$ R5 w
原文
* D& I# C6 J5 c, ^0 z q0 ^/ H! v
http://www.programmer-club.com.tw/ShowSameTitleN/opengl/1654.html
' A8 C2 O# S, \2 `
# ^/ C9 v: J- h- o& ~* Q! y" d
大家好,
3 j" b: p4 x4 g7 P8 r1 [
8 e9 k/ w( y, ~/ d; ~7 i
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
3 ?0 b) T- ^1 ?+ @8 N7 B! v' w
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....
( N5 Q) I9 J7 i; R _% {" q. ~* c- ^. ?
' ~) F. O4 ~0 q5 R$ H4 g
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個
" d! [" C2 o6 Y& u c
但是BMP圖放在wglSwapBuffers卻顯示不出來
/ F& H. N! C8 x% n4 k7 M
(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一
3 f9 f6 R U2 @( J
樣的時間字串
; @0 ]: T" m0 m. n) [5 O
! P. t% F& h8 a( f+ [! e$ [
5 ]) W. b6 K# U0 U8 Q- Y
+ `3 j' [$ G' k8 |) k- j T# X
作者 : fushunwu(fushunwu)
3 s% p8 ^4 z0 Z( L
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
' S3 a6 [1 P* a
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
, s- _* T- b' u8 O) t
2006/9/5 下午 03:21:34
7 T+ |! _3 a9 T1 N! T( T
7 Q0 Z. K4 D: B' A# \) I
sorry,按太快還沒打完 ..
/ N" R. Z7 D0 F) x& f+ {& q% l
- }! I- H, H% v+ b- T
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
8 f+ k* t! K9 j
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....( 我使用MadCodeHook的API)
H& @& N- T. j- b, @6 `8 |
k0 n. A ]* R$ p7 }5 ?( J
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個. 但是BMP圖放在wglSwapBuffers卻顯示不出來
G# r7 f* W! ^- u
(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一樣的時間字串 ; BMP圖放在glBegin中中在cs片頭中還可以顯示,但是圖會顛倒而且會占滿全部的畫面,進入game中再開圖就掛了.
0 ]6 U+ d) y3 A
+ C9 C+ Y* _# x# i9 p$ N1 j0 a
想請問各位高手,有沒有一些好方法可以解決 .
7 n! W% g8 y, y- i% c/ q
9 R' ]9 D( W0 G5 w
下面是我hook opengl API的code :
' Z/ n. \1 p& v+ z" g$ ]( a
// hook wglSwapBuffers的code; hook glBegin的code也一樣
. B- t: D* F6 V* F7 S
void WINAPI wglSwapBuffersCallback(HDC hDC)
! [* ?' L& n- X1 f9 Q$ O3 K
{
7 p Y5 r& F" p9 s" _3 ~. W
& q% }" H/ k$ R3 E5 h8 u+ C
if(!ininstializedfontshit)
I) E* w W8 h5 s& W
{
; u$ }( a* b$ f' g2 ?6 t
font.InitText();
. @' a: A: N% w: H9 o: z
ininstializedfontshit=true;
; }+ C' q% s% y) Q7 f5 r
}
: R N5 [/ e$ q3 e# A& O
- e- m Y8 U2 m7 |3 a
SYSTEMTIME SysTime;
7 u8 D' L' q2 G1 w. G
GetLocalTime(&SysTime);
: Q' ^, b* Y/ j9 o2 o
glPushAttrib(GL_CURRENT_BIT);
- y7 a) g. c! L% c! \
// 顯示現在時間的字串
, V& H$ _( k" C
font.Print(140,125,255,0,0,0,"Time: :%:%",SysTime.wHour,SysTime.wMinute,SysTime.wSecond);
. R; e! F& x! e% P) O7 ^
2 V0 o7 A o8 m0 {8 f& N
// 顯示BMP
+ l) f+ V. P' l7 g+ K
, l- @: }' f: }9 @" v W
byte Texture[]={IDB_BITMAP1};
! J2 w6 r+ I& e8 H ]& ^% a
glGenTextures(1, &texture[0]);
4 K# e/ T$ p$ e: s) m8 M& A
hBMP=(HBITMAP)LoadImage(gl_hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0 , LR_CREATEDIBSECTION);
9 `9 B# D* e5 f) P
# q9 A/ H# j& q, D0 b n8 n
if (hBMP) // Does The Bitmap Exist?
+ g5 M7 m! G# f- e7 y7 ]
{ // If So...
! ?* V" f I7 ]5 T, |
GetObject(hBMP,sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object
- x; f4 y9 d7 V Y0 }
// sizeof(BMP): Size Of Buffer For Object Information
' x; I( O5 _2 F; K2 v9 G
// Buffer For Object Information
' ^, o/ M0 V2 k! w7 w- f
glMatrixMode(GL_MODELVIEW);
9 @# a$ t" f/ R
glLoadIdentity();
6 E! e' T6 U- U$ r) L: H V0 a. c
glTranslatef(0.0f,0.0f,-1.0f);
2 W. @7 W: P9 O1 {3 ^2 Q: ]! h
glPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]);
; q7 j, V; y* Q7 O0 R$ _' l
// Bind Our Texture
; R- Z- s- \4 H2 w) w* [
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST ); // Linear Filtering
9 l8 P1 T" x* F
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Mipmap Linear Filtering
' `0 t6 K, E% V1 |4 H
# e4 Y2 K6 b6 j
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, BMP.bmWidth, BMP.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, BMP.bmBits);
) ?% `1 z3 ?$ b1 ^
DeleteObject(hBMP); // Delete The Bitmap Object
; H, _9 j4 \# O* z6 l; y
}
+ ?" B9 n9 A/ G. g
glPopAttrib();
, `! R& ~3 t) J8 d* f) h
* u1 Y$ f5 X' h& U/ T
4 S3 q* J$ S9 m' U' c6 i" f
}
3 J( _; R8 }( b
wglSwapBuffersNext(hDC);
4 R! n" ?( W- }1 `% i- N* w
}
' u. I, g- [6 P
' S3 y+ S& p' p, ~& I4 }# |" ?. l
# C) s, Q, y. ^) @ z
2 ~1 B; E0 t* ^, A& g
2 s! K" [1 a9 ~9 C1 Z
' p/ I3 H* Z Y# m! f+ `7 {
, |' k3 s8 p- ?; {3 ~
作者 : dorkas(aming)
5 l! y- k( y6 w* |' L
[ 貼文 2619 | 人氣 4536 | 評價 11790 | 送出評價 2 次 ]
}* |1 X8 {6 H Z( i; E
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
u' `& @1 d5 n
2006/9/7 上午 10:30:03
) U( ^7 c' ~0 R2 ?3 A7 l% w+ E
9 \5 f; `( s3 t& }; n$ D8 l
1.貼圖動作錯誤
& q7 z; |: g; j. S% S& _. b$ N
3 X' d- l' M; s
2.
Q3 v% ?/ r* p; X u! ^; P
每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡
$ T ~9 S% Q! q2 V
+ P" d+ k) G/ d2 f0 F0 |' c; C5 k
) ^7 ^8 @. y- k: V9 s$ c
struct MyTime
/ R: E6 n, q1 L- T i3 H5 D4 t* o
{
+ E& u: y( j% Z0 u, q
byte Texture;
) V+ O. ?5 {/ U/ H; _, x* O
FontGL font;
! u2 |' d! V! D8 `% t
void initial(void);
$ n* V9 t% _( ~5 H2 W L
void finish(void);
* c- v% Q2 W, w. I# V4 l
void draw(void);
3 ?9 m* I" N9 F
};
8 h+ b ~+ C+ P( v9 W; Z; G
void MyTime::initial(void)
2 j) z# R8 m a
{
) X9 _& u9 I; f
// 載圖 初始字型
Z6 b+ G" r, D1 H0 B5 F3 A" u
font.InitText();
( l8 Z) q! H" ?! k& w
glGenTextures(1, &Texture);
; L& B+ R4 G! v* H% p, P
}
4 E4 n- y3 A0 l; _
void MyTime::finish(void)
. N. I) I7 v$ v
{
8 H. Q6 b! F! }8 g
//釋放圖形 字型資源
4 }. K- s( k; {) D- ^1 T: ?9 j
}
. c3 L8 w; ]. q8 y, t: X O
; ]5 F; q p- j! n/ ^! w( C6 h
void MyTime::draw(void)
! @$ n! ^& G% }: ^
{
7 R! V& a# [; c% E6 P
// 顯示現在時間的字串
( ` C- W' Q* ?% }
font.Print(......something...);
, m6 `# b3 D3 \! U2 l8 s
// Buffer For Object Information
' r/ ?7 f" V, x
glMatrixMode(GL_MODELVIEW);
1 U4 d+ E( T4 o4 M
glLoadIdentity();
6 o8 z& r. E) {7 f: i" Z& \% y
glTranslatef(0.0f,0.0f,-1.0f);
3 f8 h; O. i% R/ K0 O7 V5 N; l
glBindTexture(GL_TEXTURE_2D, Texture);
3 y+ \2 d# n% C. z9 p% X* B
/ @& K7 {$ h, F3 h9 c
..... DrawSomeThing
0 B: N( k6 A+ i; j% y. D- p6 X
9 [+ X9 T( I! z
}
% H7 G9 |3 j- y, i. Z1 V
( K1 u3 _5 ]; G7 G+ M/ E
. G7 c3 L( f+ w9 `+ D8 Y
MyTime time;
: a' u/ O" ]( T$ a4 A3 ~2 ^
void WINAPI wglSwapBuffersCallback(HDC hDC)
% S% G2 k7 m% U/ E. K! D% q4 U
{
8 q9 y+ ?9 {/ D( _
time.draw();
_# p. r& D1 B
wglSwapBuffersNext(hDC);
0 m0 ]$ Z; s7 u$ u% b
}
0 t. X. Y! x' \7 L3 b
: Q1 r7 @+ g: M% k0 D& S4 n8 e
你只要掛進去前呼叫 time.initial();
5 R# {* ] ~9 @9 R
結束呼叫 time.finish();
( ?7 h' p4 G4 R) X
1 J: h6 ^; g- f" t* [7 W9 F
" ` C, |8 [' G1 k8 m# |
9 \9 e" A8 |2 S* A/ }3 S% I
3 K$ N. h4 |$ p2 f; H
作者 : fushunwu(fushunwu)
: \4 b1 L1 B8 m' l+ L
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
, l! A" N1 H! L) S9 D) s0 O
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
) V% z, X* b0 Q5 M) j) W
2006/9/7 下午 04:19:31
$ Q6 O+ H$ F7 o* D
* [7 L H' v/ n% g
謝謝. 但我還是有幾疑問想要請你幫忙,麻煩你了.謝謝 ~
$ r4 [/ h9 P0 }. _
" j$ a8 K1 ~) K1 {6 A+ g+ y
(1). 因為我要固定放現在的時間字串和BMP圖在被我Hook的Game上面,所以我必須要知道那一個OpenGL的API是一定會不斷地被Game來呼叫,這樣子Game畫面才會不斷地更新.
% x+ R. S4 Q; j
時間字串也才會不斷地被更新而BMP也會不斷地貼在Game上面而不會被Game遮掉.
- p5 ?% @: m# r, D" {
像是DirectX Game中的Present API就會不斷地被呼叫,所以我只要把現在的時間字串和BMP圖放在這個API裏面就OK了.
* Z/ s' _: R! e9 E! t4 X
所以我想問的是OpenGL Game中是不是會不斷地呼叫wglSwapBuffers這個API,讓畫面不斷地更新 ? 還是有其它API是一定會不斷地被OpenGL來呼叫 ?
) |+ k# Z# M' ?1 A
9 y4 F; w/ Q; U. p! o& w, G
2 J9 {7 X3 U- {5 {
(2). 現在OpenGL Game看起來都不是用Pure OpenGL API來製作,比如說像是用Glut
' N. I% k- \/ l; |$ A
來開發,他們是只是封裝起來底層還是需要用到Pure OpenGL的API 嗎 ?
+ g; j# f p5 j0 ?2 p
這樣我寫的Hook才可以通用其他非Pure OpenGL的Game.
, C. V+ J$ s8 C5 n3 k! d
+ u8 ]3 d4 j2 g5 W+ k
(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
* `+ A+ j. [, l9 u0 P
5 U3 i( R; l3 d0 d1 S( j5 g7 G
/ I+ i5 f! i9 l. V1 j" j. Z- u3 o8 _
9 f9 J3 \" v, M% u) s$ q; \
8 Z* w/ y- N" `! H$ j8 O% I
( W" q/ j' T& m. K7 s- W9 l
作者 : dorkas(aming)
/ D) {2 o, n j; I6 ^' [0 _
[ 貼文 2619 | 人氣 4536 | 評價 11790 | 送出評價 2 次 ]
$ q: K! b/ \) y# J( p( w7 w9 [
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
$ o* \: b' g0 Q6 G V" a4 r# o
2006/9/7 下午 05:31:01
4 Z6 R' J! r; M2 Q8 i; T5 X
5 g/ a$ ~+ K/ Y
1&2
$ e, y- w2 P# m/ x
我對OpenGL不熟...
! W& R# ]# K h4 \9 C4 O6 W
b! G( }, c6 G3 L0 e# q: B9 B, |, {. _
>(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
" F( W1 G: E3 ?9 S- F$ V; _
8 z6 \# I% t6 f9 m
2 p* {0 G$ |! [# x: u
初始跟結束都是做一次的就好了
2 X7 }8 n" x8 f, k: o5 G6 ]6 t
你高興要擺在迴圈裡面也是可以
( {5 E/ N+ b2 _6 p: \; P9 b( ~
; H' h8 I9 ~0 z- k1 k* H( X
程式的要訣就是 起 承 轉 合
6 |! L% t" }: X; ?9 }
initial
v+ z$ @& Z ]# x
upDate
5 U5 F/ z- `) [6 X) j$ f3 p
change
/ ~' k0 M$ z0 q+ F8 G. f8 ~
finish
" L* {7 F' U9 K) e+ Q8 p5 A% V& p
物件也是起承轉合
4 ?5 K) S1 V; I' l q2 n
函數也是起承轉合
, a* P! w1 w* ?4 D) n# J# n
迴圈裡面也是 起 承 轉 合
& N. P) C. o Q+ j/ X' S
3 }8 X9 i! p& W2 ]
起
8 L$ y$ z( ]! H, _/ f2 h$ Z
for(起;承;轉)
- C* P2 L" G3 v) j! |2 ?4 v
{
5 T) e! b# P2 {1 ?% k6 e9 y
起
7 k0 |! h3 w9 g# ]- C" q# o
承
- K7 r+ p- R$ v$ \
轉
0 k7 l: T8 H0 {; v- [
合
& E0 [: Q8 Y* @9 P- m
}
* A% O$ U/ e3 U; F& a# p
合
" h8 C4 Y* J! _$ I
% O7 H z8 H) o
只要你分的清楚 屬於那一塊的性質就好了
. q; Y. h! W: R) m/ V( u J
0 W, f1 t' Z [' S [
+ e4 m4 m" m0 [6 F) f
( l: Z4 @. Z5 m; Y0 K
$ M3 e$ L" B: l- u) m
9 Z! Y0 K* S$ Q4 J9 }& y
作者 : fushunwu(fushunwu)
7 {, }) M' N( S: r4 {
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
3 C* @% [! Y7 |% _5 L8 [+ I3 @- ]
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
! }* v( Y) w \0 ?
2006/9/8 上午 10:32:26
4 R" N1 b, Z$ Q1 u) A d0 m6 W
# S! w7 C' Y; W9 z: L. T+ p
恩,還是要謝謝你,目前問題還是沒有解決.Quake4和CS 顯示的狀況還是不一樣~
& M h7 `. V4 p, e/ U4 @/ [
! o! T( V+ A2 O# T
像是Quake4這個Game它就沒有使用到glBegin這個API 所以我hook不到glBegin
+ Z& [) J) o. l4 g. @
所以我就把顯示字串和BMP圖放到swapBuffers裏面去做,字串可以正常顯示但圖秀不出來
" H$ ~' |6 e6 Z, s+ n- |
我在想是不是因為座標還是矩陣的問題 ?
% h# l/ z: q1 o7 E& u
- v* d' \& {' l# }4 ?
但是CS放在swapBuffers圖和字都顯示不出來,但是因為CS有用glBegin所以我就把同樣的code放在glBegin裏面,可以顯示字串只不過會顯示很多個,我在想是不是也是因為座標還是矩陣的問題 ?
% A, `8 T! W; `" K! ]! t
至於BMP圖在CS片頭時可以秀,只不過會秀滿全螢幕而且是顛倒的占滿整個畫面.
. g8 n& s8 O& L U- l. n
5 g6 R: p1 Z5 B( r7 ]5 t; n7 V
所以我才想說有沒有一個統一的方式可以讓我把同樣的code放在某個OpenGL API裏面去然後每個OpenGL game都可以正常顯示.
欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/)
Powered by Discuz! X3.2