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

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

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

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

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

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

这篇文章的一些思路和我的某些思路类似,留待以后参考。 ' O( e5 H( Y& W6 c; n( R
建议还是看原文,比较清晰,为防止原文失效,贴一份在这里。
9 ]" \; o% ?( ]! P
5 ]3 ^# I( o2 m/ S. `# f* M
原文
/ L* u# J" I6 Y  e' d/ j. T4 y+ {  ^http://www.programmer-club.com.tw/ShowSameTitleN/opengl/1654.html 7 Z: t' Q0 L8 e7 S3 o% E! V+ Y/ }

# ]( X! |1 c8 v. c! [大家好, ( C) n$ h2 ~4 [7 h. t
. ~$ l, E0 j8 I1 j5 V0 p1 Z
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
1 B1 P" i6 T( g2 X+ u- Y; ]! C1 i,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣.... & ~0 e+ n7 Z6 K$ g: k
/ n6 ]7 a1 a/ v8 U
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個 ) m6 g: d! N8 S$ k
    但是BMP圖放在wglSwapBuffers卻顯示不出來
1 j+ `. o8 s& g" l3 i(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一 ; ^6 `2 O; U& E; r4 `. b. X2 L
樣的時間字串  
" o5 v, S! U& ~' Q/ i) [* T/ ?( Z
' ?; o0 Q8 U9 U) U  }' S; C4 d
9 A" k, h( i; Y. l! Z7 I' m9 J2 [
作者 : fushunwu(fushunwu)
/ ~* Z0 Q! Q& ^# G  M* v[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]   
" c6 r/ N! A) c  u0 F4 a  b[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  # A8 A. K( b1 Z/ l
2006/9/5 下午 03:21:34
( S/ s. Z( d3 S& ]( e' X5 |1 b" u) G& A  V: Y9 t4 P4 r
sorry,按太快還沒打完 ..
( m0 Q2 Y& F% {* g# G& @
2 O+ C" O: S; e" U$ t我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable $ a; ~8 w5 g- C* J; z9 u
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....( 我使用MadCodeHook的API)
; h4 |  @# |8 I3 a7 m: t/ d8 x" Z8 B- p$ N# {' t
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個. 但是BMP圖放在wglSwapBuffers卻顯示不出來 " X; Z8 \+ x4 \
(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一樣的時間字串 ; BMP圖放在glBegin中中在cs片頭中還可以顯示,但是圖會顛倒而且會占滿全部的畫面,進入game中再開圖就掛了. ( C" x8 Y! S4 G+ ~6 F

: E# O3 O' C6 \& R0 Z# ?想請問各位高手,有沒有一些好方法可以解決 .
; {# b3 _5 I. g  J( w9 T5 z6 l; g: u: v- v  F) d: Y
下面是我hook opengl API的code :   q1 u- z( R) M
// hook wglSwapBuffers的code; hook glBegin的code也一樣 ) i# y. B) K0 I) g' U
void WINAPI wglSwapBuffersCallback(HDC hDC) 7 C; o2 Z8 |7 @
  {
+ N  ~# G/ C( g- I2 F
8 e, a& ]2 r9 f3 T$ R! l0 \0 Pif(!ininstializedfontshit)
( |  |! Q/ i8 x/ z  i, u0 @2 z8 w{
# _) ~) H# k" G& k4 z; Rfont.InitText();
9 Q7 n0 K  i, xininstializedfontshit=true; , J1 ^, t: U9 C
} 0 t( Q: ?) q# c" d5 d! p% u& y
  M  N9 [' W3 D- ^  E9 A4 O. D
SYSTEMTIME SysTime;
% `0 c* n4 U) s. P! H2 z, H7 cGetLocalTime(&SysTime);
7 n9 e& j, E3 J# pglPushAttrib(GL_CURRENT_BIT); & e% p6 e8 G6 b$ q5 i- D
    // 顯示現在時間的字串
& c, V, K6 R& x3 Qfont.Print(140,125,255,0,0,0,"Time: :%:%",SysTime.wHour,SysTime.wMinute,SysTime.wSecond); / u2 w, m- T2 P9 d$ C+ d7 l/ o
  Q% x0 L6 B/ n6 P! t/ |" u
    // 顯示BMP # ^9 `% j6 f9 I3 |( f& S

