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

汉化资料 【OpenGL汉化研究】Hook OpenGL的問題

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

[汉化资料] 【OpenGL汉化研究】Hook OpenGL的問題

跳转到指定楼层
楼主
发表于 2010-1-24 11:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

【OpenGL汉化研究】Hook OpenGL的問題

这篇文章的一些思路和我的某些思路类似,留待以后参考。
, k" P; v# k+ @0 U: N: [4 P, f建议还是看原文,比较清晰,为防止原文失效,贴一份在这里。
0 _* k9 A% g3 C0 D
8 Z: F4 V: \9 t+ P
原文 ! r& ?' \2 k/ Z' Q: s
http://www.programmer-club.com.tw/ShowSameTitleN/opengl/1654.html
  k" H% q' ^+ {
- o0 |% z& y* s5 V  n% o9 r大家好, , j, \8 ~4 H2 b6 e

  E3 Z$ Z6 _( L; `我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable ! E$ u% Y8 {. ]
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....
- z; m; T/ ~( N/ A; r
# E7 c% a+ m* d! r; J7 w9 s2 m(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個 2 [8 _# `2 s, M& A. [' e9 u: T
    但是BMP圖放在wglSwapBuffers卻顯示不出來
0 J  }! v# {7 D(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一
" j4 U" v# s( j% D2 `樣的時間字串  
! k* d8 Z; ]; e% k4 ]" S8 l5 J1 R

