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

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

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

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

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

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

这篇文章的一些思路和我的某些思路类似,留待以后参考。
: G" T; z% }1 ]9 k建议还是看原文,比较清晰,为防止原文失效,贴一份在这里。
: R! B5 g3 f5 U! Q2 ?
/ @, [5 {# z) [/ s6 B
原文
9 G% q! }# w% E; v1 l4 P( jhttp://www.programmer-club.com.tw/ShowSameTitleN/opengl/1654.html
1 O, b0 A9 X, p) N
/ L) `2 H5 D* R) B( p. {大家好,
2 }1 H, e/ H9 B/ J) p; y  s! t" L* i6 a6 p7 h# S/ N) ~" r
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable - f; K/ e+ @" b6 y5 q/ q0 l
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣.... / W$ ^* T) i4 o, `. `0 l
$ G8 W: q: r/ _8 ~7 M
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個 ; Z) r1 f) k& V% X
    但是BMP圖放在wglSwapBuffers卻顯示不出來 ' D1 K' Y1 `' j& b, d" L% W
(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一
7 n! S: Z0 q5 z: j4 i" @$ U樣的時間字串  6 e; K4 B1 a0 I! d. d2 }+ U5 n
+ p* s( c8 a/ |5 [. q
& S7 ^4 V( t; u5 |( @

! W0 ^  k% B9 p4 B作者 : fushunwu(fushunwu)
" y% R* o/ d! x) r# z[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]    1 S- U; a( i4 I2 W, L: O
[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  $ |6 c6 [6 e/ M& d5 k
2006/9/5 下午 03:21:34
# ?! S  f* Y' ?% N6 N" G8 q8 N& D8 \$ o/ d, _3 \8 Y
sorry,按太快還沒打完 ..
$ a/ C7 e! U4 Q4 `% T
  s% l% J) X( B8 f- Y; d我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable   w8 J$ B* \5 u. j9 J" _0 V
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....( 我使用MadCodeHook的API) 1 a* ]& `* `. W1 f3 @
' o& m* T6 A/ c3 B" m
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個. 但是BMP圖放在wglSwapBuffers卻顯示不出來 ' W7 H& \9 c: [+ `: X
(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一樣的時間字串 ; BMP圖放在glBegin中中在cs片頭中還可以顯示,但是圖會顛倒而且會占滿全部的畫面,進入game中再開圖就掛了.
1 @1 O$ v  x/ {; C9 v' z; f) ?/ U3 W" `
想請問各位高手,有沒有一些好方法可以解決 . 4 f- q2 f4 p+ {2 G3 @) h, x1 d
: c8 o$ B. G& }; b
下面是我hook opengl API的code :
& o$ T. L  I2 L: ?; N& W// hook wglSwapBuffers的code; hook glBegin的code也一樣
3 k9 _  {6 {& R8 F' Rvoid WINAPI wglSwapBuffersCallback(HDC hDC) 4 w+ f0 z  M- q; p5 d3 }
  {
4 J( _/ k6 K2 V( a) g: f% ~& G. t' D8 W8 q9 A0 A8 u, C! T- S
if(!ininstializedfontshit)
" i: c% B$ ]2 E{
* w0 z% @: Q# l+ t1 O& `8 m9 {& Ofont.InitText();
$ H/ F# p- r* H  \) cininstializedfontshit=true;
/ |, z8 Z7 j' ~* r7 q5 w: }}
  X$ Y4 I( F! Q) {# X
9 z, e4 K/ O8 Q7 w) y# j) YSYSTEMTIME SysTime; . n5 c$ n, j, v& R0 i. F
GetLocalTime(&SysTime); 4 k# V% D0 H$ e& F: P& A! r
glPushAttrib(GL_CURRENT_BIT);
: F+ B+ x* f1 A( t    // 顯示現在時間的字串
, {  M, Z" T# R0 A3 ~8 p( xfont.Print(140,125,255,0,0,0,"Time: :%:%",SysTime.wHour,SysTime.wMinute,SysTime.wSecond);
1 T6 i/ c) M" ^% y1 u$ y% U5 \
. E& n5 E1 `9 j9 C# [1 r+ z" m! I# }    // 顯示BMP
- @: ?: J! f) e( a6 i: t  o( L7 e' ?  _7 U$ R( b, k1 J. j
    byte Texture[]={IDB_BITMAP1}; ( J% [: D8 M3 C7 k2 [) y5 X# ^  g* k
    glGenTextures(1, &texture[0]); $ S3 m$ k, {: w: |, F& ^+ }
hBMP=(HBITMAP)LoadImage(gl_hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0 , LR_CREATEDIBSECTION);
: t* i" m+ e) Z1 F6 i% j/ X3 L8 C0 O+ e; G9 g
if (hBMP) // Does The Bitmap Exist? 1 A0 c" j, {# Q8 _
{ // If So... 1 T, W8 E8 j( e- p- W0 I. k
GetObject(hBMP,sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object 9 w7 ?. d1 M9 I# P" S
// sizeof(BMP): Size Of Buffer For Object Information , W1 x- A7 e9 |* U! h
// Buffer For Object Information 8 k+ g: Z; S2 M6 k$ y, \/ s
glMatrixMode(GL_MODELVIEW); + m: k6 m3 ?% k% l9 j; G
glLoadIdentity();
! B4 b/ ?! n1 u& DglTranslatef(0.0f,0.0f,-1.0f);
  S5 c8 ^% }2 B2 C) T# M/ y( rglPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]);
- L+ t4 b; |! i4 @    // Bind Our Texture
2 |+ E. b' _4 r. Q$ k3 d# P  m1 j, ?    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST ); // Linear Filtering   B2 e/ E6 r7 P3 _: ?
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Mipmap Linear Filtering 9 g7 t: x& \5 `3 c

, S9 F. v. H. H. W/ MgluBuild2DMipmaps(GL_TEXTURE_2D, 4, BMP.bmWidth, BMP.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, BMP.bmBits); ( v* K# o! w5 h: a# S2 d/ o+ W  |
DeleteObject(hBMP); // Delete The Bitmap Object # T# ?' Z, r8 N& z1 c, m
} * q$ I2 B7 F7 {0 P" f% ^0 P# ?) t: \
glPopAttrib(); + l/ ], O; v& r
/ q. o1 S* Z6 D: {1 Y# [$ t% `

' l' b2 N: Z% \) P/ w; G} 3 ]6 J! t6 W6 V5 m$ H' j5 G6 e
wglSwapBuffersNext(hDC);
# |4 F' w  [- d9 F' L0 M0 p; Y} 9 X2 ~2 z; i8 D  M/ y6 u
/ Z7 j0 j- v3 h, Y+ h  i) ?
" G7 K  _& @, D9 p
: u  J, V1 e& G! e. b3 y
0 `5 ~/ ~5 ?9 ]  Q
( Y; a, {& ^( d( [2 v* S) s
, j( E; n/ i9 B, T3 A- H8 Q
作者 : dorkas(aming) 2 ^" n1 ~' n( |3 |/ ]$ J% s
[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ]   
7 U# Q( x- ]' A; m" Z) G" S[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  3 n1 v7 S! K, C, }( H1 S3 S( `
2006/9/7 上午 10:30:03
# l6 f: a5 l$ p) m
- i# b/ P' F" B/ w! t6 J1.貼圖動作錯誤
6 t# H( O7 S/ V3 L/ _- T' Q. ?  r6 f; I! [3 m* ]' ~
2. - J' {5 C; c1 _
每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡
: I3 T) k' C6 D9 B
2 ^' X% x/ e" C$ g" B9 b4 q1 }4 _
0 c- {1 X& N" Q  n  _+ _; }struct MyTime 7 ~+ p; A+ }) J5 y  p
{ 6 m2 v6 ^& s' |
    byte Texture;
' c7 x1 X$ z0 I+ c* A    FontGL font; - O/ |4 \( g. i
    void initial(void); " e0 L) `3 X' _* K/ @
    void finish(void); 8 N8 q( [& W2 L
    void draw(void); , @& U; u* Q& z' ?; p
}; , ]1 g2 x/ T7 F7 y2 o# N& h# Y
void MyTime::initial(void)
% h  y& x2 E. T  K* \3 G  @& c{ + _9 L/ v/ s' o$ F4 o
    // 載圖 初始字型
# v( k% S0 s/ ?    font.InitText();
; l/ f$ @9 T' P3 @  glGenTextures(1, &Texture); 0 E% j% Q1 e, Y4 e& _: Q
} 5 X4 ~9 {, B% q2 P, z  J" H. J5 ?7 E
void MyTime::finish(void)
6 b& j+ R. R" w{ 0 `9 c, N5 T, C) U" u, g! d, y: Y% G
    //釋放圖形 字型資源 7 t' {2 S3 [, x  y- ^9 W: F$ ~+ d
} * d, O( @/ ?9 i+ ]: T! B

  n( l4 s* Q7 \% Y8 C% s0 y) E. Xvoid MyTime::draw(void) 6 m5 B+ D& F: U2 O
{
' r: f2 c( e3 p    // 顯示現在時間的字串
& [2 p/ n. h8 R/ z, J+ _    font.Print(......something...);
$ T  i: T1 m9 _    // Buffer For Object Information
& I: z9 Q2 Z9 F  J    glMatrixMode(GL_MODELVIEW); 4 S& v6 S5 a6 `0 f$ C
    glLoadIdentity(); " @; R# Y: q- I/ O; q9 z  b  L
    glTranslatef(0.0f,0.0f,-1.0f); ( v* Q  w; S, O$ L( d7 d
    glBindTexture(GL_TEXTURE_2D, Texture);
8 f5 b* F3 X. H' A, b8 h" W+ {5 O: ~
  ..... DrawSomeThing , r' U4 b) h5 d# M
    - N3 y! J; h5 Y! x! d
}
( I+ H) Q6 T7 @9 B) k" ]* H
" F, C/ {( b5 w+ A: e5 c  f7 }. _) F# i' G& e
MyTime time;
! ^4 Z. U7 x$ L, t( uvoid WINAPI wglSwapBuffersCallback(HDC hDC) 8 `) B4 k) u& D, r
{
5 z6 I7 W* ?  c    time.draw();
; n- m7 ^" Q9 g) X: q3 L    wglSwapBuffersNext(hDC);
* v+ u( M. l/ D, p3 Y$ p$ J. l% m}
& _; j' P& t. j1 m
7 }* y2 S& M% Q& t1 d7 ^) o你只要掛進去前呼叫 time.initial(); ' s* W% s1 N% }3 Q
結束呼叫 time.finish();
2 F* G' ^# k$ S0 z7 K2 z! L$ b
3 T. d1 G5 V% z7 r2 l& t: W, v0 @, v+ h1 ~" l% S4 f
2 L' @7 q, P; m# W6 l# i) w$ T6 U

" Q4 [. u9 r) s8 S2 c& g  g# I作者 : fushunwu(fushunwu)
  ~8 {# d5 F8 x) g2 d' N- p[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]    ' M: ^* [# q; f9 d
[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  
( f6 t4 F; J, U! ]( }5 V- s. y2006/9/7 下午 04:19:31 " D* @" X- L2 j/ ^1 j

2 }" Y! l. {# J謝謝. 但我還是有幾疑問想要請你幫忙,麻煩你了.謝謝 ~
, \4 H( s! M; O" c
7 H& U: v) s/ l/ z# h(1). 因為我要固定放現在的時間字串和BMP圖在被我Hook的Game上面,所以我必須要知道那一個OpenGL的API是一定會不斷地被Game來呼叫,這樣子Game畫面才會不斷地更新.
7 H: b8 G) f0 v1 _6 }時間字串也才會不斷地被更新而BMP也會不斷地貼在Game上面而不會被Game遮掉.
1 n, o( P+ x4 O6 R3 @2 Z! `像是DirectX Game中的Present API就會不斷地被呼叫,所以我只要把現在的時間字串和BMP圖放在這個API裏面就OK了.
4 K8 e4 W6 a( Q8 k  G- w- F所以我想問的是OpenGL Game中是不是會不斷地呼叫wglSwapBuffers這個API,讓畫面不斷地更新 ? 還是有其它API是一定會不斷地被OpenGL來呼叫 ? , O7 C. o8 ?  d4 ]# y$ K/ m: r
7 e4 R/ `7 }4 x( z
$ G, l8 Q" ^' I, P6 I
(2). 現在OpenGL Game看起來都不是用Pure OpenGL API來製作,比如說像是用Glut 5 p" d- T- w9 ]" J
    來開發,他們是只是封裝起來底層還是需要用到Pure OpenGL的API 嗎 ?
8 [4 ^/ q9 k: x/ J    這樣我寫的Hook才可以通用其他非Pure OpenGL的Game.
! t/ X" n; x8 R7 O; Q4 r
1 m0 u" O, k+ ]9 o2 {3 i# \1 _(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
4 z! ^) U/ w0 r
$ \; W6 l& J, y$ ]2 C
( u$ M. r7 N$ d6 e1 D
/ z; y9 l! o) ]0 `- R4 u
( J( `6 a% ?5 }  Y0 S8 T- T1 r' ]- E( ^3 v& f1 k
作者 : dorkas(aming)
$ l" c! q1 H, l$ b[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ]    0 z3 D- R" U& |. \( U( e9 G" W
[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  0 u. ]1 W: ?: q# A4 R
2006/9/7 下午 05:31:01 1 _0 r/ \2 D1 I" ?

/ K! O' C- c# i* w6 _. x1&2 1 ^; J. y+ @. V% N  X
我對OpenGL不熟...
/ d# r; R$ R  ^  |1 v4 Z7 y) w  }* o& ^, M: V
>(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
) N! P' Y: I9 O2 q
5 [! q: C7 X9 Y! {7 m' [
8 Q4 @$ D( P) ?+ Q1 f3 Q初始跟結束都是做一次的就好了 ! u7 z( B/ t8 c  H. q" }* i
你高興要擺在迴圈裡面也是可以 ! D. e( ?: x9 D& c* T

3 ?( Q8 a  {5 M  Z' d: a& i程式的要訣就是 起 承 轉 合
* _" W% o# \+ }' }/ Iinitial
) N, V% O# |! p$ F3 FupDate : {: \0 I# E- O2 O
change
* x( t- V5 o# ?1 p+ z, ofinish 2 C: ^: K- Y1 A; q$ f& c
物件也是起承轉合
& H& }9 ?& |  ?# Z函數也是起承轉合 5 K/ B5 ?( e9 M" l
迴圈裡面也是 起 承 轉 合 - Y% {2 m* ^8 x% r
) q0 v+ F5 `6 b8 `" H4 C( |

1 e5 }' X2 C* xfor(起;承;轉) + i+ F/ f! \  K, G: y/ e$ ]% Z* F  f$ o* p
{ / G% i- g- f" O( Y3 Y5 _/ G* s

1 p4 t6 j5 I8 a
3 u+ U5 h' ?% O
5 s6 t. z" I% ~3 A$ ?: V8 F& L+ Y  r7 T8 f/ N* s8 q* a
}
8 U4 p5 f& b( E  y7 ]; A$ @4 y' n$ Q2 R# h6 |, a% ~: p: w

' w: C+ y# O/ i# b+ P/ D只要你分的清楚 屬於那一塊的性質就好了 " m7 Q4 R2 S, ~" u  @# Q# k! p
9 ]9 T* _  l2 R1 f1 q! W
: W) I' @# B- j6 b; C

/ }% m( c4 N" }2 M  [7 a* Y* B- R) j" d6 F9 D( x
: n6 |7 O+ H  Y
作者 : fushunwu(fushunwu) 6 R$ N, N  r! W# v
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]    - p4 l% g: R' |  G7 J$ [
[ 回應本文 ]  [ 發表新文 ]  [ 給予評價 ]  [ 給予評價 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]  % f& o% U5 ?- C; E
2006/9/8 上午 10:32:26 * ?! m+ I5 h5 B) N

7 }) i( ^4 Q, t# L  M" Z; f恩,還是要謝謝你,目前問題還是沒有解決.Quake4和CS 顯示的狀況還是不一樣~
0 E% [* Z$ K5 E* O
7 @! Q1 T( n; y  W像是Quake4這個Game它就沒有使用到glBegin這個API 所以我hook不到glBegin 0 w" `9 o% U# h9 I0 A+ o. B( @
所以我就把顯示字串和BMP圖放到swapBuffers裏面去做,字串可以正常顯示但圖秀不出來 + p  Q% o  o" n
我在想是不是因為座標還是矩陣的問題 ?
- y6 h8 [  f! n! n$ x
( E8 F5 }; c/ c# V& m; T% Z$ j但是CS放在swapBuffers圖和字都顯示不出來,但是因為CS有用glBegin所以我就把同樣的code放在glBegin裏面,可以顯示字串只不過會顯示很多個,我在想是不是也是因為座標還是矩陣的問題 ?
, ]9 ], ]1 ?# a' `( Y至於BMP圖在CS片頭時可以秀,只不過會秀滿全螢幕而且是顛倒的占滿整個畫面.
- `+ ~  w1 Y% z& @9 b# G
6 {4 G) a2 n6 f$ a; e4 G所以我才想說有沒有一個統一的方式可以讓我把同樣的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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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