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

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

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

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

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

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

这篇文章的一些思路和我的某些思路类似,留待以后参考。 ( o1 H: D$ O' s* i  ]+ g3 |
建议还是看原文,比较清晰,为防止原文失效,贴一份在这里。

6 v" c& A) n2 U$ w
' H! r6 ^9 v/ I原文
4 T' t) p2 O7 Q, y& l( ghttp://www.programmer-club.com.tw/ShowSameTitleN/opengl/1654.html
- F" b2 u+ P* `$ B
1 E/ X) H- e' z4 N6 z大家好,
5 q. j- p: a! r6 b# ?% v5 k
- m* [2 R/ L- K0 v: f我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable 9 a  S- Q7 W7 h% u8 H6 R
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....
" b6 M8 c/ o* c% k+ ]# l
5 U8 v7 F% y. \(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個 6 D$ @! x" t/ A, p% K
    但是BMP圖放在wglSwapBuffers卻顯示不出來
: x3 I/ \/ r. C& s; t' H8 n( B(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一 ) |! p' t2 [% `2 Q  E8 G
樣的時間字串  
+ m0 e8 d6 Z$ C' w" l! [
+ u# y: A: {# k, X4 t3 b- B( J2 R; b/ n) Y6 \7 B3 x0 U  t
4 L6 a7 h5 h, F+ _9 E# F
作者 : fushunwu(fushunwu)
, g; M, L2 K! ?5 i# M[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]    ! X6 v' ]4 R8 F% @$ K& h
[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  3 I' U: B' s, e$ n# S- Y1 ]1 q; v% P9 U
2006/9/5 下午 03:21:34 9 I" U  ^6 w; j1 D' O6 s! _
. e/ ]* ~+ r, S) \6 J4 z
sorry,按太快還沒打完 ..
4 Q' i8 M! n, R. R, L1 l3 O1 L
% m9 W# y, B4 g* O+ g6 E/ N我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
  A6 f4 W- E4 Z) C  O# b4 d. V,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....( 我使用MadCodeHook的API) & e6 A6 r- m( Q6 V) O2 U* U( ^" @, s1 ^9 f

0 g  s+ m. M) B(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個. 但是BMP圖放在wglSwapBuffers卻顯示不出來 * W) n# ^" R$ c+ Z
(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一樣的時間字串 ; BMP圖放在glBegin中中在cs片頭中還可以顯示,但是圖會顛倒而且會占滿全部的畫面,進入game中再開圖就掛了. % |* B3 _' L7 }: @

# D, x2 T, b/ ^. f. Q0 N$ ^想請問各位高手,有沒有一些好方法可以解決 .
  A$ }5 b5 y1 w6 |* \6 A& @4 V# m7 _5 ]. O% Z6 a4 u/ ^3 q
下面是我hook opengl API的code :
/ a/ W+ V( g! _& b: k# A  m- d+ |// hook wglSwapBuffers的code; hook glBegin的code也一樣 ; y- s- s6 v  e2 H
void WINAPI wglSwapBuffersCallback(HDC hDC) ! Y! j! k% e  ~/ k( }
  {
  z$ E" q: z2 O) Q3 N8 W" Y
/ b1 J0 V- P7 @$ K! \$ Tif(!ininstializedfontshit)
/ k/ J. G$ c- \; a9 P{
* E, e# g/ Q5 i- p( T) K2 U2 ifont.InitText();
3 R7 x' V5 a8 g' i4 L! H" xininstializedfontshit=true; 5 e2 ]$ u6 x- f6 j& i- F( w
}
# P, j+ {, ]3 T: C" G+ Z5 N& w
: V& [8 y6 F9 N* ASYSTEMTIME SysTime;
3 o% w& v, Y6 `6 d2 q' [) OGetLocalTime(&SysTime); 0 Z  b6 Y  n& b$ p" `8 a
glPushAttrib(GL_CURRENT_BIT); . }1 m8 Q  p4 L' f' l1 R
    // 顯示現在時間的字串
5 v' a( p8 V9 W& D- Y- T! afont.Print(140,125,255,0,0,0,"Time: :%:%",SysTime.wHour,SysTime.wMinute,SysTime.wSecond);
% o: Y, @" x; a  g- y# {1 W$ I+ P1 T7 N: z% ^$ a6 E6 e1 l
    // 顯示BMP 4 w9 N" U, @- T0 v4 }

8 i4 ^, j3 l, k  f0 B. F. j    byte Texture[]={IDB_BITMAP1};
% B6 `6 J' v& c: g4 w* l    glGenTextures(1, &texture[0]); ! X# F+ P! s9 b( J
hBMP=(HBITMAP)LoadImage(gl_hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0 , LR_CREATEDIBSECTION);
  i; t, p8 R6 `6 e
- C6 [; G" g' h* j8 Wif (hBMP) // Does The Bitmap Exist? 6 j! d6 g, N' g/ b7 m+ b
{ // If So...
0 g) \% o! ]) g% |GetObject(hBMP,sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object / }1 S* i5 w2 o! q
// sizeof(BMP): Size Of Buffer For Object Information , ^. @* ^4 j! N& M0 j
// Buffer For Object Information 1 A* b# N1 S7 ]* `5 P0 k$ h
glMatrixMode(GL_MODELVIEW);
$ \7 U% z& p8 R* W" W6 oglLoadIdentity(); ; q) s: P) H2 U& j1 p6 k$ J
glTranslatef(0.0f,0.0f,-1.0f); 7 A! \9 h; I9 {) o1 L0 n
glPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]); + J* ]* u& r7 a( p1 c. M( W9 Q% f
    // Bind Our Texture 3 M" ^& `! g! n
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST ); // Linear Filtering ; \& J# e" s4 \" L4 Z
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Mipmap Linear Filtering
5 u9 x& j+ o, A
/ C3 ?2 `( l+ D& z8 ~  qgluBuild2DMipmaps(GL_TEXTURE_2D, 4, BMP.bmWidth, BMP.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, BMP.bmBits);
& `2 n* D; i" cDeleteObject(hBMP); // Delete The Bitmap Object $ i" ^% v' }6 D* c, E
} 1 P$ a0 M- V- s6 s
glPopAttrib(); # A- _1 |* A$ S  b) A' v
: }; y- X: q, c% L
7 p9 {6 h8 V3 y7 H. S5 F
} ' H7 d. Y$ [, ~, i
wglSwapBuffersNext(hDC);
$ [0 y2 E; w9 {) a& J) {} 2 O7 A* K0 |; v. X