5 Z! [. Y0 I3 g; N' t/ ^5 R: @, m) o) `* `2 L! ]" q$ t
作者 : fushunwu(fushunwu)
4 n& n) u. X& r3 _* a& l" X+ V+ g. ^, O2 n[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]   
7 ~; w/ z$ \4 _: {% ~! j[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  0 X: m5 m0 j: C! W& r0 y$ N
2006/9/5 下午 03:21:34 - f( Z8 w" M& ~, W% T$ z

1 k; e  S0 E" ?4 T3 w, r, ksorry,按太快還沒打完 ..
, I; Z2 J! b& [& X, Y  D2 m, i8 s* N2 D; Y# Q. |) V$ B& G
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
; `, V8 \) @2 Y6 U' H- j,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....( 我使用MadCodeHook的API) $ x5 B# s2 ]9 |5 v) }1 \

; g; @: K1 ]  }% A) k(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個. 但是BMP圖放在wglSwapBuffers卻顯示不出來 ! P0 d) U5 Z0 A$ W2 g+ W" V& `
(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一樣的時間字串 ; BMP圖放在glBegin中中在cs片頭中還可以顯示,但是圖會顛倒而且會占滿全部的畫面,進入game中再開圖就掛了.
- l  f* f# W) S/ }( v, r, ]
2 {2 z1 G7 v) e) v; G  e想請問各位高手,有沒有一些好方法可以解決 .
/ I1 j1 y3 J6 C2 i$ ]% T, n) a. j3 C" H; F% B
下面是我hook opengl API的code :
+ I, G4 z/ {4 m3 O& W8 T// hook wglSwapBuffers的code; hook glBegin的code也一樣 / Y; z$ |8 j; R. p8 Z0 o
void WINAPI wglSwapBuffersCallback(HDC hDC)
& o/ r2 y; [& ]- r6 t, i# }; Y  {
7 E5 C, D) y3 ~3 z
  A7 g$ Z/ o+ @; \if(!ininstializedfontshit) # B4 n) J7 h$ t: x8 b
{
2 t2 o( E* B" K1 y, O5 cfont.InitText();
: J# L# W# q  Y4 C, `# O9 b$ Lininstializedfontshit=true; 4 L: Q6 r( d% }+ Q
} ; @6 e' t& Y/ a7 K# @7 D
! U- {  U4 n; I7 ^  ]6 y  M, K
SYSTEMTIME SysTime; " P( I& d  w# P  w
GetLocalTime(&SysTime);
/ y; [& i9 o+ MglPushAttrib(GL_CURRENT_BIT); ' c, {! e) T& s+ e; V+ I6 }
    // 顯示現在時間的字串 % }/ k* ~# E& F' |0 Z' ?; A
font.Print(140,125,255,0,0,0,"Time: :%:%",SysTime.wHour,SysTime.wMinute,SysTime.wSecond); ) Q5 d9 t9 [( s" G1 H

) M3 u6 c* D# R3 Q$ {    // 顯示BMP ) r, G! `# g  ?4 K5 |+ S! ?

% O5 p$ L* n8 n/ O- F" L1 e    byte Texture[]={IDB_BITMAP1};
4 w, E7 e( d- T    glGenTextures(1, &texture[0]);
$ I7 t% ]# I$ f' y  I+ j& ChBMP=(HBITMAP)LoadImage(gl_hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0 , LR_CREATEDIBSECTION); ) x3 P" n3 W- ^9 B. d  p, E, n) \
$ Z) d% _7 w. E) O# g/ Z
if (hBMP) // Does The Bitmap Exist? ( E* n* p9 v# b
{ // If So... - `0 E: }" E7 K" G! N$ {
GetObject(hBMP,sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object 4 n2 c* r0 N; }  @+ S5 D7 ~/ E
// sizeof(BMP): Size Of Buffer For Object Information
8 m: R2 ]% ~% {+ g8 f// Buffer For Object Information 4 P  W3 r& ?( C/ D
glMatrixMode(GL_MODELVIEW);
4 ^6 R" p# Q" l$ NglLoadIdentity(); 7 @: s5 x! w4 n' G8 H1 x
glTranslatef(0.0f,0.0f,-1.0f);
1 G: F1 L; ]1 _  U8 E9 xglPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]); : {7 \  A+ k: A8 C/ R: l( M. ?) T& s
    // Bind Our Texture
3 ^5 P. k; h' x8 q    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST ); // Linear Filtering ' [4 p/ O: r3 v( E# H
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Mipmap Linear Filtering ) e% Z/ }4 Y3 A* m$ t: M# q* a! f
- H7 z( |/ M- _' e$ j
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, BMP.bmWidth, BMP.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, BMP.bmBits);   m4 F; M2 b1 C) n
DeleteObject(hBMP); // Delete The Bitmap Object ' P) c8 R5 [6 ~  ^+ f& A
}
) a+ ~- n; m3 BglPopAttrib(); " H) n, ?/ c& o' L- _9 _/ m
8 s, d. Q3 u. D( |+ x* {0 I
  n9 Y4 y& K+ t% b" Q
}
  |+ A1 e4 W3 rwglSwapBuffersNext(hDC);
' n& R" |( ?- G1 R- X4 S}
7 ]( l( P* }4 _) _
0 R4 \* t1 O4 T( ^8 T, w' p
6 X' l* B; W9 a7 }  s+ F1 N0 E7 \3 S2 n2 y& G

4 r9 @' [* Y' G& ~' \3 a3 R% O: e/ Q( e' I! e% z# H$ e2 `1 e
" B% V2 u0 C* n6 r( M6 O4 j
作者 : dorkas(aming)
: a/ \  E2 y$ x' }5 i9 f/ c4 K9 ~[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ]    ( I, N$ Q' o6 `; K+ `3 T
[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  . K0 t! R& V+ Q# i8 w6 T* R- c
2006/9/7 上午 10:30:03 2 [/ s5 ?# ?% Y

% M& _+ h- U# V7 k0 Q0 p2 {1.貼圖動作錯誤
$ B- I" [' f- _/ Q2 V/ V5 F# A( B# P" [1 s# T% x; p3 I* ]% N  S
2. 1 M5 |' L; G! z" c' M% K
每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡
; y3 j; r. D- z6 _) Z) \. b6 A5 @1 F: }3 K7 b4 z: P

0 u. V  S$ ?* {+ p6 kstruct MyTime
; |  k$ R" g% X{
& D6 B# q  z4 O( n. v    byte Texture;
6 M3 _# f- z* C: ~0 J! y8 \( y9 U    FontGL font;
! l: u0 U- V, y4 d3 l9 t) f    void initial(void);
2 _+ s" s" Z" W: \  j    void finish(void);
2 }# ]' i/ G" i6 D    void draw(void); % U* V6 C: r- B5 C
};
8 N- i& f. F& k# w; e% T- H! mvoid MyTime::initial(void) 1 p4 |0 ~; u+ t* Q+ E
{
( e7 q8 y' o+ y6 R/ o* q1 C* q    // 載圖 初始字型 * h2 P) p+ f% ~& b4 ~9 ~
    font.InitText(); # F& b- I+ `. L  l' y- i, c: @" |
  glGenTextures(1, &Texture);
: Q) b. x0 w8 @' ~* n1 |}
! k7 V! Y# t* a8 J, [; X2 j& a7 Cvoid MyTime::finish(void) . }; k7 d( `2 J" F+ m
{ ( ]' E/ h4 l, o
    //釋放圖形 字型資源
# }8 I! o* q* H* ]% F! P) b: I} ! ^2 k. ^, p" b7 i0 o
0 ^$ E) m$ @. G" M
void MyTime::draw(void) ( ~" k6 ~  e5 i6 n4 j
{ , d. h' l# L8 |# \5 y
    // 顯示現在時間的字串
: ]) T! y! F# Q8 I    font.Print(......something...); 7 f, U4 m$ T2 l. Z4 ]7 `
    // Buffer For Object Information 3 G8 m2 e* m8 S, \4 k; b+ e" G6 j
    glMatrixMode(GL_MODELVIEW);
* P2 }9 @) R( C' I    glLoadIdentity(); + |" p" j5 z  P; n! {1 V, C9 L
    glTranslatef(0.0f,0.0f,-1.0f); / _$ |/ e* c6 E( }3 C) ^2 s
    glBindTexture(GL_TEXTURE_2D, Texture); , o3 V+ v$ s5 Z; x% s0 r
