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

【汉化资料】Hook OpenGL的問題

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

【汉化资料】Hook OpenGL的問題

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

【汉化资料】Hook OpenGL的問題

在分析Scratches是我发现这个游戏使用了OpenAL32.dll和wrap_oal.dll。
& N7 I: }9 q5 {" ?0 b  \7 Y7 _# C所以估计使用了OpenGL的API,以下资料可以作为研究的基础资料。

  M, d  o, `( I( g" b: b, W1 I
* [/ Y7 N8 i8 W4 F/ W8 I  H, A3 H2 V. V+ f7 O
原文 1 Q1 C1 g+ ~: q6 z9 @, C* v
http://www.programmer-club.com.tw/ShowSameTitleN/opengl/1654.html
( f; s4 Y- G" w" E$ k" j$ U0 i) l- a& B/ n
大家好, ( c' P# l" M  R! }! n
% _& ~( d0 Z8 {2 v+ T
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
9 B% `* ~. f9 s' |2 o  \! R, E; T,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....
' r" @/ k% y  w2 p! I& W# f0 x5 C! n" x$ O& d/ Z6 q
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個 $ _  G5 j/ Q/ ]& L1 d2 H
但是BMP圖放在wglSwapBuffers卻顯示不出來
2 s( Y! @; _: R(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一 5 V3 _% V6 a8 J/ _# A0 l
樣的時間字串
2 n9 {+ c; E9 H* M7 U2 \+ u& K* ]$ O
$ S( P3 r) V5 }2 N
- ]3 {  W0 ^2 Z  o5 r8 n4 \& ^1 i
作者 : fushunwu(fushunwu) ; ]/ ^2 n8 ~( [
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ] ! C  E8 ?6 d% ~2 {6 {# V
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
( Z7 ?3 p. ^& \5 E: Q) Y2006/9/5 下午 03:21:34 , {! d: o5 b: O. L2 i! Z
. Y/ {7 l7 X3 l: R/ h& S* h0 a. s
sorry,按太快還沒打完 ..
* ]4 a. `. b! r( s2 ^* P3 X( ]5 k$ f4 |( O) ]
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable - p- I; D- t4 a* U. g7 V( I9 Q
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....( 我使用MadCodeHook的API)
! t% Y7 r+ m7 P
" c" p9 N6 v$ b; |(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個. 但是BMP圖放在wglSwapBuffers卻顯示不出來 & j& d- @0 L  z; B! ?5 O6 m7 D! F
(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一樣的時間字串 ; BMP圖放在glBegin中中在cs片頭中還可以顯示,但是圖會顛倒而且會占滿全部的畫面,進入game中再開圖就掛了.
. e' H  s$ R1 q  b' e( o" ]; V! @  b% L! [. ?
想請問各位高手,有沒有一些好方法可以解決 . , {2 t# ^4 N7 b6 ^6 v

- s. u: E5 S# y7 {3 D1 m" |& }下面是我hook opengl API的code :
9 q9 ^0 d. G7 O: m// hook wglSwapBuffers的code; hook glBegin的code也一樣 1 P. S' N9 q* I' r& a
void WINAPI wglSwapBuffersCallback(HDC hDC)
, h. h& ~/ s- w+ _/ G6 k{
, n% B- T6 s& z5 o% G+ y4 q  t. D8 M  F6 L" m8 w
if(!ininstializedfontshit)
8 Q/ }0 d0 t2 S4 N7 ?5 M1 r* q{
1 R$ M0 \7 |( [3 Kfont.InitText();
' V1 w" V5 u+ N* ?ininstializedfontshit=true; 2 Z: W& j, u. T' P
}
/ K$ M- a: C' t
" _8 {0 c1 E% V! b3 ySYSTEMTIME SysTime;
- C) b, B7 P( O: e; X9 tGetLocalTime(&SysTime); " c7 x1 q' g* U7 v
glPushAttrib(GL_CURRENT_BIT);
, l9 m5 X7 I$ P# J// 顯示現在時間的字串
" X2 e8 ~% q3 D! E0 A; ^font.Print(140,125,255,0,0,0,"Time: :%:%",SysTime.wHour,SysTime.wMinute,SysTime.wSecond);
4 p# a, S5 f2 k. J- h6 a0 C0 r7 V$ A( ~
// 顯示BMP
& z1 e; i3 m# e' V5 h# g5 ^' X' q2 w6 y2 f* ]/ T
byte Texture[]={IDB_BITMAP1}; ( }9 T( r+ A2 b1 o- O
glGenTextures(1, &texture[0]); 0 I7 q, z# f1 m1 d3 z, g
hBMP=(HBITMAP)LoadImage(gl_hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0 , LR_CREATEDIBSECTION); ! O- i5 B- F% K

7 m2 h( O  }% {if (hBMP) // Does The Bitmap Exist?
; L6 S/ S0 ^( }4 w% X0 T; m{ // If So... ( c9 T3 y0 M2 j+ u8 b2 M
GetObject(hBMP,sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object ' P' k# S- I7 W# w2 n" k5 M
// sizeof(BMP): Size Of Buffer For Object Information 4 w( X( c) T5 f6 R9 }: ~
// Buffer For Object Information
. y% w1 u* B% n5 M! j5 rglMatrixMode(GL_MODELVIEW);
* k% @8 T; R+ @& a7 z7 F1 r( AglLoadIdentity();
2 K% g4 G( x9 z$ n, m( @0 O9 E, xglTranslatef(0.0f,0.0f,-1.0f);
4 G# v* N- b5 b/ ]  @glPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]); ) F5 i8 ^; Z( W4 {+ V6 w+ K: U
// Bind Our Texture
# `' \2 g- {* z0 ?glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST ); // Linear Filtering % u3 Q% w1 p7 l$ W
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Mipmap Linear Filtering
) v& h- y/ S, N$ M" U$ \3 x2 V9 n# q1 O- g$ j
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, BMP.bmWidth, BMP.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, BMP.bmBits);
9 O* E4 F, w. P5 t! ~: s: z8 A1 jDeleteObject(hBMP); // Delete The Bitmap Object
/ K4 }% b7 L6 p' D' f} - Z+ ]" n+ S* {% H% s2 w
glPopAttrib(); ; ?# x) n( m: Y% ]# J