+ C3 F( O! q7 m
9 g# U/ H& Z5 z. j4 x2 i
5 r) _! K& ~' t% Q4 R$ _) E! }3 `3 B
0 N* b# H3 K( K; m* W* B1 Q. Q" o  u$ Q& _1 g

' \; I% ~& Q. J, `作者 : dorkas(aming) 1 B& u1 ^% T. S
[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ]   
2 J# I6 t! H. W[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  
. n+ _, m3 j7 u  U$ _2006/9/7 上午 10:30:03 # u# |" f) b0 L1 O
1 c" n( }& V5 h2 @+ s% G' K4 v2 L
1.貼圖動作錯誤 . i, ?0 ?% x$ N. o7 n0 u3 o+ [
  I# K" E) a6 F9 m
2. + f  s1 B$ d3 D5 f. ?8 z& U* b
每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡 / t/ g9 R& T5 H5 r; U4 s
6 ^% d2 z# D( J6 ]  w. a2 {  x
0 _6 O4 x2 v5 w0 S. W% T7 ]) H
struct MyTime
0 N. b& L1 b5 _$ t- p" A{ , a  Z3 }/ ^, y. v( U$ z
    byte Texture; . Z( l, M4 z6 v! {
    FontGL font; & f* L: j7 N/ B: l
    void initial(void);
* I3 Q$ l) W6 s( G2 _' H8 W    void finish(void);
: w4 S+ q! y+ x  u# I    void draw(void); 3 z( o# z* t) ?$ I
}; / C) W( L9 N% P/ ]
void MyTime::initial(void) * H4 i. O3 x! r" Z' G8 D
{
( F* S1 b, H" R) Q( ]    // 載圖 初始字型 5 O) r6 L" F% p2 X2 A
    font.InitText();
3 h7 d+ X! N! [6 ?0 e; m& L  glGenTextures(1, &Texture); % T" e2 a' F9 y
}
3 o  u4 ^* c+ ?8 q" f7 u. v6 ~  A. Zvoid MyTime::finish(void) 1 ?& X+ [2 h' i# z# ?* f/ v+ N0 J
{
: c" H' U. ?' G0 w- ?. @  X6 [    //釋放圖形 字型資源
0 ]5 K5 G& N& n. B( ]2 f}
. y  z4 p3 |7 o9 F( |% U' q
" L* S% C: z, L- Z" evoid MyTime::draw(void)
3 N& J, d! C) G7 H! @5 r8 t{
2 t" [, q5 W" e- b5 H    // 顯示現在時間的字串 4 c1 g! k& p) A/ C& M; w
    font.Print(......something...); $ h: x# ^; }6 K* n, Q
    // Buffer For Object Information
' N0 j0 X+ h4 Z, f; E    glMatrixMode(GL_MODELVIEW);
0 T) k# e' Z5 c  Q. G. M    glLoadIdentity();
$ \) }. e7 {! W) B$ P    glTranslatef(0.0f,0.0f,-1.0f);
7 |. f4 {+ b+ k( R: y    glBindTexture(GL_TEXTURE_2D, Texture); 9 ~6 t) o+ d( g: }7 S6 o
+ D& j  t3 S/ h# \
  ..... DrawSomeThing
- {- C6 I# o2 X5 o. y( |5 u, \      o3 {) C, j, ]: K; y( s' U& e) t
} : _8 w0 f0 p! c) W3 M

