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

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

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

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

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

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

这篇文章的一些思路和我的某些思路类似,留待以后参考。 : b: G5 n/ U% M$ r2 b2 M
建议还是看原文,比较清晰,为防止原文失效,贴一份在这里。

' k% W% o7 K" m8 u" L$ W$ _. n3 j, v7 c/ }
原文 3 S$ `# S( }3 p# i
http://www.programmer-club.com.tw/ShowSameTitleN/opengl/1654.html
7 L+ }1 }; y3 k7 W3 [5 l5 t& K; ?# d3 s2 |: f( j! V! c8 U$ w
大家好, ) ]8 a# }. T9 ^: u$ {4 o% d4 N- a
9 O) i$ E, j  r  i9 [
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable . \5 n/ `2 s; l# J% X! Y& w* p; P
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....
6 l$ n# r  Z6 p: j; Q( c& t: b; k
/ ~% _$ @  w% R: V- z2 Z(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個
' E# z  y5 V6 u/ M2 ^    但是BMP圖放在wglSwapBuffers卻顯示不出來
/ @  F6 O. E8 y+ }3 N+ @(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一 , t1 K5 g2 e' |5 m6 t
樣的時間字串  , d/ j4 W+ b5 H
  b/ X- g  ]5 e( q# }( H

$ A; O6 K" Z" b' V2 H; F# a) m/ V- L" @0 ?+ ]$ f; E* F1 v
作者 : fushunwu(fushunwu) * s9 A: B, ?  y
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]   
( o, ]! Z- r7 y% O, x7 ^! d[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]    z, h  [( r4 g& i
2006/9/5 下午 03:21:34 / V, G( J* k7 \% w& p9 a. t6 V

% f6 N8 l7 V2 `! m& ysorry,按太快還沒打完 .. # g% S' S9 z( R; k1 K
; e# L; u. n* ?# @
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
' ~* O, Q2 ?4 P,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....( 我使用MadCodeHook的API) $ d& S3 P; A  a0 `, X
* W$ q4 E% P( T: o- P2 _, `! x; a
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個. 但是BMP圖放在wglSwapBuffers卻顯示不出來
" [6 \& z3 _7 H; `- I1 p) @: y7 B(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一樣的時間字串 ; BMP圖放在glBegin中中在cs片頭中還可以顯示,但是圖會顛倒而且會占滿全部的畫面,進入game中再開圖就掛了.
0 l5 [4 b% L. T) ~- ~5 ^
3 \( ^' R, y& e% w, x. G想請問各位高手,有沒有一些好方法可以解決 . ) E3 }5 j$ p, q7 u; w( i% ]( N: \
7 g" u: ]" ]7 Y9 y/ T6 ~0 D4 t
下面是我hook opengl API的code :
4 Y9 N  b' I6 i) m) H  R// hook wglSwapBuffers的code; hook glBegin的code也一樣 ) {. \, t, p( s; ]
void WINAPI wglSwapBuffersCallback(HDC hDC) - |8 f" H4 h! z7 C
  { 3 D- ^, q  e, \% _3 e: |

* a: V' L7 i8 n) S/ j" Y' [& Vif(!ininstializedfontshit)
2 ?/ S% w* ]# ^{ / `( }: d/ y6 ^
font.InitText(); ; H7 K5 I! |( Q% w2 Q/ r9 a
ininstializedfontshit=true;
3 F# o+ n& k) ?- C+ t}
/ p3 y. p  w6 q+ N' x/ x
. Y/ R, c$ o4 w  A/ {& RSYSTEMTIME SysTime; . M$ W7 [: y& q
GetLocalTime(&SysTime);
4 z; ~) k* B  t, d/ c6 oglPushAttrib(GL_CURRENT_BIT); - @$ t" z' K/ R( B- u# ~" a
    // 顯示現在時間的字串
3 R/ L% g$ h+ N+ l# |: V, ~3 R' bfont.Print(140,125,255,0,0,0,"Time: :%:%",SysTime.wHour,SysTime.wMinute,SysTime.wSecond); # Z0 g( x/ Y+ I

2 w: x7 @5 Q5 D1 \" W7 u3 u    // 顯示BMP
* k9 N+ {. @6 b; |3 @7 L7 b/ d
: v5 `" e. Z# A6 i) W  z    byte Texture[]={IDB_BITMAP1}; + w* d  L+ Q; s
    glGenTextures(1, &texture[0]);
6 a7 u. K9 w9 c3 p; G2 `hBMP=(HBITMAP)LoadImage(gl_hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0 , LR_CREATEDIBSECTION);
1 Z9 y8 U* [- M, _3 o
/ Q3 x% m  h/ `; B2 Y+ _if (hBMP) // Does The Bitmap Exist?
' e  @* D, H1 z) @! |{ // If So...
( Z4 q, u. J4 L1 f; L5 j5 xGetObject(hBMP,sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object
% x) Y: q9 ^3 d  \% V6 \// sizeof(BMP): Size Of Buffer For Object Information
1 m; g3 @/ l" X0 i0 G% @// Buffer For Object Information " U: p( s( l$ n$ Q& j  b- U
glMatrixMode(GL_MODELVIEW); ' e4 c9 i8 s% i& C) l( r9 B* N
glLoadIdentity(); 4 B6 W4 K4 ]$ Y" o6 X+ m
glTranslatef(0.0f,0.0f,-1.0f);
2 Z; O" b. d  I5 r! [. b: uglPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]);
0 s, |: `+ b$ K0 q    // Bind Our Texture
: |2 z9 u% \- g7 d  F+ B) o, ?    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST ); // Linear Filtering - Q/ I/ H6 G* ^! ^* I
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Mipmap Linear Filtering
$ d) V6 C1 c6 ?. `& A7 Z1 H$ y2 N: y. A* p' P1 ~
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, BMP.bmWidth, BMP.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, BMP.bmBits);
, ~) j9 H" q  `" F* nDeleteObject(hBMP); // Delete The Bitmap Object * ?, R% u/ k. h  u# A
}
9 A0 M7 W6 s' @0 {( t7 d4 b: @0 HglPopAttrib(); * I6 X' z! D' `4 A: g

! g8 Q: \1 |4 z5 S* b0 J* u9 Y# n6 M* w6 [
}
9 i1 _) w8 d7 I' s- ywglSwapBuffersNext(hDC); 7 b1 J1 y$ y7 k3 \
} 8 H3 X; H0 E0 |: w: g5 D, n! s

. x+ e% P6 L6 d9 K5 y; n( A7 ~2 |4 p5 r' w% w
6 O3 P8 r, [/ t; e* L

/ i4 d! I& A$ o3 E) }# p5 @# Y3 ~
1 Z5 k3 o* q- i5 V
4 I6 _0 T8 l+ ~0 X: F7 |5 V7 u2 P6 a作者 : dorkas(aming) & K$ \' B, d0 v" t$ k2 |& Z
[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ]    $ U! b& C  N; J% x4 ^5 L
[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  ( j8 @0 `# x4 t* d* K! m
2006/9/7 上午 10:30:03 3 C' x0 g9 g4 z$ O: V* `  p
' r9 F& a5 n8 x& a. M2 w" e
1.貼圖動作錯誤 9 g' {' N3 I' ~; C# F+ {
  o+ R0 I! c: e; |! `, p! M& }9 Z/ f
2. * O+ i- ^3 O! {* W* f) e
每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡 0 `( q- L8 d* E  n; Z
7 i! o: S. ~- c
" f- {: |9 T1 g! ^
struct MyTime
' Q$ h' T3 \' ?4 O1 c) D' Z" W$ q{
3 r8 L5 ^( D- k' u4 Z+ ]9 b9 m    byte Texture; ' I. z" b. Y& L, G- K
    FontGL font; 9 Z; T. l$ F" w( `1 ^! k4 \% G" r9 j& L
    void initial(void); 0 ~( u: V/ y! a; V  Q8 X$ e
    void finish(void); 1 I( L- X- {! @# i. o
    void draw(void); ' R3 l& J! m1 L" Q! }" A
};
8 P- E7 G4 ?  H( K  Vvoid MyTime::initial(void) ! j5 G+ Q; f6 |8 w! C$ q, K0 G
{ 1 h2 I! u7 h; Q4 ^
    // 載圖 初始字型 / [% v. q7 C6 }0 Z6 n
    font.InitText();
4 s. T9 ]$ U/ Y  glGenTextures(1, &Texture);
( q, Q; F0 u4 a6 e1 }! Q} . |! y% @- N( |0 P- {4 o$ I
void MyTime::finish(void)
% `8 [0 s' j4 I, @2 W  M{
; L5 M1 n7 T- V7 x% R. D- Z    //釋放圖形 字型資源
+ o/ R" a: x6 s% I; K} , |- f9 E8 C# ~8 m' Z3 q
5 @9 |" Z7 s& [, J, G+ C6 n5 g! r
void MyTime::draw(void) * V3 l- M2 r# e- t
{ ; ?; v/ e1 R2 G* J1 M
    // 顯示現在時間的字串 9 Z* v; e/ Y- x8 T
    font.Print(......something...);
5 u7 b- X: H$ L6 v0 G' H    // Buffer For Object Information
# q) r, T  h/ M0 v$ P% F  y- S) s    glMatrixMode(GL_MODELVIEW); ' W8 J/ n1 K& V) B8 c
    glLoadIdentity(); . ^6 K2 l" _- q  j5 _1 _) {7 V
    glTranslatef(0.0f,0.0f,-1.0f);   o& m' k! R+ h
    glBindTexture(GL_TEXTURE_2D, Texture); ! q" y  q) b3 x+ Q: B" r
- R" |/ B3 _9 O
  ..... DrawSomeThing
" J8 v9 G1 u3 x    3 f  M) o' e: R4 |4 ]* E
} ! n" i+ Q6 g; R0 l* C  Q: T

$ A3 N3 d3 [1 n. ]
  y- U& Z" Z: U) OMyTime time; 1 a4 C! ]" x2 ?8 t9 }/ C6 ^
void WINAPI wglSwapBuffersCallback(HDC hDC) % {) X- n# ~4 e* W  T  ^
{ ! N* A0 O0 [+ x0 E+ M
    time.draw();
7 F5 U" ~% U% O2 Y' t) o5 J    wglSwapBuffersNext(hDC); * B5 U* f) t2 I3 t8 T3 p' O, t( s$ q  C0 t
}
7 Q& @9 u# [, O: F* g6 T  f1 h6 S; S4 A  S
你只要掛進去前呼叫 time.initial();
1 w6 s& I* c3 z2 y/ ]$ q3 ^, R: t結束呼叫 time.finish(); 8 B3 k% a/ w) Z- ]% _

4 z  b% x7 N0 V; p* S. _6 C1 `$ m8 J0 [: [; R: Q: S* M

& ~$ V% _1 P! c$ P0 a+ F+ ]$ V7 d! R% h
作者 : fushunwu(fushunwu)
* ?$ @" w- x) E6 B& y4 D$ V7 _[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]   
, G. Y* A+ M# D! p* D  X' J[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  0 v4 p  M7 K# L- ^- Q3 q+ r  c
2006/9/7 下午 04:19:31 4 q6 t" B3 P* z6 r# h
; Z; ^7 E( U8 y6 r8 R1 y% c
謝謝. 但我還是有幾疑問想要請你幫忙,麻煩你了.謝謝 ~
7 g2 a/ X; F4 D8 r8 k
9 h  G3 b& N+ n# v4 G6 G3 Z(1). 因為我要固定放現在的時間字串和BMP圖在被我Hook的Game上面,所以我必須要知道那一個OpenGL的API是一定會不斷地被Game來呼叫,這樣子Game畫面才會不斷地更新. 4 b5 j  Y# l) J! b$ M5 ?6 g
時間字串也才會不斷地被更新而BMP也會不斷地貼在Game上面而不會被Game遮掉.
1 C1 z4 d$ C$ g& J, ?像是DirectX Game中的Present API就會不斷地被呼叫,所以我只要把現在的時間字串和BMP圖放在這個API裏面就OK了.
9 n/ y2 z. u9 d3 I$ x5 m所以我想問的是OpenGL Game中是不是會不斷地呼叫wglSwapBuffers這個API,讓畫面不斷地更新 ? 還是有其它API是一定會不斷地被OpenGL來呼叫 ?
# K0 w  C& k5 j( k2 u/ {2 e$ w" V# c! C: T, I9 w

9 L/ x! U' \/ n4 G(2). 現在OpenGL Game看起來都不是用Pure OpenGL API來製作,比如說像是用Glut : i* ^0 r( _' Q4 T' f  k
    來開發,他們是只是封裝起來底層還是需要用到Pure OpenGL的API 嗎 ?
$ e# H2 r# J. }7 h& F! G% x) h  _    這樣我寫的Hook才可以通用其他非Pure OpenGL的Game.
9 e! M$ J. v! K+ @- {; a
6 S$ e" d* B! N(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
& ?- D7 L4 L! o3 N1 X4 C2 ^5 G
5 M! a4 F3 J5 O
6 H- z, e7 t2 C; x+ s; O. u4 Z2 l8 r5 j' M6 m& t7 i

' L6 m1 |! @8 i1 e: D0 [
# F( J( r4 U% q4 ?# o0 v7 R1 F作者 : dorkas(aming)
3 T: c# ?) V: r! m( [[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ]    & g/ b8 @: S8 |
[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  
" f2 A; o$ E' {/ \- }2006/9/7 下午 05:31:01 " T. H9 r' i) }- z  a

; O/ h- Z) L4 |+ _% O1&2
$ d( N4 h9 \( M% I2 R% _我對OpenGL不熟...
* O! d* S5 [& U+ U4 i
) m5 T: r) I* K# D$ y>(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
% Q% C) V+ `  b0 q6 K6 }: Y. w  g5 Y

, @/ N: ^) q! N. Y$ G初始跟結束都是做一次的就好了 7 M' W5 u+ g4 V9 V  S. h# d
你高興要擺在迴圈裡面也是可以
+ ^- l% @! S* ~$ |
" r" [7 J2 W5 z4 n% H; C5 V程式的要訣就是 起 承 轉 合 3 r5 n5 d* U3 z4 q1 m2 r3 u
initial 1 b1 N$ O+ I! x4 C! s* r6 i+ B
upDate ) L9 `0 `. G9 f* y- P! @- ]' G% m
change
. l; r* Q: B/ @& a- Ofinish
) N( u6 m& M7 X! N+ A. M1 Z物件也是起承轉合
: L& z+ r/ O4 q. y- @: m6 c函數也是起承轉合 ) H7 E4 k2 Y3 @6 N, T
迴圈裡面也是 起 承 轉 合 2 ~* W/ @1 |' p$ h# `8 L% g
3 q2 `+ f, O7 s& M

! ~% l# g5 S# Q+ c! d! U2 xfor(起;承;轉)
( w, S% ~' h! W  o6 Z{ # R. t) d9 z* [0 \. i
' z% E* T6 L" _3 F% j3 s/ C) D1 ]
2 v6 l4 K' g3 A
- ]9 C& F2 Y& J& h
% y; h; [  a$ V4 l% R3 v) s0 Z4 X
}
! B8 d& L- P' @8 Q# b
/ f1 r; X7 N- K# U
: P6 x* C* S1 R8 S; {0 C只要你分的清楚 屬於那一塊的性質就好了
" n1 o6 k, k! a. g" w6 k1 @6 s
5 u. @% [' q) I: L! ~( ]0 |5 _/ a" i0 i% H- d! s- t

2 Z" |6 l0 U* g* U$ n
% p  g5 E9 c. x5 P1 E) }$ ]$ O
* ^6 C! J# s6 S7 v" V作者 : fushunwu(fushunwu)
+ G: P' u" K$ u, ~! y5 f[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]    ) @# N6 A8 V' O2 U4 U, A
[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  
9 ^2 g2 _& h, k/ _) v# j! ^6 @2006/9/8 上午 10:32:26
% @% z9 `/ t0 o: o0 o
5 r. t( X! [% {7 L; w- \恩,還是要謝謝你,目前問題還是沒有解決.Quake4和CS 顯示的狀況還是不一樣~
: i- O: X+ z% c8 G) U9 Q' |; K
  }. k- N( d+ S; @; i" A像是Quake4這個Game它就沒有使用到glBegin這個API 所以我hook不到glBegin
0 q. o, ^. R* M5 L' l' e所以我就把顯示字串和BMP圖放到swapBuffers裏面去做,字串可以正常顯示但圖秀不出來 6 G, Y( ]- H+ i* `) q
我在想是不是因為座標還是矩陣的問題 ?
& z7 G8 v( E7 b1 G0 t
/ z& U) @# i% g- z7 t6 N但是CS放在swapBuffers圖和字都顯示不出來,但是因為CS有用glBegin所以我就把同樣的code放在glBegin裏面,可以顯示字串只不過會顯示很多個,我在想是不是也是因為座標還是矩陣的問題 ?
# f; q7 q. w# @! O) [) a9 h' L至於BMP圖在CS片頭時可以秀,只不過會秀滿全螢幕而且是顛倒的占滿整個畫面. 4 O0 C8 p! {* \9 |% w- K# @" T
( _2 f! ]9 \8 P, E/ E1 O( W9 ~3 c
所以我才想說有沒有一個統一的方式可以讓我把同樣的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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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