设为首页收藏本站官方微博

【汉化资料】Hook OpenGL的問題

[复制链接]
查看: 1659|回复: 0
打印 上一主题 下一主题

【汉化资料】Hook OpenGL的問題

跳转到指定楼层
楼主
发表于 2009-6-6 15:44 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

【汉化资料】Hook OpenGL的問題

在分析Scratches是我发现这个游戏使用了OpenAL32.dll和wrap_oal.dll。 . i' A/ [) x' s, M; q
所以估计使用了OpenGL的API,以下资料可以作为研究的基础资料。
1 D0 x! n  B# Y
% q" k% _$ {" S+ L

3 x& h' J- c' O8 p$ B# }原文 - {7 P& B5 F8 P  E4 H' x
http://www.programmer-club.com.tw/ShowSameTitleN/opengl/1654.html
4 R/ Y) H8 L1 j; L+ H" X5 {
, |9 t# ~. O) U' o/ O大家好,
; S4 }0 @$ }( `8 E' r5 k6 a. ]* F  u$ g8 ~- L& T
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
+ q- N! }' Q: u$ [/ m1 ^9 |,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣.... % P5 ]1 E5 `0 k8 ]$ p/ k
3 @( x$ y" B- a: A
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個 / z0 Q8 R+ n$ W- o
但是BMP圖放在wglSwapBuffers卻顯示不出來 9 u# \( {4 }" C
(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一
6 H% ^7 E8 v% E樣的時間字串
: O2 f! [9 U$ U' z
/ f% \# L4 ~1 H. x! X: t7 a& _  f7 C
) d* s9 o/ C+ m0 H0 F# n: F( w) a
作者 : fushunwu(fushunwu) ) k1 v  Z- x  g* A8 y! `
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
5 w. j; C# W0 L1 N( j[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
% T4 E7 h. @3 }$ Z- r  ?! I2006/9/5 下午 03:21:34
7 `' t8 O- T5 p6 z; F4 {2 e7 t6 ^9 {# _0 H- H' p  q
sorry,按太快還沒打完 ..
" z% Y0 `, F: ~& V
: x9 v6 G. ]5 q" q3 Y我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable / y; G2 c1 l; S1 q$ T
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....( 我使用MadCodeHook的API)
4 i4 f8 K0 J# S. e- k7 b$ n" `, c, q& T4 C  ^! c6 G9 `
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個. 但是BMP圖放在wglSwapBuffers卻顯示不出來 , X2 j" ^' ?2 W$ O  G; Z8 k; U" p
(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一樣的時間字串 ; BMP圖放在glBegin中中在cs片頭中還可以顯示,但是圖會顛倒而且會占滿全部的畫面,進入game中再開圖就掛了.
1 ^( y) g8 [4 ~+ k8 G# h( [
" l8 m9 x! b% Q' q想請問各位高手,有沒有一些好方法可以解決 . 2 x$ V( G2 b( K' F  c. i
9 U3 n3 p- m% I5 U# B' D1 }/ u8 x7 l
下面是我hook opengl API的code :
* Z+ s% n4 y7 p+ Y  ~3 s1 `  W) D// hook wglSwapBuffers的code; hook glBegin的code也一樣
+ z$ |: b/ N4 `* ^8 X; x& u" tvoid WINAPI wglSwapBuffersCallback(HDC hDC)
6 k1 [. g& q+ z7 h+ L& E{
  G* e$ K2 N! `! j: [
" y9 r9 n" o% h6 a$ V+ \if(!ininstializedfontshit) 7 e' w4 c8 p. j! g3 t. n, v& [
{
& r( n, Z2 q5 G7 j6 y/ gfont.InitText();   O' _. [8 J. U7 q# e  c; `
ininstializedfontshit=true;
7 H0 F/ R3 X; b% C6 a) x# o8 y}
$ L5 H, o& J# o5 @1 q
+ _$ h4 q+ s( S, L: y" tSYSTEMTIME SysTime; 8 b+ D3 ^" Y% M( |
GetLocalTime(&SysTime);
1 x- G2 T. ~, E. EglPushAttrib(GL_CURRENT_BIT);
2 y( D8 e6 d5 Q# A. }: g  [0 I// 顯示現在時間的字串
' O2 _0 o% ]  K* w& V% ?' _font.Print(140,125,255,0,0,0,"Time: :%:%",SysTime.wHour,SysTime.wMinute,SysTime.wSecond); * M( n# b. G  Q6 U2 u' I# \

/ e; `; g+ U/ i2 p5 ~0 B- ]// 顯示BMP : ]1 K( D$ }( L; Z
( _+ `1 D( {1 h+ Y; b, w
byte Texture[]={IDB_BITMAP1}; 8 p8 w. a6 w4 Q4 s8 D' w
glGenTextures(1, &texture[0]);
+ C. c4 f! P8 U, o! vhBMP=(HBITMAP)LoadImage(gl_hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0 , LR_CREATEDIBSECTION);
4 s# x) e+ y/ A7 W' u$ n; C, r  c1 ?" q/ C, _7 i  `1 h7 V
if (hBMP) // Does The Bitmap Exist? * r& u8 }$ X& A0 G8 f. T
{ // If So...
1 W/ ]3 F2 h6 d# \GetObject(hBMP,sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object 1 n; P' \' r+ h; N
// sizeof(BMP): Size Of Buffer For Object Information
8 S/ s3 x# J- r8 ?' O; I// Buffer For Object Information
) D4 w* G2 y- |* L/ d' CglMatrixMode(GL_MODELVIEW); ' l5 P" g. ]; I  l) T2 |
glLoadIdentity();
& T+ x5 J' p& y( X+ }glTranslatef(0.0f,0.0f,-1.0f); 9 C  G) Y( n! T$ R9 q
glPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]);
' G/ [9 d* j. f+ H7 l/ x& p1 W// Bind Our Texture " }: {% z' r4 G  \9 j, t. N
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST ); // Linear Filtering , T! C- ^# s- Q
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Mipmap Linear Filtering
, ?1 a' ?9 r8 z
0 J7 t2 g+ l5 P4 o; G- u- w; r, E5 \$ egluBuild2DMipmaps(GL_TEXTURE_2D, 4, BMP.bmWidth, BMP.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, BMP.bmBits);
/ \+ g/ Y0 }( zDeleteObject(hBMP); // Delete The Bitmap Object
$ n& ?# @; f0 f" `+ y8 F6 b} + y9 G+ _, O0 b3 r, n- f4 J
glPopAttrib();
, P- i- e/ z/ G- R
- c# M' |3 I  Z
8 r/ v5 O+ i% I0 m} ; A. T$ @7 F5 `! p. @6 B6 ]
wglSwapBuffersNext(hDC); . D+ t9 i$ E- J& O# H( y0 I: y9 r7 @
} 4 V5 u7 N( b; Y
: p* i  A6 v* N. n/ T

+ w/ p# k% R7 Y1 \8 C" _
& h' d$ T* b0 D- V& s! u6 E) d8 f0 L7 K2 L, ~

( P0 A4 s2 y4 k5 h1 N' Q" e, c5 T3 X0 j" H
作者 : dorkas(aming) 7 d0 v' m% h! N% l4 V9 S' s! T- B
[ 貼文 2619 | 人氣 4536 | 評價 11790 | 送出評價 2 次 ] , G& e& o; C0 O6 {; P7 K
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
4 U5 r! m3 G  `4 ]6 M% G8 `; M+ n2006/9/7 上午 10:30:03 + S  U% ?5 w, {# |5 m' v
0 O8 D% H  d: }& N
1.貼圖動作錯誤
" [! ]$ c' W4 X0 r  ]4 @# L3 C$ z1 p( E
2. 9 l0 i- l8 Q/ n7 F3 @! J0 A; W% y! U
每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡
% Z! o$ g& w: S. M* T3 l/ [+ l
* F7 z, z' U% b( {- M
% B( }1 R% a/ ]9 N, K1 |3 `! {# T7 i3 m( Istruct MyTime
* r. z1 N& Y2 ], z* Y6 y0 d{ , B7 N) s% `  h) o7 s6 M5 e
byte Texture; 5 g" o: [: a* I9 b* P
FontGL font;
  g5 y4 c" R& L% Bvoid initial(void);
, q* |% t$ d5 ]2 ^) M4 yvoid finish(void); 0 W8 E9 D; [2 O! o
void draw(void); 2 q+ e% y1 j+ a" J7 j+ I9 t0 E
}; + a7 b/ z6 Y; w( k! U
void MyTime::initial(void)
8 s# `" k& z; D. z  @3 P{
: k3 _6 B' K. `' h: w// 載圖 初始字型
8 v! p/ L( r) W. c/ Xfont.InitText();
9 H3 e; e2 }% P9 k( y1 ^glGenTextures(1, &Texture); ( f# `2 ?  b. X& T
}
; W2 j6 [4 D1 @+ ]  t% t: Qvoid MyTime::finish(void) - Y0 `' m  B: C/ c4 L7 x
{ 2 t- }* L( `: W/ v0 h/ \# M3 |4 \/ y
//釋放圖形 字型資源
2 b5 ?" w$ A( R9 B7 m}
3 ]0 b. ?( Y% o3 v& H  S0 h$ V/ \  W% p
void MyTime::draw(void) % \/ [8 m$ o$ s, E$ P
{
1 s  ]! E$ m" ~( M, R7 F7 v. T// 顯示現在時間的字串
: y* T0 Z' h! b) _6 Cfont.Print(......something...); 3 V1 o, g  y* z* A7 ]& B
// Buffer For Object Information - f5 A3 m7 P; I- G5 N% R
glMatrixMode(GL_MODELVIEW);
  D+ \- h; M( R# q* ^: r3 j0 eglLoadIdentity(); 9 ?" B) J1 s1 E8 Z: ~0 o
glTranslatef(0.0f,0.0f,-1.0f);
& c% c) |8 t, ]; RglBindTexture(GL_TEXTURE_2D, Texture);
) w8 X/ T' q2 C& k* r% t8 a! e% g: H. w2 z2 k. S3 y7 Z
..... DrawSomeThing - z* G. e+ {+ w
  K% G$ {, c; ^" _, L
}
5 B9 n7 [5 n* i! J& c: C% {8 ?8 J; j& L, J7 s9 A2 x

0 O9 u& B. f! b$ HMyTime time; / n: J$ _4 d) O4 U- _) j  U. x
void WINAPI wglSwapBuffersCallback(HDC hDC)   T* K' T2 Y  s- E+ a
{ ( h1 D: n* u7 h2 t4 W
time.draw(); 8 H, }; g$ d9 \4 b5 y+ P1 c1 G
wglSwapBuffersNext(hDC);   ~  J3 a, |; `4 O! ?; ~
}
' N" e' k  S# s8 a8 T2 E- ?! e9 z& m
你只要掛進去前呼叫 time.initial();
9 A. `" u6 Z! ]* Q, f6 w結束呼叫 time.finish(); 2 ?, a! C; g5 F& A* w

: z) |* n9 e9 `0 w' Y/ z1 |- B/ E5 m# D! H/ \2 Z) G
- \5 [. c) z& l/ z8 W
6 A3 }, [- a( }6 ^& Z# D
作者 : fushunwu(fushunwu) 4 g" B7 L# t* X( F* Q2 u7 ~, ~; U
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
1 q# `5 p# W2 X' x1 T( U[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] 6 X! o. z4 B# _7 C: z
2006/9/7 下午 04:19:31
/ P! A  m; k, ^/ ^# [. x9 w" X
( R" j! D% J4 k" }% E- L' X謝謝. 但我還是有幾疑問想要請你幫忙,麻煩你了.謝謝 ~ % Y+ I  f) v1 ^, |  f& y

$ m9 o# p( w! F( c+ C(1). 因為我要固定放現在的時間字串和BMP圖在被我Hook的Game上面,所以我必須要知道那一個OpenGL的API是一定會不斷地被Game來呼叫,這樣子Game畫面才會不斷地更新. ) o4 {9 `) S/ r, p* W1 u! s0 j! Y
時間字串也才會不斷地被更新而BMP也會不斷地貼在Game上面而不會被Game遮掉.
7 Z7 K$ i6 Y- R' m% j* K+ H像是DirectX Game中的Present API就會不斷地被呼叫,所以我只要把現在的時間字串和BMP圖放在這個API裏面就OK了.
. \+ u7 w: n! y; d7 r( g所以我想問的是OpenGL Game中是不是會不斷地呼叫wglSwapBuffers這個API,讓畫面不斷地更新 ? 還是有其它API是一定會不斷地被OpenGL來呼叫 ?
+ ~! c4 y. \' |  U# E/ z9 ?- \1 r, t
1 l# H0 m* T. N4 l5 J; j4 w0 _- I$ R4 T. Z3 G4 ^3 A" l0 T' U
(2). 現在OpenGL Game看起來都不是用Pure OpenGL API來製作,比如說像是用Glut + h( \& m. Q. h. `% ]
來開發,他們是只是封裝起來底層還是需要用到Pure OpenGL的API 嗎 ? 2 {; E! f+ u$ G# M1 G8 s
這樣我寫的Hook才可以通用其他非Pure OpenGL的Game. 9 }. P& \' ~& I& m5 H

; C! L/ I& o+ @! F' t& v: N: l(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ? 4 Q# V; |7 T7 w

+ g% O1 d6 E2 y/ G  S) `
9 ~* g* [& o+ ]) L4 @8 _
5 M  [1 S) U( s1 B! x
' K  \- \$ N; [% L* u* X: W0 k* W& r% {: D4 {+ H7 B) i
作者 : dorkas(aming) 5 m& D. N6 s7 h; I& r- n: e- e
[ 貼文 2619 | 人氣 4536 | 評價 11790 | 送出評價 2 次 ] " e; q" q6 F3 H: u' b& Z9 Y% E, u
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] ; C1 M2 U( b! z% b" ~7 K$ g
2006/9/7 下午 05:31:01
. k- G! _5 |3 y2 |' W+ v; `
( h, U9 L) t: p5 @6 @1&2 4 n" k; {3 |7 V% k, @& i
我對OpenGL不熟... 8 O6 l' B3 _! I8 }
6 }8 n1 w# v, O3 N; N# i0 L
>(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ? 3 N% B9 k! f: k
' t- {- ?/ v/ \/ ~* F+ K3 |
& n4 E5 P1 Q7 n$ m
初始跟結束都是做一次的就好了
) [0 L* D" ?! Q  c) g你高興要擺在迴圈裡面也是可以 , S+ ^' [6 G  Q! X
4 s% Z! B% r% \  |) t
程式的要訣就是 起 承 轉 合
; T$ G+ D, l+ Qinitial , u- Z2 o. L' b7 d
upDate
$ t* Y$ m% T- H5 Y/ B; J& ychange / _$ E+ a, H. ^+ m) K9 K
finish
% }0 [6 M4 S) q物件也是起承轉合
+ c, k/ k( k9 t# _6 _0 U0 D- n函數也是起承轉合 9 S1 U# I! c. c) n8 R
迴圈裡面也是 起 承 轉 合 5 _2 m" u: Z5 Y& M' ?9 c

8 U1 q0 q$ x" G( D* p! w, B* T
for(起;承;轉)
4 P. S+ ~/ j5 ~1 J{ 5 q# Q  [+ u1 ?9 R! H- k
0 h+ v/ U% ]8 m. G+ ~! v" ^8 }

- n8 x# c/ l5 ^  ^! J7 I; I. u4 k3 l, h: h

' D' \. E4 Y6 R( h3 Z; C: @( q} ) v& s- A  x5 V8 \7 f) D7 C) k

8 }: I" i9 P* R, T/ o! i2 F4 V' p  \# e4 ]; Y
只要你分的清楚 屬於那一塊的性質就好了 ' V: s- j( c0 {9 e9 q! W

  ]5 p% s$ @6 z( q& \8 M9 w. C! t! u* ^% N: R* ~5 s9 Z& l; D# m0 s
  h9 {/ x; F! H- V9 Q. W0 b

) i# J1 w3 O; {; m% i9 Q- k$ `
( N8 Z0 u% t: U8 h/ j" `% _# b作者 : fushunwu(fushunwu)
# L( M. p& [& s2 J' K3 G[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
1 W: n1 J- l0 Z[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] 8 p& D7 C5 a+ X  C" }
2006/9/8 上午 10:32:26 3 H7 g, S7 s; J: D0 Q9 S& u

5 }  Q+ b! j% `' j0 P4 I3 C恩,還是要謝謝你,目前問題還是沒有解決.Quake4和CS 顯示的狀況還是不一樣~
% \' i8 p+ _9 m" r; j1 _; |3 \- t9 D# \5 }1 O* f4 {& h
像是Quake4這個Game它就沒有使用到glBegin這個API 所以我hook不到glBegin
8 |( |$ Q' M" \. ^所以我就把顯示字串和BMP圖放到swapBuffers裏面去做,字串可以正常顯示但圖秀不出來 ; P$ y! s- V* R+ _
我在想是不是因為座標還是矩陣的問題 ?
8 G1 j: J& M4 a$ S; }3 P' ?
  ]2 Y1 z2 `# I+ ?8 x' R但是CS放在swapBuffers圖和字都顯示不出來,但是因為CS有用glBegin所以我就把同樣的code放在glBegin裏面,可以顯示字串只不過會顯示很多個,我在想是不是也是因為座標還是矩陣的問題 ?
8 u! @) j1 l, u& N* |. r- H7 Z至於BMP圖在CS片頭時可以秀,只不過會秀滿全螢幕而且是顛倒的占滿整個畫面. 8 U1 Q7 y8 s$ [9 ?+ r- {) }' S

6 O9 L  `6 Y( V+ |8 I& \/ \, o- ^所以我才想說有沒有一個統一的方式可以讓我把同樣的code放在某個OpenGL API裏面去然後每個OpenGL game都可以正常顯示.
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

冒险解谜游戏中文网 ChinaAVG

官方微博官方微信号小黑屋 微信玩家群  

(C) ChinaAVG 2004 - 2019 All Right Reserved. Powered by Discuz! X3.2
辽ICP备11008827号 | 桂公网安备 45010702000051号

冒险,与你同在。 冒险解谜游戏中文网ChinaAVG诞生于2004年9月9日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

快速回复 返回顶部 返回列表