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

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

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

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

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

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

这篇文章的一些思路和我的某些思路类似,留待以后参考。
* w7 J4 ], Q& C! N6 o" z% \3 V建议还是看原文,比较清晰,为防止原文失效,贴一份在这里。
) O0 \$ _# k( i4 r

6 ?, C, x8 R1 l, g原文
! S8 `+ x# h' v6 Thttp://www.programmer-club.com.tw/ShowSameTitleN/opengl/1654.html ' {. R/ F- @( J7 Q! g% k$ ?* G
3 H7 C: N, X2 P0 `+ a
大家好,
. r2 e3 e8 `4 h/ Y3 F# t9 K" d, ?
9 ]- C8 X8 O8 {6 h我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
  X9 n0 j+ j  ~4 L2 n$ ^,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣.... & m' C! X4 q: w& c4 X
  {/ i9 [8 {0 u- H5 p
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個
6 ~" [  m" W. _5 ~    但是BMP圖放在wglSwapBuffers卻顯示不出來
* Y/ D' {, z$ C6 w9 T0 {' G(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一 ( o: T1 Z" A1 i) `
樣的時間字串  
8 k* Y; H. o# l. o1 U& j0 O& P9 \# ?* [% ]

9 U4 M: w; L: l# L- f
4 n& u7 {: x$ w3 A, N- S作者 : fushunwu(fushunwu) ! c/ ?  [  \# V" T8 }" L5 p
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]    ; R  T4 q5 y; P- J
[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  ! B) s, o8 U6 M2 p
2006/9/5 下午 03:21:34 % S9 |+ H& F* Q" k% p+ {6 D* j/ A

5 X9 ~: {# E" Y2 t9 P3 s9 k$ [6 ~sorry,按太快還沒打完 ..
1 g1 V6 f2 j+ E2 p' H! S" z9 ]' h, ]  m* `' \/ e# c
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
1 Q1 L" G8 P: P( D+ U,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....( 我使用MadCodeHook的API)
: B. W  l0 G. l" |6 ?2 D
' T$ C( G3 y! c& k(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個. 但是BMP圖放在wglSwapBuffers卻顯示不出來 - o* D7 i" q- {; p
(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一樣的時間字串 ; BMP圖放在glBegin中中在cs片頭中還可以顯示,但是圖會顛倒而且會占滿全部的畫面,進入game中再開圖就掛了. & z- g3 u$ K6 y. o& W8 @3 N
. V, D' K8 y( s6 C+ Q$ k4 k8 G9 E. A
想請問各位高手,有沒有一些好方法可以解決 . $ E  s' c, Q  }1 P6 U3 \
7 u6 O+ t5 O8 y/ [. x* B" D
下面是我hook opengl API的code : % s% y" j$ d$ e2 i& k# K3 c
// hook wglSwapBuffers的code; hook glBegin的code也一樣 3 U) Q1 G( l% o* G
void WINAPI wglSwapBuffersCallback(HDC hDC) # m' I3 o9 [2 X; W* M1 ^, _
  { * U: {6 B6 g4 j$ k# r) `5 B

  |3 ?3 `% f0 H$ Wif(!ininstializedfontshit) : e6 y. G& X1 c8 j7 E  Q
{ : \5 R- F, p6 e8 E% B! r7 x5 I1 f: o/ q
font.InitText(); ; J8 ~5 t  J8 a) c% g+ s! x
ininstializedfontshit=true; , D3 T! P8 K$ i- E, X' l
} , t3 ?+ e/ ]( ]  W0 q
$ S1 i6 a2 G7 g) d
SYSTEMTIME SysTime;   l! K  ~. B4 W
GetLocalTime(&SysTime); 1 E8 f9 m5 h" C7 n7 j7 ]
glPushAttrib(GL_CURRENT_BIT); 5 @, K. ]& s! X! \5 V9 X  w
    // 顯示現在時間的字串 + X% n/ u) {; |* r- Q
font.Print(140,125,255,0,0,0,"Time: :%:%",SysTime.wHour,SysTime.wMinute,SysTime.wSecond); ! j. C" v) _, ?2 @4 t

; W( W1 I4 r( Q! X$ e, Q3 r1 |7 H    // 顯示BMP 3 y8 r  _! r& T$ x3 {% C0 _7 E
3 Y+ H$ \* t- m3 u, \
    byte Texture[]={IDB_BITMAP1}; 6 F) o; y7 \0 E7 l, }
    glGenTextures(1, &texture[0]); 0 F8 S3 V9 f3 X& N  O6 o. e/ A
hBMP=(HBITMAP)LoadImage(gl_hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0 , LR_CREATEDIBSECTION); : I, m2 ~2 {, y8 c  p& e( o% e

  {5 G3 z! O) t7 \) qif (hBMP) // Does The Bitmap Exist?
- p/ c; [2 V  T6 a) w5 j% \{ // If So... * z% X2 ~% ^, @1 U0 Z
GetObject(hBMP,sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object 4 Z7 V) K, Y& S& `* U' N
// sizeof(BMP): Size Of Buffer For Object Information
" {  J5 L8 u3 K  ^8 y6 h// Buffer For Object Information ' o/ X0 H$ {/ B8 C
glMatrixMode(GL_MODELVIEW); 1 l( t, k$ r7 B2 ?. f
glLoadIdentity();
  C- l2 g+ t. `! e1 F" I4 s" XglTranslatef(0.0f,0.0f,-1.0f);
8 J) \0 B- }  _  R9 ]& w+ VglPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]); / P. X: z" B" [- q- m8 M0 L! K
    // Bind Our Texture
- Y& F$ v8 z+ D$ r9 }1 i6 h; _; o% u    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST ); // Linear Filtering
9 K8 u1 n7 a8 }    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Mipmap Linear Filtering
+ Y! Y& \% g( @- ~  T9 Y
$ Z$ A( f0 [# w8 m; b$ XgluBuild2DMipmaps(GL_TEXTURE_2D, 4, BMP.bmWidth, BMP.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, BMP.bmBits);
- c/ w: A2 [; R( e) Q+ ]% Q6 qDeleteObject(hBMP); // Delete The Bitmap Object
0 w0 Y* P# Z% g5 Z* K+ A} # }% [- [! I0 H3 x
glPopAttrib(); . T1 S: {/ ~4 q+ c' f9 c
6 f. s# N% [+ d- b& L1 k. @% b
% g% r" U3 i9 I0 o. N' r
}
4 c6 V, A4 }5 ]$ E8 }wglSwapBuffersNext(hDC);
( B+ l0 z: L0 N& @* m: b1 I} * W+ V5 t/ E, \4 O% Z3 y
7 b: V# c6 w, e, j0 `8 z  X

9 Z. ~$ {. {4 w  a" ^& _
! o, x# H7 k  I
( K( y3 T# X; x2 V3 {6 ^* p! s, S! e

; r5 X( M9 T" U" S' w作者 : dorkas(aming)
% V  R. q9 {  s[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ]   
: {/ T  ]2 [. W, i! f0 v[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  
5 E4 c+ C* G' e( M2006/9/7 上午 10:30:03 4 W$ t% v# z& X- i6 o" X) ?; X* n

$ h2 `- m% L8 g4 N( {8 H1 L1.貼圖動作錯誤
, ]5 w* G) Z$ J8 X: h- b, r7 f( V
2.
# s% q2 f: Q7 Y7 W每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡 * S/ r# w; g0 J$ r5 _  I

* Y% d5 x# B6 B5 {. J$ u' K% d" w( F
6 x4 b7 E! d2 Y  K( b6 O# M3 Dstruct MyTime " m' m( @! O. _$ T
{ 6 c, h0 S5 j* p3 c
    byte Texture; 9 h( _$ ?" n! ~. }% ~" p/ j- U
    FontGL font; 1 O+ u- y0 p" c! y( `# X! G
    void initial(void); : p( H- h/ k' U1 D: `
    void finish(void); # @* f1 q( M8 k% ~, k
    void draw(void); ' u( Y) e$ L  L  ~
};
" Y2 n/ E( _  P- u: Y; {void MyTime::initial(void)
2 N( a, E& z; S3 B* G* Z{ # L, j5 j9 y" ?0 s0 o0 m
    // 載圖 初始字型
6 r( }5 i# K4 Y0 s3 ?% M    font.InitText(); # a5 x* k9 u5 Z; r; v; d/ Q4 j
  glGenTextures(1, &Texture);
& U$ B' n; v' @$ c* l}   b8 x' W% P/ s+ j/ F7 F
void MyTime::finish(void)
0 _& t: S7 B9 E7 l* N/ I{ / c: W* N) l0 m9 g, f8 l0 X- ~
    //釋放圖形 字型資源 4 l6 f, |# z7 H
} 8 I, p/ d/ `/ v! o

. @. q2 f0 b. y! \$ K: Ivoid MyTime::draw(void)
9 [0 Q, C0 I% d& K{ ' c8 {' N+ Q% Z* o* P' X' s
    // 顯示現在時間的字串
7 R) ~, |) _1 I% n6 f" R* }    font.Print(......something...); / C9 \1 W; U, V2 M. U& s: p
    // Buffer For Object Information
$ f, \$ |) O+ G+ r    glMatrixMode(GL_MODELVIEW);
$ b7 @0 G# }; h; ]% ^; o/ [9 T" s" F    glLoadIdentity();
/ K4 Q2 T) L! Y4 M    glTranslatef(0.0f,0.0f,-1.0f);
9 y5 h- G+ E1 {3 F* A+ G! G    glBindTexture(GL_TEXTURE_2D, Texture); , ~, r1 K& X0 \2 c% {5 ^
9 N. A- }, G7 T; j3 ^
  ..... DrawSomeThing
1 i2 t9 y, n/ J# }   
( K* K- x$ ~+ {  y* W. Z+ \* \2 ~* i3 }}   K4 D; J* o( L1 ]$ x/ x

: g8 f- {- r5 z' v8 j4 F2 U
% T* O( |$ ~% ?9 P* IMyTime time; / F% }6 ?3 o+ f) Q! j7 j" L
void WINAPI wglSwapBuffersCallback(HDC hDC)
3 V, V( `" T8 E, L{
7 w4 B' @( d# j/ Z3 K5 p! m! H& x    time.draw();
7 J! m$ b; l7 C! y/ i+ p    wglSwapBuffersNext(hDC);
2 P& f% d- _4 d1 U& Z} 5 u1 I, m2 E3 A  G

/ L" j0 E/ o8 B. n" o# S1 Q% u你只要掛進去前呼叫 time.initial();
* ]* g9 y% t# ~1 @! O2 t/ U1 V" r結束呼叫 time.finish();
6 E, B4 g- k5 O2 s" E$ }6 b+ G- O5 l
' f& L1 {" S, l2 w
6 n; u* c$ q4 M
9 J+ `4 Q1 y8 [) C( J0 y2 t- E6 k3 c
& a% C$ h5 \8 j作者 : fushunwu(fushunwu)
9 \& R$ X" N1 t9 j$ m[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]   
' O( Z4 L' `1 t[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  
- J2 I5 W. {2 h. ?  d7 P2006/9/7 下午 04:19:31
& ^' v: ^  V7 s, Y* y! I& y% q1 h* K2 m4 K
謝謝. 但我還是有幾疑問想要請你幫忙,麻煩你了.謝謝 ~
. F' L4 P3 ^9 ~
0 B2 Q3 }, s. x0 F: D/ {(1). 因為我要固定放現在的時間字串和BMP圖在被我Hook的Game上面,所以我必須要知道那一個OpenGL的API是一定會不斷地被Game來呼叫,這樣子Game畫面才會不斷地更新. 7 E+ q5 R. f* o# ?% E
時間字串也才會不斷地被更新而BMP也會不斷地貼在Game上面而不會被Game遮掉.
0 o. q  o" x4 k- {像是DirectX Game中的Present API就會不斷地被呼叫,所以我只要把現在的時間字串和BMP圖放在這個API裏面就OK了.
6 u+ ]& T; d( F所以我想問的是OpenGL Game中是不是會不斷地呼叫wglSwapBuffers這個API,讓畫面不斷地更新 ? 還是有其它API是一定會不斷地被OpenGL來呼叫 ?
. z& G- S$ H/ D: g; e/ k! a+ O% t
! B4 R' Q! N7 s
$ F" D, V! [0 i8 Z. L(2). 現在OpenGL Game看起來都不是用Pure OpenGL API來製作,比如說像是用Glut
- C4 U* m8 j. z# ?    來開發,他們是只是封裝起來底層還是需要用到Pure OpenGL的API 嗎 ?
7 B/ n1 u- U3 ]    這樣我寫的Hook才可以通用其他非Pure OpenGL的Game.
' W8 W% ]  }1 n- k8 B2 n% P3 q/ L6 h9 ^4 y% E
(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
+ _+ r" l" B( T/ p* Z( O# Q9 j7 d* k8 {7 R6 p. x7 Q) b
* i0 A" n" s2 k! C  T- f5 Z+ S

, }2 }7 [3 Y( w0 \* J' J4 R: R- t- w

( h7 O$ [% S+ S" d& J# M6 \) z: I6 k作者 : dorkas(aming)
, @8 M1 P. d4 B( W, W7 Z  k[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ]    1 P6 D  F# s5 L: j! G
[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  % u, L% H( U. D3 X7 H
2006/9/7 下午 05:31:01 / A) I2 O& A8 N9 g# q0 m! s" d

: K: H' Z1 ~' _; M0 Y: n1&2
" m- [: A+ R% F/ y* m我對OpenGL不熟... ) \- A2 Q9 D4 ]

# m' L. k6 u. t+ S/ o  L0 c( S; |>(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
* s  H8 U+ o; o3 ^& {7 S6 U
: Q& T9 Q  h/ Y* t# Z3 C
: [( y3 t- e: ]" X7 N) J* I初始跟結束都是做一次的就好了
& @% o! z2 @5 _( K$ x$ g你高興要擺在迴圈裡面也是可以
8 v  {) N. m- \, \- X; N4 n
& f* ~4 E/ J# _4 m- W6 ?! t; |程式的要訣就是 起 承 轉 合
% H, y- R8 l3 y! e; b! k" J3 Qinitial
7 s% h& h! v; lupDate
$ B# ?: L% C! Q/ n) Gchange & f& y) R1 M5 ]  S( d) E
finish
" F% O, i9 i4 S7 T! V+ ]物件也是起承轉合 " j; ~1 i' G/ `! O; G! a
函數也是起承轉合 ' F+ I& x% T9 n# Z2 |2 Z
迴圈裡面也是 起 承 轉 合
" ~8 I% Z1 j: G) U) u# z
9 G3 q, H" {9 \/ k) Z1 X+ t4 c* w* F% U
for(起;承;轉)
3 V! Q- A9 D- i' }9 j{ 7 a8 l* T1 R7 O, U4 S0 `( a

6 d/ h6 b' ]: d  _9 x
: G7 o2 d& y; d; E5 U, t/ V% O
. J! }) s0 x0 Q- V' x& P8 Q' X1 Y0 b9 j0 _6 B" v( U1 @' R
} + n5 U- \% h+ }; c% w0 L9 x

) Y5 H( i0 b! P- v; h
7 p8 x' l& f6 @) s; X" F! e只要你分的清楚 屬於那一塊的性質就好了 $ ?$ w- V! w9 X& Z+ N! ~/ D" i
, C& Q# f0 H  X5 N: Y- r  \

! M; l" T, r; q; [; a& b* ~1 P6 ]) b" G. y$ ^7 z9 `& W* _+ X

3 }- @# h1 [" L( R/ U( V
2 A3 I6 S* I; }* {作者 : fushunwu(fushunwu) 9 e8 t8 T1 r5 ^" t, R# |
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]   
+ d( `. `5 D; T( _  U" g4 K  {. v! S[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  
6 ]$ b5 _& h2 y( `; @2006/9/8 上午 10:32:26
$ N: r: t4 s3 ~% J) F/ F: M8 S! q! E2 X0 H! M  b
恩,還是要謝謝你,目前問題還是沒有解決.Quake4和CS 顯示的狀況還是不一樣~ + Q' h9 X/ }4 m5 D4 q( }- k( c

. h2 o& z7 K) a' ^. y像是Quake4這個Game它就沒有使用到glBegin這個API 所以我hook不到glBegin
1 I/ I/ |0 D1 _) v# j所以我就把顯示字串和BMP圖放到swapBuffers裏面去做,字串可以正常顯示但圖秀不出來 ) T) z) l& w3 |' ?+ L. `
我在想是不是因為座標還是矩陣的問題 ?
8 E5 `* a/ j1 o$ B# p3 V- ~5 M2 L6 k0 y5 E5 N* }
但是CS放在swapBuffers圖和字都顯示不出來,但是因為CS有用glBegin所以我就把同樣的code放在glBegin裏面,可以顯示字串只不過會顯示很多個,我在想是不是也是因為座標還是矩陣的問題 ? 0 @* I$ s( D9 \! e7 b
至於BMP圖在CS片頭時可以秀,只不過會秀滿全螢幕而且是顛倒的占滿整個畫面. 1 Z  I" ?; e/ G: q+ D3 u

" U# {. o, c! }: h( ]所以我才想說有沒有一個統一的方式可以讓我把同樣的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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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