( w6 k  N# w3 c6 \2 h; g    byte Texture[]={IDB_BITMAP1}; ( n  h$ o& F! Q2 d
    glGenTextures(1, &texture[0]); 8 G5 x# s+ m9 m; A, Z. `. I% J
hBMP=(HBITMAP)LoadImage(gl_hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0 , LR_CREATEDIBSECTION); 1 ]- T! b* X& |4 I' A

, ~" p& [( V+ L* L% B7 L# Gif (hBMP) // Does The Bitmap Exist? / v. D2 b  _) B" G1 D! ]+ X0 `9 {
{ // If So... " C, L) k, d3 |( A( O
GetObject(hBMP,sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object   c6 ^  n2 V* M0 }
// sizeof(BMP): Size Of Buffer For Object Information 6 g5 R0 z9 r) f" S: H( j
// Buffer For Object Information 0 p. L' [1 \6 X2 h) J
glMatrixMode(GL_MODELVIEW);
# h. ^9 u1 v" Y4 w7 K; d7 JglLoadIdentity();
6 v: R4 |, S3 X# X& C! \. kglTranslatef(0.0f,0.0f,-1.0f);
" \- Q/ X1 l: z9 GglPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]); 3 Y4 ]# v! N' K7 d
    // Bind Our Texture
* _  X: S. o; I$ z$ ]# U0 W0 A/ N5 a    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST ); // Linear Filtering 2 G, N& l# R$ H0 e/ o- i
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Mipmap Linear Filtering
6 e( H) O7 D. E: I  {3 D
3 q- P+ Y7 g& @  x4 G( GgluBuild2DMipmaps(GL_TEXTURE_2D, 4, BMP.bmWidth, BMP.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, BMP.bmBits); ) f& [* ]5 ~/ K  ?/ ?
DeleteObject(hBMP); // Delete The Bitmap Object
5 }0 [, Z9 b4 v* w0 o} * _, l8 ?* x6 E  @
glPopAttrib(); ' V$ u' U" O& {' g$ y/ @, _
9 o& S) X5 A* S

, a+ g& J2 v0 {& l4 Q* I}
3 |* f6 k4 y; Z; X: |& i7 x& r6 {wglSwapBuffersNext(hDC); 7 F4 }7 f2 W" c& B. d+ M: |  w
}
1 S  x2 Q, f: R) p3 C0 \5 g
, g& A+ I  W' ~, g7 m+ f+ X( S
6 O( i2 y4 y7 l4 B# k& M
3 h+ b8 ^2 ^3 O0 a. Q! B$ O( _3 J4 x& b2 ^
' Z" f4 s4 c( |, ~7 t
' C: s" i5 I5 R6 v  Q
作者 : dorkas(aming)
+ n: M1 J3 }  S3 S6 I/ @( J, G6 E[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ]    3 R: B- z3 g' P$ X! P1 r
[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  
+ L, c7 W4 L; T/ v3 K2006/9/7 上午 10:30:03 8 i% m  @8 o+ R! J

6 W0 i8 U: j+ v2 q1.貼圖動作錯誤
5 X* t9 d# z. `. O  ^/ W* n) J% ~0 t9 ^+ w7 V- a  \/ d0 s/ f, }& V
2.
) |0 W$ k: P, ^' A每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡 4 y/ B1 g* g2 k6 Y& A