4 y8 s& b  O1 c: w2 ^' g0 l" F
  ..... DrawSomeThing 7 h% G8 a: _) {- ]+ k7 ~( }" L/ u0 _
   
- R0 z* V' B. D$ m8 A4 Y  i} / P3 i8 _% ^9 t- w4 W

, T9 a7 T' H2 o5 F4 f3 B3 g+ {# A/ Z
9 ~/ {5 Q! s. y6 ~' [MyTime time; . l& p% N. B6 }$ I. K% s' N5 y
void WINAPI wglSwapBuffersCallback(HDC hDC) % a* [3 S/ l1 T. ~+ I0 F
{
6 W# V" @3 d% l& m9 X* |6 F    time.draw();   L8 e) f8 q* e, Z
    wglSwapBuffersNext(hDC); 4 ^& J5 k% m, W% x+ w9 ?. e
}
4 N: `& i% R3 O+ K5 q0 p0 g, E: f! w1 R, A7 a% W6 Q3 J
你只要掛進去前呼叫 time.initial();
: x3 M% ?( L3 Q/ n結束呼叫 time.finish();
0 f# Q8 K! Z2 e# {
4 l, t5 Q" Z% e+ N- J/ Z( j
( y# w2 b) x, h' F5 e3 O
( R  g1 V( v. i: p/ ?+ |5 P8 l& {* [8 \- Y; B6 p6 T! L0 h
作者 : fushunwu(fushunwu) , o) ~+ S" q6 a, S* p) o
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]   
* }9 w) B$ v4 ?8 T7 G5 ], W& j[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  $ o* V! D" G& o1 F: H2 V
2006/9/7 下午 04:19:31
9 z$ Z2 Y6 X$ b) }; ^
1 `8 o- T+ F5 k" K謝謝. 但我還是有幾疑問想要請你幫忙,麻煩你了.謝謝 ~
+ z) D& O: |' r7 A4 l1 a% F! |7 G
, \" b) J& i( {. ~(1). 因為我要固定放現在的時間字串和BMP圖在被我Hook的Game上面,所以我必須要知道那一個OpenGL的API是一定會不斷地被Game來呼叫,這樣子Game畫面才會不斷地更新.
( f5 ?3 A3 ^5 H  v# p0 a% p時間字串也才會不斷地被更新而BMP也會不斷地貼在Game上面而不會被Game遮掉.
* G8 k: w2 d; l3 H  M像是DirectX Game中的Present API就會不斷地被呼叫,所以我只要把現在的時間字串和BMP圖放在這個API裏面就OK了. 5 I4 O  `! q: q$ ^, M  Z" Q+ ]
所以我想問的是OpenGL Game中是不是會不斷地呼叫wglSwapBuffers這個API,讓畫面不斷地更新 ? 還是有其它API是一定會不斷地被OpenGL來呼叫 ?
$ M9 X7 V  i' l4 b) H4 W- _- [, ?/ a( g9 E+ Q) Y. q' J

4 Y: |; @7 B( J  C0 \(2). 現在OpenGL Game看起來都不是用Pure OpenGL API來製作,比如說像是用Glut 7 G' B8 x9 w' ?' i, A+ v
    來開發,他們是只是封裝起來底層還是需要用到Pure OpenGL的API 嗎 ?
: v1 H* e: j' L% ?4 {2 g; H    這樣我寫的Hook才可以通用其他非Pure OpenGL的Game. ( }, y! J% A5 t( ^. i' l, W" q
  I. G5 A( i7 Q8 n- x
(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
! e, L+ o4 E! `) \: x+ x1 k2 v
" k6 I  ]/ @+ U2 `( x2 L
# m* J! t& T2 {$ x8 X; [" C3 B4 D$ d8 g- d" ?0 S
. K5 F) X4 f- ?: u& @  B
& }( O& o7 w+ u
作者 : dorkas(aming)   y7 }0 N6 x* u! |% v) C
[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ]    1 D) l: k' Z, `* z, n9 D; H4 Y
[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  
: M/ a! Y/ ?- N& a% t2006/9/7 下午 05:31:01 5 {: _+ W' W6 G1 y' h0 `

3 y+ p8 \2 S; m: l' I) T" ^8 t1&2
! y# W+ C( C. r# }. u我對OpenGL不熟... : J0 U& j$ h5 Z' N2 G0 C

# i" C; k8 ~5 s# c>(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
1 f7 T3 P, W8 l0 w" P: p/ x$ p/ R
5 s$ {1 d; m) C. x- C" I7 h3 x9 t6 n% S
初始跟結束都是做一次的就好了 8 ?7 [: P. e+ |; J
你高興要擺在迴圈裡面也是可以 # F" g) k7 w+ V

* Q8 U* {1 ]' T5 t/ W程式的要訣就是 起 承 轉 合
! |7 G, ~6 m; z0 X9 n& b1 d4 Ginitial / ^3 \# T6 b# o9 p) R
upDate
$ H4 N5 _4 C7 ?" J' C. schange
! E3 `" o, Q2 N* e4 `3 {finish
" f( ~; B9 \. n$ E* z3 s# y: G+ |物件也是起承轉合 ) a! b$ R, q  |* @
函數也是起承轉合
3 b8 J7 B: I: V# [5 Y迴圈裡面也是 起 承 轉 合
9 l5 y1 F: ~% G" z2 d% W7 l( |
7 G* U. x# G& d8 |% s
/ c; f% _0 Q, E/ P* Nfor(起;承;轉) 8 {' K. Z0 n' i
{
8 ]/ D* {) s4 ?9 U- k1 z: L# f; v! ~3 r/ A6 @# A; h

4 r* l' M: @/ T. o& l/ @: D" b  n

0 l6 y+ }. F0 w1 v8 ?& R7 B} ( t8 o( b9 D( C3 @

1 k3 h* M8 z7 o2 [6 I% a; R! _; Q* v1 |4 N* Y; A8 _
只要你分的清楚 屬於那一塊的性質就好了 6 ]! ^& V) a4 S8 t+ U& R6 j
7 Q0 n' w2 E3 [, X* l
$ F2 `1 n) q# _+ b6 V, t
5 S! z) D9 ^$ B
0 r8 f0 c7 ?* c. ~8 t9 ^: Q8 h
+ w5 G5 U' P, [6 L8 S
作者 : fushunwu(fushunwu)
8 _: e# Y  I' Y6 o[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]    - {1 H( h( _& p! c/ Z, ]
[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  
1 S. [: Y+ G5 z2006/9/8 上午 10:32:26 , e+ S) g8 `  H8 I* `
( Q8 p! y" G% q/ h9 W
恩,還是要謝謝你,目前問題還是沒有解決.Quake4和CS 顯示的狀況還是不一樣~
2 z2 b8 E1 o; e& t
- J5 K# v. Q$ ^. H, u7 ?; S) ~像是Quake4這個Game它就沒有使用到glBegin這個API 所以我hook不到glBegin
. g$ N( Y& M( Y+ ?) H  k8 r所以我就把顯示字串和BMP圖放到swapBuffers裏面去做,字串可以正常顯示但圖秀不出來
$ e% S5 ?  K6 H# r我在想是不是因為座標還是矩陣的問題 ?
0 y1 L* V1 }3 w2 B0 D6 y! r7 w$ m) H7 K- M5 S) l6 b1 [
但是CS放在swapBuffers圖和字都顯示不出來,但是因為CS有用glBegin所以我就把同樣的code放在glBegin裏面,可以顯示字串只不過會顯示很多個,我在想是不是也是因為座標還是矩陣的問題 ? 1 X) o$ [+ o" u6 T# E
至於BMP圖在CS片頭時可以秀,只不過會秀滿全螢幕而且是顛倒的占滿整個畫面. 3 S" g" t0 p7 Y% k6 K: W% j3 f% f

) H# s8 c; H7 `2 n所以我才想說有沒有一個統一的方式可以讓我把同樣的code放在某個OpenGL API裏面去然後每個OpenGL game都可以正常顯示.
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

沙发
发表于 2010-1-24 15:03 | 只看该作者
一丁点都看不懂。。。。。。。。 [s:60]
回复 支持 反对

使用道具 举报

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

本版积分规则

冒险解谜游戏中文网 ChinaAVG

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

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

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

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