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

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

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

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

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

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

这篇文章的一些思路和我的某些思路类似,留待以后参考。
# w9 H0 i( }# W9 y建议还是看原文,比较清晰,为防止原文失效,贴一份在这里。

) `' E. x5 [- d1 s, N  ^2 q9 V8 @% K' w
原文
& t+ x3 T8 e7 G, e. p" Y6 T3 K5 Ghttp://www.programmer-club.com.tw/ShowSameTitleN/opengl/1654.html % U" {% U9 `/ W) d) V% Q6 n9 b$ @4 j* P
; i; k6 d9 M$ [1 m
大家好,
2 Y2 P6 e5 R, q: w
9 @7 h% K. }& H& r1 \/ ~我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable / f  G! L/ @2 r' I" E
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....   _3 Z8 ^' W2 H( d* |9 ?
) C; w5 C1 R$ Q+ ~
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個 4 k# P  c, L- a
    但是BMP圖放在wglSwapBuffers卻顯示不出來 5 C5 o. ]3 k0 {, w+ w7 T
(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一 0 {4 y* q4 J! \- W5 m9 O
樣的時間字串  5 e- _& F! T8 A- L+ t  ~$ V
% H- r; U# \( O; i
! g" x! w& p# G9 o* M! y  ^) ]

+ g4 u1 e  d) _- w0 V) z9 i/ R作者 : fushunwu(fushunwu)   f6 s9 l. y! G+ }& C0 ?, F
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]   
- b: i+ Y9 h1 d9 _+ A: P[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  
3 m* z2 [3 L% n. e: J7 |8 H8 L: x2006/9/5 下午 03:21:34
% C( w5 R+ T8 ?
. q8 Y* S8 [% z; R3 Wsorry,按太快還沒打完 ..
! \# H6 V" D) J6 u& W5 G2 h2 `' c" Y- k1 E
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
- B2 x. w. M1 s* C7 k,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....( 我使用MadCodeHook的API) 6 @" ?4 Y; V4 B/ I6 [2 {

( G2 @- r1 I- `5 A% P3 k: |(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個. 但是BMP圖放在wglSwapBuffers卻顯示不出來 ( m$ N; c7 d6 l+ @4 \6 ^
(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一樣的時間字串 ; BMP圖放在glBegin中中在cs片頭中還可以顯示,但是圖會顛倒而且會占滿全部的畫面,進入game中再開圖就掛了. 7 F; v$ A: m& i' i$ n2 T) U

% s* i9 G. `! \8 f* N& L5 U6 ~想請問各位高手,有沒有一些好方法可以解決 .
3 l% O% G5 H+ Z9 f; c8 p" s' r- j: g9 l
下面是我hook opengl API的code :
' h/ ]' ?5 l: C6 K$ [3 I7 i1 c$ S// hook wglSwapBuffers的code; hook glBegin的code也一樣 % X0 d; t( S9 W/ a+ w
void WINAPI wglSwapBuffersCallback(HDC hDC) 6 l! k: v1 F; v) `6 O
  {
( c4 t( |; F, [& O  k" Q  M+ E1 n" G4 w$ @% _* i
if(!ininstializedfontshit) - F1 i; @6 |% G$ H  z: q1 R6 g5 b
{
& E0 _- W* y% K0 g: Q- c: a: b: Qfont.InitText(); 7 o& E( }7 |& f: A6 T
ininstializedfontshit=true;   `6 D. J0 t& p$ m3 V0 r
}
3 D( u& ?+ y: {) W3 {2 b7 X8 i5 B
  R( f; H) Y/ x- w, i  SSYSTEMTIME SysTime; , ?, B" r, g+ ^1 u2 z
GetLocalTime(&SysTime);
+ }; U# G8 Y+ L* J6 f' [8 y$ tglPushAttrib(GL_CURRENT_BIT);
  F" p1 F/ w* ?! S8 @5 c    // 顯示現在時間的字串
5 z. k$ [- K% A# o9 W2 D" ]font.Print(140,125,255,0,0,0,"Time: :%:%",SysTime.wHour,SysTime.wMinute,SysTime.wSecond);
2 C8 T$ B+ h- y& M, u7 M) P
! w5 B) F4 [% K, V! }    // 顯示BMP - ]4 L6 q! f& {% ]: C
7 O4 p$ @/ {. Y) a8 E. N
    byte Texture[]={IDB_BITMAP1}; 4 K. }. P( b2 j
    glGenTextures(1, &texture[0]);
$ k' T% s( W( h" L2 `hBMP=(HBITMAP)LoadImage(gl_hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0 , LR_CREATEDIBSECTION);
9 j( t- D; i% u; f
0 `* h& M) U1 A- o  b& Q9 ?; @) ?if (hBMP) // Does The Bitmap Exist? 8 U# n8 n! K3 I3 i& K* q4 c
{ // If So...
8 {4 M3 I0 h# O/ p% NGetObject(hBMP,sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object 5 U7 P: h1 i% b7 ?+ s( j& J/ U
// sizeof(BMP): Size Of Buffer For Object Information
1 v' _: y0 w# W: n% @// Buffer For Object Information
! k' ~; v( f( _: D; oglMatrixMode(GL_MODELVIEW);
5 w, V. y. H( G8 M- q& nglLoadIdentity(); * B- h* C0 A+ B/ m
glTranslatef(0.0f,0.0f,-1.0f);
, n" }  n: B  vglPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]); / r; i1 Q8 [+ m' C
    // Bind Our Texture - ^, l' t$ P0 @9 Y2 h. w, @. P
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST ); // Linear Filtering   Y5 [6 Z8 g# x! u% y5 H( D
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Mipmap Linear Filtering + |$ S, c3 g' s+ K
% K: J8 P1 [, b, h  i
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, BMP.bmWidth, BMP.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, BMP.bmBits);
8 t# B# k& ~) z1 R9 RDeleteObject(hBMP); // Delete The Bitmap Object ; l) p: c& Q* B; d# i, E9 R
}
& V3 C. v- H% _8 @% v, `4 K# K2 M! bglPopAttrib(); & o9 p/ ~( h6 ]8 \& G/ ?
" J# Q8 p5 S$ U4 w

+ C1 h3 ~5 o3 f8 t$ J/ O2 n5 U} # m5 }3 N; t0 p, V- r3 Z9 S# g
wglSwapBuffersNext(hDC); ( v/ y* s, Z( N0 z+ m* U+ k
}
) `7 Z) Y4 y2 y6 L1 j# z4 o6 s* _  d) ^3 J
8 n- d# T2 i, M9 z- U
' b* k) j# f1 {4 u
/ @/ H, v  {- `1 k9 |" O4 X
" n# ~: Z8 \. r+ k0 g% U" X
3 j+ e; A6 K- c+ F  ?$ |7 `
作者 : dorkas(aming)
* {& p. S& d# z7 F[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ]   
+ ]$ |7 y# J( i# V[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  $ u2 B  Z: w" n1 s. w& x5 ?6 q
2006/9/7 上午 10:30:03 * ]& i: ?; v. b4 a

6 _& n6 c% |. @/ o: G9 h; f1.貼圖動作錯誤 8 [2 C/ R5 Z7 M8 K; B( V

5 l4 u+ S/ I& Y! {9 [; I  D2.
7 ]8 Q+ W* C: @! H每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡 & T5 J3 |% f- Y
7 [' \- o; N2 H/ Z: K  d; l- t$ M

! g" B8 w1 Q. o4 A- G: estruct MyTime   _; k( X; `& K3 d+ C
{ / `6 P- \5 ], _  ~, `
    byte Texture;
  b! X; d% U+ c) n/ G1 F    FontGL font;
) W4 X# s; \  j' ^! q# E    void initial(void); 2 _8 k* L. v" ~+ i
    void finish(void);
  X4 F5 t, u' r5 [' z( g; ~    void draw(void);
% x6 m# Q0 x5 y$ ]" W" I! x};
, n' a; s  x# Ovoid MyTime::initial(void) ' Q" B0 d: L; p! p6 C
{
, f8 b! ?: y6 z" R7 {# {    // 載圖 初始字型 * B- X! M- o8 Y' P2 q
    font.InitText();
( I$ P9 I% f6 C( c  glGenTextures(1, &Texture);
  P4 n, V! A" y6 \} 4 X' q1 j$ }+ ^/ D$ H7 \+ n
void MyTime::finish(void) ) A5 S+ w( {7 e+ {* g+ u0 ?' k
{ 0 ?0 Z5 y3 c9 I; ?% b1 Z
    //釋放圖形 字型資源 8 B3 D$ t2 r+ q* q' P; ]
}
+ h; v! x7 j# Z4 n& t/ {3 q' x+ E4 T( h/ M6 j7 G6 O
void MyTime::draw(void)
! J: s' U  @& Q( }  K; n{ % ~8 \( \5 z; e2 m3 j  `9 ]
    // 顯示現在時間的字串
9 W- v; K$ ^) Z, |( Z    font.Print(......something...); 7 ?' p3 M$ R% q* a4 a( L
    // Buffer For Object Information
' r9 p4 p  e  C4 I$ B    glMatrixMode(GL_MODELVIEW);
% j9 [8 w/ \2 B; h. a    glLoadIdentity(); ( E3 N5 I9 n. _! b8 w; |! S. b
    glTranslatef(0.0f,0.0f,-1.0f); * P& i) F) H4 C5 s2 L
    glBindTexture(GL_TEXTURE_2D, Texture); 6 r) _' k; ~' L5 k; o1 B- \
# F( Z) d4 v; i
  ..... DrawSomeThing
" I0 J9 Y( G6 x1 I    * r5 ~# Q  ~, p) i5 B- A4 |: j
} 4 Q, v8 T' s2 S8 b

% @' o* I, Z% v! X- c- ^" I8 U' D2 ^6 b" X
MyTime time;
) i+ M2 d( ~/ d3 v5 z8 Xvoid WINAPI wglSwapBuffersCallback(HDC hDC) ! K7 g* T$ [& x
{
# X7 h9 |8 N" c6 t. s$ `    time.draw(); & {" z6 ]$ |2 X! L7 T% [4 _3 S1 ]
    wglSwapBuffersNext(hDC);
! _0 N1 E, v9 p, X- H' ?}
4 g0 c$ i" v+ n1 w; J. P8 k* W7 @8 ^$ I9 ]
你只要掛進去前呼叫 time.initial();
7 u' u1 l/ P; N$ H6 X4 G0 q結束呼叫 time.finish();
' g* ~% @$ v% s8 P0 d. |' C. [# s+ U  E5 D6 ^% N' ^2 r# }
6 f& I- r& s" P8 `
! ?: \6 x' q' e) A8 R% g% i2 o. [% _: T
! v- B/ e$ D3 `" A2 w
作者 : fushunwu(fushunwu)
2 g- p9 @' S9 k" B$ L2 \3 N5 B[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]    0 D( V3 B9 O: [5 m! T4 t8 s
[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  
# B: q' Z5 X$ g: d* q2006/9/7 下午 04:19:31
! Q+ G1 V7 w! ~9 G3 R, D
6 A9 T0 |  V/ I謝謝. 但我還是有幾疑問想要請你幫忙,麻煩你了.謝謝 ~
6 z4 C5 q. g* L! F' S- C+ [: x/ a! y6 D' ~& s1 L1 G' S
(1). 因為我要固定放現在的時間字串和BMP圖在被我Hook的Game上面,所以我必須要知道那一個OpenGL的API是一定會不斷地被Game來呼叫,這樣子Game畫面才會不斷地更新. 7 S+ q1 \2 L% h. R% X4 F. V# g% Z& j
時間字串也才會不斷地被更新而BMP也會不斷地貼在Game上面而不會被Game遮掉. ' u+ e7 }' A  Y) {; M( P6 P
像是DirectX Game中的Present API就會不斷地被呼叫,所以我只要把現在的時間字串和BMP圖放在這個API裏面就OK了.   q: ^  J3 }4 h. T* x
所以我想問的是OpenGL Game中是不是會不斷地呼叫wglSwapBuffers這個API,讓畫面不斷地更新 ? 還是有其它API是一定會不斷地被OpenGL來呼叫 ? ' M, G0 t, L/ X1 Q4 e' v
: k2 }1 E/ \4 N& e: T% w1 X3 t
( Y( C* |! m  e1 W8 I
(2). 現在OpenGL Game看起來都不是用Pure OpenGL API來製作,比如說像是用Glut & [* Q0 c1 N7 B
    來開發,他們是只是封裝起來底層還是需要用到Pure OpenGL的API 嗎 ? 4 w) f# h1 j( z
    這樣我寫的Hook才可以通用其他非Pure OpenGL的Game. 2 o$ `9 y' o5 q" M1 `+ ^) p

2 u6 ]! R+ u; J0 _* _(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ? - {7 T! R& q9 B& y8 Z
, Z; n6 D1 r4 N. s7 |
6 I) V4 _* R# y/ X* h5 R

% K# H) {! @( R4 i1 _8 F$ a. e. p
+ Z  f( ]7 Z7 e0 r1 S; c
作者 : dorkas(aming) 8 s/ Q; k- j9 {; g
[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ]   
" _6 v, _' E) u9 ^( j1 j- n' h' U) ?[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  " H3 w( F* b1 t- \4 J6 v
2006/9/7 下午 05:31:01
' E3 o& Y  v* @5 E. j
$ v9 b1 _8 @3 M9 b6 h# ^8 m- y7 P1&2 ' J5 x. z6 R- M, J) a( f# c, \
我對OpenGL不熟...
% @- v9 i$ |/ w$ _: m$ I9 k! l1 _' c* D
>(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ? $ n$ j% t/ E$ F( K( ~" ]4 M8 d

4 a* K8 _0 r8 c& o# z! m6 r0 a# t
初始跟結束都是做一次的就好了 3 f( ?, J  t# g7 J5 [
你高興要擺在迴圈裡面也是可以 4 n: k! N! e. B8 y! @% a
' S: k, F0 j( }0 `  ?
程式的要訣就是 起 承 轉 合
, x" ^# o" |& o& U- e6 winitial ) @/ {- r1 @( q+ j6 Y- @" }
upDate
7 e* U5 M8 B/ Y# K* Tchange . I" q1 h. n% c: Y
finish : L2 j/ ?, [3 W  f  y1 O
物件也是起承轉合 $ n1 Z: O! T( G6 u* `, F
函數也是起承轉合 6 y& r' ^9 I0 i. B
迴圈裡面也是 起 承 轉 合 % m5 y) e- c5 G

3 N. {" Y- ~% X% _0 t" K$ |. A1 i
' |7 T: p& `* pfor(起;承;轉)   |, ]# ?% |+ J" U: C
{ 5 c( q) X5 v2 S4 \

: m, s* C9 b% I* _! W: E& @4 X' h( A0 w4 w, N
8 ^) q* |! f$ g/ _7 o* y: L+ R! U
. x& N6 J1 K9 r2 ^! w
}
- {! i# t" Q% B/ t7 G
5 k$ H( K" b8 T$ Z( ]0 Z; \! Y4 g( X/ `% O) q5 A* F5 E  A
只要你分的清楚 屬於那一塊的性質就好了 + }' k; ~  ]4 h2 c* h$ K

0 _9 x) q8 I& n# q8 [5 I$ a8 a6 `) h, b. s( C* Z
( Z( F# \2 {2 Q# ^- d
. W+ h+ L8 ]0 l4 ~

  r% n6 o6 `. c) }% q% o作者 : fushunwu(fushunwu) ) @8 @  y+ ^$ z1 |* b
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]    & L9 ~! f8 U  o& i  V# h1 r1 ~! T3 }
[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  
! `7 w& ^  v; o2 @# O/ k9 t# @) ^2006/9/8 上午 10:32:26
$ I8 ?4 e) J- a0 u- ~
' y( N1 Q' o2 t0 N- H1 R恩,還是要謝謝你,目前問題還是沒有解決.Quake4和CS 顯示的狀況還是不一樣~
! f0 M4 A% M2 K2 a; ?: u* e+ F: o* U& O9 Q5 n/ Z7 M
像是Quake4這個Game它就沒有使用到glBegin這個API 所以我hook不到glBegin # @0 `( w; M+ I' q- w
所以我就把顯示字串和BMP圖放到swapBuffers裏面去做,字串可以正常顯示但圖秀不出來
" L8 C0 E* H) d3 A4 }我在想是不是因為座標還是矩陣的問題 ? 7 J+ m4 f9 Z  e0 J( [1 n( {2 \1 A
( D0 ?* v; W; Y; Z5 s& Z* i  ]" u& T
但是CS放在swapBuffers圖和字都顯示不出來,但是因為CS有用glBegin所以我就把同樣的code放在glBegin裏面,可以顯示字串只不過會顯示很多個,我在想是不是也是因為座標還是矩陣的問題 ?
8 H0 s8 Z: E; C% X至於BMP圖在CS片頭時可以秀,只不過會秀滿全螢幕而且是顛倒的占滿整個畫面. . ]: Q/ d# L( ?9 O: `
5 k6 A& E3 \# R4 u
所以我才想說有沒有一個統一的方式可以讓我把同樣的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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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