( L# F7 T" ?( ~  {) p& f/ L) i
& e+ J. l) I4 ?8 bstruct MyTime # C6 }; c' i! [+ O) o% F
{ ! `7 P/ Q- [: o- F; L
    byte Texture;
1 O# v) L5 d+ O! k0 y    FontGL font; 1 M) o! B/ d9 P5 D
    void initial(void); 6 I. B: x. O6 V0 U# {5 J
    void finish(void); 7 Z, C" j% l2 i, \3 [( m" @. d
    void draw(void);
& q4 D7 x; ~6 t; m& n1 I: t, H};
! ]: c1 R, X+ J- b5 H; hvoid MyTime::initial(void)
# e% Y( @; j. R+ O* p" @{
- k4 f2 _+ l) U$ l9 k7 v    // 載圖 初始字型
' d! X" ^& L* Z. a/ J$ T9 c    font.InitText();
6 i, e% c7 m5 N: y3 G2 [2 ?3 y  glGenTextures(1, &Texture); # f" g  J1 v& e2 D! l$ r
}
" M: b$ Q) p$ h4 n' v, |# nvoid MyTime::finish(void) : \. G# E+ Q$ j* X+ T2 K% Y2 P
{
; z9 I9 q, A% O  l9 }    //釋放圖形 字型資源
9 @% S( i" d9 N$ X} " S/ l3 P. @5 P( p
6 x+ m  }7 N0 g0 K
void MyTime::draw(void)
  W. |0 n3 g+ r2 T+ ]{
' j- B% j5 k% D2 E; A    // 顯示現在時間的字串
% W( e9 a1 P5 G1 s) i  O& t& C    font.Print(......something...); & T" c2 N/ r8 B
    // Buffer For Object Information * q9 T  V5 b6 e8 \* r2 w
    glMatrixMode(GL_MODELVIEW);
0 e- i8 Y+ X) H    glLoadIdentity();
+ E( ?* o$ x' R$ ^    glTranslatef(0.0f,0.0f,-1.0f); 7 i# e+ n6 c2 r  z* c
    glBindTexture(GL_TEXTURE_2D, Texture);
+ r6 h  ]: h% i0 e" T+ _8 r
3 T# U' z$ Y( z/ v  i8 [  ..... DrawSomeThing ! H+ c) S- W5 P) M6 z& w: K
    7 U5 g  m4 V/ w/ S$ W# H
} . Y, f& @" t. ^+ R% r! n
' R/ p/ R  t8 q3 N

5 F) t* [0 M  b* N, zMyTime time; 3 a/ C* k# T, Z& Y; c% T
void WINAPI wglSwapBuffersCallback(HDC hDC) & e9 C9 P* Y1 O2 B" [
{ $ q! [3 t# r. \5 B  t
    time.draw(); 9 l" Z5 u" x0 q7 R- W! L: M- ~
    wglSwapBuffersNext(hDC);
! ^: k' |: B# a7 n9 `8 D}
5 ?8 B# Y5 a+ H& q9 O: z
: y" F% n# f  r6 Y# D, p你只要掛進去前呼叫 time.initial();
) B2 _* W0 [1 |0 s0 W' g結束呼叫 time.finish();
7 Z# l6 E/ K" R) P: w& l9 m2 K! j  \* K. C7 j* b* m; ?

7 r( G) h* S$ J' U7 b! @' g4 w0 G4 M* v) z+ v3 A" k' J

/ r, [1 M$ b+ J9 F# j; \作者 : fushunwu(fushunwu) : Z7 z: I: b# e9 ~1 ?
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]   
. n" {# t8 B8 F8 @& D' Q! ^# S; B[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  
2 O% A" r6 Z! F2006/9/7 下午 04:19:31
- {) A, x; Q" Z& U4 B% J6 {1 T, S5 N& z3 ?  c1 X# m4 p: [/ i/ U8 a
謝謝. 但我還是有幾疑問想要請你幫忙,麻煩你了.謝謝 ~
9 f& F3 q5 B  L! H( f2 a3 o& }
; k" I; x$ f! h8 L(1). 因為我要固定放現在的時間字串和BMP圖在被我Hook的Game上面,所以我必須要知道那一個OpenGL的API是一定會不斷地被Game來呼叫,這樣子Game畫面才會不斷地更新. ( r0 h! @$ Y4 S# @; ^; P
時間字串也才會不斷地被更新而BMP也會不斷地貼在Game上面而不會被Game遮掉. 4 }  ]+ _% D4 H* w% _
像是DirectX Game中的Present API就會不斷地被呼叫,所以我只要把現在的時間字串和BMP圖放在這個API裏面就OK了.
0 c. @5 _% D2 x+ ~  Y4 M所以我想問的是OpenGL Game中是不是會不斷地呼叫wglSwapBuffers這個API,讓畫面不斷地更新 ? 還是有其它API是一定會不斷地被OpenGL來呼叫 ?
% j0 c; H" \, A# L' y% \; S- F
4 v9 n% p' K, l( i& w7 o& u6 x
# ?7 p& q, c+ `(2). 現在OpenGL Game看起來都不是用Pure OpenGL API來製作,比如說像是用Glut , X; k. U, J& D9 Y- y  q; q% G0 j
    來開發,他們是只是封裝起來底層還是需要用到Pure OpenGL的API 嗎 ?