( u; l3 O8 ^, n% O* _% F' o+ g+ q1 \- R' x- E* [
} * {/ ^; h; D! n7 E
wglSwapBuffersNext(hDC);
. @: }8 I; {, w: g/ v7 J} / g' J8 Z+ w* g" l8 h& Y" _$ b# u

% _& f  y9 I- [$ q) {
- I$ W# A& S4 \& H+ `& _6 Z9 y; Y& Z& U0 c6 B5 W
+ k- p1 w! U5 e9 \" a* O; {

( W5 L; u+ }, n* X
$ O! e( L) G6 S. w作者 : dorkas(aming) : F% @! G. N9 b, Q1 T2 A7 ^* r
[ 貼文 2619 | 人氣 4536 | 評價 11790 | 送出評價 2 次 ] , A5 O3 {2 T/ W0 [$ X3 }- P/ J
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
# I, C$ a: I' X  v2 E2006/9/7 上午 10:30:03
9 |# x2 E/ X. g3 _% \' ~) T* D* y( X
+ K( m: w6 F/ ~0 P4 J+ p. N0 O1.貼圖動作錯誤 9 J; F2 F6 p* [1 @

8 @) h" z" k9 l, |2. # R# D" E7 l4 @  @- H
每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡
; L% p! a- T2 A3 \$ P, x3 C- O& a4 ?( t9 A2 t9 j
# p7 H" Z! G  w/ r! N" p7 o, Q
struct MyTime 9 t% \3 \/ L, K+ o' [$ v
{ & P& `5 a7 }( h  _' E% E
byte Texture;
* O0 d7 N' T# O6 W/ r8 A) a' a0 }FontGL font;
5 r- L0 G" s* v" G0 ?4 v# J( pvoid initial(void);
$ A& D3 t4 @* B; E# {% I2 n( l: evoid finish(void); / k/ {/ h% q' O/ r' W# j+ ^+ x
void draw(void); - p, l4 f# ^5 [' Y1 j8 B
}; : D0 L- h0 U0 m) h  d& D( t% l$ N
void MyTime::initial(void)
$ u5 _2 h$ W8 E0 W3 b8 H2 N{ 5 x5 c* ^" R: }
// 載圖 初始字型
5 a. G9 u1 Z/ \font.InitText();
6 }9 G) ^; k5 G- zglGenTextures(1, &Texture); , m/ l& k" C$ p6 I" m* `  Y+ x) \) C
}
( r2 Q+ h* ?8 }4 l8 m: ]+ W1 Wvoid MyTime::finish(void)
) t6 l2 }( r- d2 k{ 7 L2 F, a* e5 W. t' W4 v! V
//釋放圖形 字型資源
0 r) A! r4 {; ?, a. T; L3 X}
0 G) g* |" m( A$ r1 d3 V: Z/ \5 D4 z8 Z' X6 F' A3 T
void MyTime::draw(void)
: d7 f8 z+ R: a( V0 [{ / W4 H$ i. S# i" R, u$ o
// 顯示現在時間的字串
  |9 Z( ~4 x& n% r! {7 Y& x3 ufont.Print(......something...); # Z( D; y! h, h: p! O5 V# S/ W
// Buffer For Object Information 2 z. z% ?" X$ J" U5 C0 @6 U
glMatrixMode(GL_MODELVIEW); # h) M4 e9 w3 h1 c
glLoadIdentity();
% x* W7 c/ ^  Y; Q" D5 N8 S: nglTranslatef(0.0f,0.0f,-1.0f); . H5 N% b/ E0 ^/ G6 H( e
glBindTexture(GL_TEXTURE_2D, Texture);
- \4 q8 x5 m1 E5 T" g) w# P! ?. X3 c2 J* i2 N& I; p( D% k
..... DrawSomeThing & u0 R2 C) ~& ?3 p) r; ]
# d& ^; \7 Y: N3 `* ~3 T
} . n6 ?% }1 \% u& v
( ^/ W1 z  }5 A+ B" f. m" [$ i$ Z
8 O! t7 `; A. ]" h) X
MyTime time;
) {, r- T* F, V) A+ _2 F) a$ S' q. Gvoid WINAPI wglSwapBuffersCallback(HDC hDC)
8 `# A  c3 @7 p+ Q! c{
+ t; Q& @2 k+ M# c- Qtime.draw(); ; Z! v+ @, r4 E( S( h* ^" g% C
wglSwapBuffersNext(hDC); ; O+ ]) a1 M4 U" i6 j1 w) u: M) Y) f
}
8 C/ g8 ~7 {3 g. [' I  R1 I8 F
" J9 X: C! O4 o& p( }+ X  C你只要掛進去前呼叫 time.initial(); % z, l1 I# v# X* A' H
結束呼叫 time.finish();   U/ R7 H- K* F# }2 J% e; D/ D
4 i9 z" u' X: ?6 P! q+ L6 m& C

4 g  s# A/ x: a5 w. y! w
* l* P8 s9 M- \2 p) i! z: q! T$ g8 w  c5 `# q$ l3 e
作者 : fushunwu(fushunwu)
, Z* e; c( T1 S- r  G' C2 \3 w; P[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ] 5 m9 z8 W2 `; w
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] - e* J+ g2 T' b* w2 X: a
2006/9/7 下午 04:19:31
! M8 x& R, Z- ^) h' R! O' g# k( m) q' J
謝謝. 但我還是有幾疑問想要請你幫忙,麻煩你了.謝謝 ~
9 s7 Y$ s" _2 _" l2 y% W7 G3 B# {. a$ ~! _8 o, K$ W
(1). 因為我要固定放現在的時間字串和BMP圖在被我Hook的Game上面,所以我必須要知道那一個OpenGL的API是一定會不斷地被Game來呼叫,這樣子Game畫面才會不斷地更新. 9 F* k3 z$ c9 w' F
時間字串也才會不斷地被更新而BMP也會不斷地貼在Game上面而不會被Game遮掉.
1 B; a& V: s% i. X像是DirectX Game中的Present API就會不斷地被呼叫,所以我只要把現在的時間字串和BMP圖放在這個API裏面就OK了. 3 I% s. |! i. p  M8 S
所以我想問的是OpenGL Game中是不是會不斷地呼叫wglSwapBuffers這個API,讓畫面不斷地更新 ? 還是有其它API是一定會不斷地被OpenGL來呼叫 ? ) p, Y- O* Z$ x2 I6 G+ p
/ Q3 v1 s; ]6 ]# M( ?' Q  d* O