( E# O! v4 G% }1 G# j* z+ v! {% V  e2 }: s
, q& X0 f5 ~0 L/ O' P! S; sMyTime time;
4 O' i' L$ J7 c  x% [) w; ?" b4 Jvoid WINAPI wglSwapBuffersCallback(HDC hDC)
% E, E( H# t+ [0 D7 D1 ~{
8 t, Z* w" E4 ]+ ~% B! z6 R    time.draw(); 5 H% S# W' H& Q- h) |0 T& f% M+ i
    wglSwapBuffersNext(hDC); ' @# O, p1 ~- k3 C) C
} # J3 f* v& f7 t0 _4 R- `% b) j" k, I7 H

6 n" @& q. d- Q" C: J+ o你只要掛進去前呼叫 time.initial();
9 i1 x$ o& {' l結束呼叫 time.finish(); & T  l! C& u, S4 M0 {0 w

1 n  {$ i8 j! o, h- a! R
- \" t7 K% P5 i; q: h0 n3 I1 x! r+ P" K0 K3 I

& I  h" q+ m) u作者 : fushunwu(fushunwu)
3 a6 J/ r' J+ ~* E7 C8 @[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]   
! \) G* H, C4 J/ i# G/ s* a[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  9 Q# b: ^- \4 _& p2 H6 b
2006/9/7 下午 04:19:31 " D0 R' `( d: Y* K3 M/ d
0 x4 u7 h# s! j8 A6 u( [
謝謝. 但我還是有幾疑問想要請你幫忙,麻煩你了.謝謝 ~ 1 h' x8 u; E0 `! |5 W; O# d

7 o) y: s4 H8 {* S(1). 因為我要固定放現在的時間字串和BMP圖在被我Hook的Game上面,所以我必須要知道那一個OpenGL的API是一定會不斷地被Game來呼叫,這樣子Game畫面才會不斷地更新.
" B1 m" V2 ~. Z2 t9 R+ ?2 J% P時間字串也才會不斷地被更新而BMP也會不斷地貼在Game上面而不會被Game遮掉.
& g* c& k# {+ x' V% H6 O$ G' L3 s像是DirectX Game中的Present API就會不斷地被呼叫,所以我只要把現在的時間字串和BMP圖放在這個API裏面就OK了.
. ^( a) L4 ~+ P4 ~5 Q8 N- h所以我想問的是OpenGL Game中是不是會不斷地呼叫wglSwapBuffers這個API,讓畫面不斷地更新 ? 還是有其它API是一定會不斷地被OpenGL來呼叫 ? + o' Y$ z6 I/ y

$ x! s8 i& L5 K
0 `$ a# U5 h- U' _(2). 現在OpenGL Game看起來都不是用Pure OpenGL API來製作,比如說像是用Glut % `' G" ?; J, j2 }# U
    來開發,他們是只是封裝起來底層還是需要用到Pure OpenGL的API 嗎 ? 6 V" X0 K3 C6 H& \% k4 ~5 b
    這樣我寫的Hook才可以通用其他非Pure OpenGL的Game. 7 N8 O1 g  g* f( w/ {
/ J9 ~$ Z6 R0 s% N+ h0 U
(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ? # h$ ~& S& w1 ~! C/ A
' c. C5 a3 Y% @. ?2 h  q9 S

1 s2 }& L( G3 M' W- [- L! U( ?
3 T) ^5 d' q' g0 y8 o+ r3 A& I+ N
* Q& j  e/ P) Q9 [! Z6 \2 _
3 p1 w4 y4 T4 Q# E作者 : dorkas(aming) + ~- s8 y% D. A9 m9 Q+ J; j; `
[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ]    1 K8 k! l2 Q' D* `1 L( c
[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  
; `, M: l+ ~; B; s2006/9/7 下午 05:31:01
8 w/ a$ p, E" n3 C* A  s8 q$ g, O; b- d# d4 r4 `
1&2
6 G/ U' Y% U) v0 S我對OpenGL不熟...
+ p9 l$ G) w1 u# L! d. Z" b1 m9 A$ \: x+ ?! J
>(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
/ C" P0 B& q+ x$ I1 c! o1 z' T3 O2 S

% T! I. S1 N2 F: L3 u8 g6 e初始跟結束都是做一次的就好了 ! y0 _) W9 ~7 y/ ^
你高興要擺在迴圈裡面也是可以
5 I, f! L) j7 B) w: k4 t1 S4 y4 v0 O
程式的要訣就是 起 承 轉 合 " y3 f& E$ q4 I
initial - I: t3 s) y- u1 v6 h
upDate + q8 I6 a- U& r& ^; Z% \
change " |" N5 P0 Q& ^: O1 N
finish 1 o+ P. h' l- S! t
物件也是起承轉合 ! y! Y5 g3 Z( D" e
函數也是起承轉合
- c* A: h8 j# ~0 `; Q- c迴圈裡面也是 起 承 轉 合
. e# N6 L6 D$ A- U$ }
3 R( D( v, P, T" k; O; h" v$ x8 `% N
% B3 I5 h  s2 O& J6 K, A1 Z7 ffor(起;承;轉)
) P) M& J- T4 K3 i/ i" t/ F{ ) Y9 B8 ]9 F' w4 Q2 L
7 y" w# N1 X+ H2 y5 n
2 y( h" K3 e" J

8 R4 f3 F1 j; v
- V  u/ f/ A" J$ F% H( r; w1 w} ( w. H: t; u8 n

* H- O" ^; D- E  z" H* o6 E2 X; @' e# w6 D. b0 ~/ M1 m
只要你分的清楚 屬於那一塊的性質就好了
' P% c0 g; R% I* b0 X/ u; o9 X4 a: I7 W1 I) S% @. N7 P
0 C+ E2 B) A! c, g8 ~
7 @* V7 K! B% H8 \) p5 x
% V: @+ U! r9 K" j
1 W* n3 O; b; `% I+ U* o4 U/ W7 v# f
作者 : fushunwu(fushunwu)
  n% a, o  `5 p  M' y  W0 c[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]    . u% v- s: B# D6 s: |
[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  
- o# _0 e; U$ g& F+ @2006/9/8 上午 10:32:26 " t$ |" U% Z8 k& b

5 a) C. b& F7 _5 ?) G恩,還是要謝謝你,目前問題還是沒有解決.Quake4和CS 顯示的狀況還是不一樣~ + T; [$ R  p" r' s- J4 c0 X
9 W" d0 h) V2 ?9 @3 e3 P" D8 S
像是Quake4這個Game它就沒有使用到glBegin這個API 所以我hook不到glBegin . m- G9 P; e* ^0 o. ?
所以我就把顯示字串和BMP圖放到swapBuffers裏面去做,字串可以正常顯示但圖秀不出來 $ N7 b! T+ W; R7 P( A
我在想是不是因為座標還是矩陣的問題 ? ' o( d2 ]3 s* V, m2 ^$ j# ^1 Y

8 K0 U6 R1 ^$ |4 u但是CS放在swapBuffers圖和字都顯示不出來,但是因為CS有用glBegin所以我就把同樣的code放在glBegin裏面,可以顯示字串只不過會顯示很多個,我在想是不是也是因為座標還是矩陣的問題 ? - F8 }1 {4 d7 Z1 z$ y- @
至於BMP圖在CS片頭時可以秀,只不過會秀滿全螢幕而且是顛倒的占滿整個畫面.
: E: V2 X/ J4 w' A9 t, B. P) s7 v, K; j8 ]
所以我才想說有沒有一個統一的方式可以讓我把同樣的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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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