; S" I( f- ~1 v9 f* C0 o    這樣我寫的Hook才可以通用其他非Pure OpenGL的Game.
7 I$ T4 Y0 l9 u0 w2 r( m
* I5 n( F- M0 N# {1 z3 z(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ? " ^: i# d* w5 w6 p+ k# E

' X( P- v0 o; w3 _5 w4 x; T) W0 E

3 W8 k: |+ h- S2 Y2 N5 m2 K6 o/ v2 E& D7 H/ |2 W
- ]2 k& J/ X- C
作者 : dorkas(aming) ! R! f% l6 C4 p, k* g+ @3 [
[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ]   
# V& k( ?: n3 v  `[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  
& V7 O5 \* b& v7 Q3 w4 t7 e2006/9/7 下午 05:31:01 4 N  ]( M8 c1 H6 S* ?/ f- o! a/ u
9 d3 t2 W' G3 [
1&2   X" E7 K, N5 L% f  l
我對OpenGL不熟... ' n' L8 k! N1 Y- a% o& f

* b' c. Q- T% d; Z$ T/ f4 i>(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ? 1 X) v3 d* q) z" l/ \5 O" M( s  Z
  h1 i& z  t, ^" z
, Q5 T. i8 n2 T! }. O/ M8 m2 c9 m! n* G
初始跟結束都是做一次的就好了 - `2 Z5 y* k- D! `) b" _  J
你高興要擺在迴圈裡面也是可以
. d' U  N! X$ J, n! V
$ ^$ F- [+ f' p6 W8 i程式的要訣就是 起 承 轉 合 ) R4 J% g% {* H# ^8 `
initial
* Z7 T8 L8 u$ r2 ~& NupDate " D; g9 {9 m& w8 T$ X9 [) C
change
! k, r3 T$ f2 Hfinish ' R* ~( w+ H- g5 n
物件也是起承轉合 / I- V6 h2 a* a5 W
函數也是起承轉合 * G6 y% R  w9 n. Q, _
迴圈裡面也是 起 承 轉 合 + G5 L+ ~$ \" R1 I) |: N' T0 y3 M
9 e4 @0 j, H' l6 n" i
' U9 c. Y: x0 n8 L) I5 K
for(起;承;轉) 0 z, b, A6 F8 F. q+ _: d
{ 3 @0 l+ Z- y/ P6 E% d
& d% h' F* I- C) J; M1 O
, U, k! p: C; l7 L/ M

6 \$ x. Y1 _7 {3 b/ Z
5 F* p* r# _1 f0 [+ [1 G} 3 H2 E0 s) ?. T0 s

: m, z- Q$ q& S$ v1 s
- I6 r0 V0 i$ O9 e  S/ U只要你分的清楚 屬於那一塊的性質就好了
" o. I" y( @" Q* i
. H* ]% o5 {5 R$ x) f
6 q9 ~! x% {" L+ D
4 _+ |& {0 w! _- u
  }& ]! ~$ X( t3 `! g" T
2 |" a1 \* X" |& l* X作者 : fushunwu(fushunwu)
% Z. v3 _4 E2 @+ m[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]   
' S* V3 o, y. C3 N[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  % v0 t1 O! C+ f8 v/ n
2006/9/8 上午 10:32:26 0 J" q8 t% Z- B5 I8 w

+ m; c- w1 \* s, I6 ]$ [2 C恩,還是要謝謝你,目前問題還是沒有解決.Quake4和CS 顯示的狀況還是不一樣~
4 o: ], u0 _; {. o
) o+ f  p+ U  [: P4 |: x: |" n像是Quake4這個Game它就沒有使用到glBegin這個API 所以我hook不到glBegin
% f% X4 s  p- O; {/ P; a: j所以我就把顯示字串和BMP圖放到swapBuffers裏面去做,字串可以正常顯示但圖秀不出來
! ]! h" B$ I7 N; Z% T我在想是不是因為座標還是矩陣的問題 ? # @8 J; Q8 e6 }% p- p+ n
  i! W  t% c8 e3 [1 c, i4 m
但是CS放在swapBuffers圖和字都顯示不出來,但是因為CS有用glBegin所以我就把同樣的code放在glBegin裏面,可以顯示字串只不過會顯示很多個,我在想是不是也是因為座標還是矩陣的問題 ?
1 n8 m, v: r2 j+ m7 o至於BMP圖在CS片頭時可以秀,只不過會秀滿全螢幕而且是顛倒的占滿整個畫面.
, l8 t9 F; I2 i, g; c, r2 B7 D* E+ ?2 ^
所以我才想說有沒有一個統一的方式可以讓我把同樣的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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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