$ w* h& ~8 u+ _% Y: [& _1 H(2). 現在OpenGL Game看起來都不是用Pure OpenGL API來製作,比如說像是用Glut " c7 j6 y; D2 C- ~( N
來開發,他們是只是封裝起來底層還是需要用到Pure OpenGL的API 嗎 ?
. r( T" t- @' v這樣我寫的Hook才可以通用其他非Pure OpenGL的Game.
) h4 b4 S6 U; U( y- |. s7 f
6 `9 |8 l3 x& x  V2 o' B(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
0 V4 M3 @: C. x' y0 [# P) H$ t8 ~4 I1 ~0 Y0 g' i2 }
; E! O1 b$ S/ `5 u. ~; [
& |/ N1 N" b/ G5 X, ?9 o0 K

- V5 I! w- m" y; Z; I# C5 K  C
) w9 @, t. ~  _6 ?# Y作者 : dorkas(aming)
' s6 L! {! e# d# o+ ?) d[ 貼文 2619 | 人氣 4536 | 評價 11790 | 送出評價 2 次 ] + `, E% H# [  [0 a/ v/ }
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] 2 J, n, |4 n# b+ X
2006/9/7 下午 05:31:01
9 ]3 D) M; I4 K% U+ t+ @! i3 s8 ^: @& [2 t
1&2 * Z# {. d+ q' L' B* B9 ?. o1 N
我對OpenGL不熟... + N" S) k! [( X9 N5 I
' g5 n5 {3 U8 A& e& B- ~
>(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
( x% j7 Y* F/ @& U9 E2 C# c4 @( {' Y+ b/ ]5 T" c" ^  S7 N6 F# U- I

( f7 p  h# d; A4 {+ z$ i5 W$ d! O初始跟結束都是做一次的就好了 & U  }1 k; ]. O- g- z0 t
你高興要擺在迴圈裡面也是可以 4 w  F; V( p1 U

- m' D8 E6 B# `1 T程式的要訣就是 起 承 轉 合
* K* x$ @1 L- h) U$ ^2 qinitial
' U. W+ ~8 c2 W2 RupDate . ^- @2 R& }& e* s- Z/ ?& K  m: T
change
4 b" O8 I' u4 i) R4 xfinish 1 @1 R  f$ ~8 q0 V4 r* A
物件也是起承轉合
" m2 W  l( |/ H4 J) i! `" c  [函數也是起承轉合 3 s/ [  @2 x' Y
迴圈裡面也是 起 承 轉 合
9 P; T) D7 S, P
6 K1 P, I1 m7 x  h# i3 P
4 u7 @% @, ?" h- R, {; Dfor(起;承;轉)
  ]4 ]! ^7 G- U{
2 ]" l6 V5 T2 H  U6 ?4 N0 j) \) Q# H; d  ?2 ^. D
4 a0 a' A. D3 ^8 o9 S
( [" j/ D" _, z, b6 }7 i
, X' e5 |' O# B8 ?% j: e
}
0 A2 c: q$ R, t" |! ~) B9 l% D+ @" t/ T2 u& @  }4 j
5 _. V. j$ i+ h* K
只要你分的清楚 屬於那一塊的性質就好了 / B# [$ K, f: b+ u; c
9 ^% n2 ~( p5 h" O

9 y9 h; U8 s( p2 U. p9 H
7 o7 p# c" X# |$ c. ?8 |3 ^% l# i
, g1 d8 c: G7 f( Y. K, @5 u! C8 d3 X& C
作者 : fushunwu(fushunwu)
; Y4 {8 ~% Q2 V' N[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ] 8 R: M& o2 C1 U
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2 x! u, j" _9 @- L& A, i2006/9/8 上午 10:32:26
( i) Z  X/ n1 Q5 m$ A+ f, G
3 X1 }$ M/ Q& C/ t1 V; T+ o恩,還是要謝謝你,目前問題還是沒有解決.Quake4和CS 顯示的狀況還是不一樣~ 2 D( x5 q: C" X6 b* K4 y

, J' [& E. q  _( G' t: [像是Quake4這個Game它就沒有使用到glBegin這個API 所以我hook不到glBegin
( g$ M/ Q4 R9 _8 l所以我就把顯示字串和BMP圖放到swapBuffers裏面去做,字串可以正常顯示但圖秀不出來
! E9 {& l1 s$ U- d5 y我在想是不是因為座標還是矩陣的問題 ?
8 |9 \9 a( J  X: j, ~1 J) X! n) o  [. {3 r- j1 {: E( U- V
但是CS放在swapBuffers圖和字都顯示不出來,但是因為CS有用glBegin所以我就把同樣的code放在glBegin裏面,可以顯示字串只不過會顯示很多個,我在想是不是也是因為座標還是矩陣的問題 ? ( [8 P7 Z5 y  D( a) Y
至於BMP圖在CS片頭時可以秀,只不過會秀滿全螢幕而且是顛倒的占滿整個畫面.
+ ?' ^  g% ?- L
* E: W9 }1 L5 L8 {3 _所以我才想說有沒有一個統一的方式可以讓我把同樣的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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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