冒险解谜游戏中文网 ChinaAVG
标题:
【OpenGL汉化研究】Hook OpenGL的問題
[打印本页]
作者:
shane007
时间:
2010-1-24 11:41
标题:
【OpenGL汉化研究】Hook OpenGL的問題
这篇文章的一些思路和我的某些思路类似,留待以后参考。
' |$ _; ~1 _4 O6 }
建议还是看原文,比较清晰,为防止原文失效,贴一份在这里。
" N5 X7 R$ ^1 O
2 a$ [$ _, n# r+ p# }5 s/ ^( F
原文
3 r7 y+ |( \$ w" W
http://www.programmer-club.com.tw/ShowSameTitleN/opengl/1654.html
* U2 `1 J5 J/ q, _# l
4 F. Y3 P; l) {
大家好,
& P+ E# k5 [# h5 z
: M& s" X9 n3 z6 T' X
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
, H! p$ ]/ k" q5 r
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....
" Y) ~. H% c4 `2 V0 Y. X8 o
$ [0 p, a+ X* d8 J4 K0 S) o
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個
; ^+ _! R4 k$ H8 S3 i
但是BMP圖放在wglSwapBuffers卻顯示不出來
, w% X: [& Z! d+ D2 [4 |
(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一
, e4 \9 m$ _ i$ C% x
樣的時間字串
7 z2 J) h6 @/ n+ }' F j6 Z
+ n! E/ r! }! a) {+ z
_( [% h6 L+ t/ j& i" c i
; \" x. f _! p" g8 j! E" z
作者 : fushunwu(fushunwu)
. `- h3 U5 d- B2 {4 k/ j: u
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
. t; S1 ^: f) W3 \: D$ d
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
5 S6 }" D* }' f s
2006/9/5 下午 03:21:34
: ^6 Z) y" S& l `/ T" o; F
8 _, e: J2 J. X% X( L6 C, z- M
sorry,按太快還沒打完 ..
}2 r- S9 s+ H E/ ]% a' B3 s
! f) b' D& x/ b% c, d3 p+ _4 A
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable
0 F# k( z+ e- O9 z6 k
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....( 我使用MadCodeHook的API)
' A& G& y/ u+ w
. l& I9 s2 ]5 b2 u9 G
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個. 但是BMP圖放在wglSwapBuffers卻顯示不出來
z8 D2 g) }4 e; H
(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一樣的時間字串 ; BMP圖放在glBegin中中在cs片頭中還可以顯示,但是圖會顛倒而且會占滿全部的畫面,進入game中再開圖就掛了.
! |8 ]1 I, X1 x9 K3 p+ {
3 c) w3 ^$ Y0 K; v6 e+ ]9 J5 g* P
想請問各位高手,有沒有一些好方法可以解決 .
$ c. C2 R0 B: Z" [) D$ L' i
3 Y* j' W! E- P" O2 J* R& \
下面是我hook opengl API的code :
# ?8 P- v+ F+ d4 d( e
// hook wglSwapBuffers的code; hook glBegin的code也一樣
- J. J2 N- `( W, q( b+ _, c( N% N
void WINAPI wglSwapBuffersCallback(HDC hDC)
( _% G; B7 L) ], W, t: |5 E
{
% p1 B5 Z. E }' Y u" l
5 w" x9 a2 @4 k/ f# B) X
if(!ininstializedfontshit)
4 x2 L' }. c y/ w% D: V, M# H& s+ n
{
" L- T8 j, l4 K6 h) W7 ?+ O" R/ _
font.InitText();
" p/ ^$ c! d8 t3 K# w' V
ininstializedfontshit=true;
2 f! d' O' Y6 b; K! C8 u" w
}
% o$ ]. f0 E2 J0 C2 [1 [
4 g' w+ w- ~9 y% W& n! o
SYSTEMTIME SysTime;
( L7 j6 i# o* \! T9 k. f
GetLocalTime(&SysTime);
. {1 m1 |: J1 a0 C3 t5 u' V! `
glPushAttrib(GL_CURRENT_BIT);
3 d" f! N( R- h- P9 N3 x: L
// 顯示現在時間的字串
3 p7 ]! ^* j: j( j* d
font.Print(140,125,255,0,0,0,"Time: :%:%",SysTime.wHour,SysTime.wMinute,SysTime.wSecond);
/ z2 o7 ^% ]" J: Q2 `5 _
3 v' o. |0 x8 B% E/ y2 i
// 顯示BMP
/ l+ o: @ o4 J2 Y) @/ E: u
e/ g# z) R, |$ C+ K0 [% z* m: H
byte Texture[]={IDB_BITMAP1};
6 {7 T9 r+ U: m: P/ e' p% a# {
glGenTextures(1, &texture[0]);
+ C) L3 u% f8 h& q
hBMP=(HBITMAP)LoadImage(gl_hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0 , LR_CREATEDIBSECTION);
, x' W! `, I- q
I! U& N: D; L4 L5 m
if (hBMP) // Does The Bitmap Exist?
: ?3 ]/ e" ]. ~$ M/ ]+ s, h
{ // If So...
/ H3 |8 Q C6 L) b4 Q* }
GetObject(hBMP,sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object
; \( U( q2 Z3 X8 c' s* p. _+ L
// sizeof(BMP): Size Of Buffer For Object Information
, k$ r# e8 C5 S+ p0 G
// Buffer For Object Information
]( E; t; Q# G" `& d7 v$ P
glMatrixMode(GL_MODELVIEW);
5 ~& H* Y9 |: k8 f) z2 j( V
glLoadIdentity();
: T8 Q1 P, V" g3 g+ Z" m
glTranslatef(0.0f,0.0f,-1.0f);
2 H8 k3 A6 g/ ~$ _$ D- r7 J0 l
glPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]);
3 E/ N- t& x; @' V8 P5 x
// Bind Our Texture
5 Y- L% ] J+ ]) ~- Y) q0 ~* [2 U
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST ); // Linear Filtering
9 U9 E/ E7 h, v3 p! v; ?
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Mipmap Linear Filtering
4 P8 D) ~7 U! m7 s# A
" R1 E( T5 A% v7 h2 Q4 o \. K7 y& y
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, BMP.bmWidth, BMP.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, BMP.bmBits);
1 c& Y( o, u5 L4 f8 z' X8 k
DeleteObject(hBMP); // Delete The Bitmap Object
! \3 W2 R p' Q! b
}
2 M4 Y" V8 i0 |8 B4 Z& a' G9 {
glPopAttrib();
1 i* M: Q1 |# I7 E6 E+ f2 i6 K
: L1 K9 `( q2 x% t. e+ `
( q+ G; h. T6 m( M& s
}
( K" ~4 g4 T+ w) u, Z
wglSwapBuffersNext(hDC);
5 r6 W' ]. _9 p7 R0 B2 O' h
}
3 ]* j* Z6 f: V! f; c( f2 a
# Y+ |" ?! a2 d$ E
3 f( A" F/ L' m, d
$ B- T5 i& X2 p
5 I% T' K4 o3 U) Y
. D7 [9 I4 H7 e3 i) R, F: f/ y: r
4 }0 S/ V6 p* `: O9 Q1 S
作者 : dorkas(aming)
! J% q7 s: N) K1 |6 a5 ?
[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ]
3 g0 q* d z& r9 ^) v1 j
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
. d& [) ~6 I% i* ?/ ?# h" D
2006/9/7 上午 10:30:03
1 d7 n& Q( R0 P* a/ m
% x) E X0 o" Q8 @3 {
1.貼圖動作錯誤
' t' E1 Y7 v0 S& @/ f$ m4 w
$ H7 `. e2 L0 p& k. s
2.
" B, _" r+ `$ O
每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡
2 V$ H$ S6 }' Y: d8 F
/ v! I( r; l2 ?0 G) j0 T
# B: w8 a$ U8 w2 M9 t$ m& `
struct MyTime
2 k" ~: M6 [5 {4 {" a/ _
{
; b6 K) u) d0 l* l% Q
byte Texture;
$ x7 G( c$ Z6 I0 a2 T8 ~$ \
FontGL font;
9 x+ x% v" l* Z
void initial(void);
+ f+ Z' |, g5 P9 A0 [$ q2 J. G
void finish(void);
' Y% G% H$ ?+ d7 G7 _
void draw(void);
; D+ j* e0 R1 m$ Q; F2 i: ]
};
3 {/ j3 i b/ U0 q0 v6 Z9 V
void MyTime::initial(void)
/ @) n& t/ E* F% q6 \9 ^9 [" U
{
' s/ I4 X3 P/ `. M0 ?' K% Y, Z
// 載圖 初始字型
4 I8 o; [4 t6 Y. T& r2 }6 W
font.InitText();
: `+ g" I9 U# ^9 Y! X5 e- a
glGenTextures(1, &Texture);
% r5 E1 ~1 m" K6 A; z& e" ~
}
: p' y, n9 ~8 s
void MyTime::finish(void)
( G' _; }, b P6 Z7 y
{
' G5 y& W1 a! O' Q: G
//釋放圖形 字型資源
2 v. Z7 Z d9 Z+ o
}
) [' ?( @5 e- X) j6 u' s# t& g
4 P3 Z9 |9 j% a+ Q" U
void MyTime::draw(void)
3 X- k. W% i P6 {8 }: |
{
/ n! Y5 L% ~1 ?( y( u
// 顯示現在時間的字串
3 O: U) n: `; g$ [. s
font.Print(......something...);
, {7 B1 r7 i5 l0 i/ G* Y
// Buffer For Object Information
0 T$ e$ C0 y8 Q# P* }+ z
glMatrixMode(GL_MODELVIEW);
1 a) p4 O. O6 |: x* P) M5 D' d
glLoadIdentity();
& i& E5 t" l/ G! i# Z7 b
glTranslatef(0.0f,0.0f,-1.0f);
" `* \8 i( h- s# u- ^. p
glBindTexture(GL_TEXTURE_2D, Texture);
8 F1 i0 g9 x1 l7 v. W$ |1 i8 r
" I5 s* N9 Z7 n6 F: ?
..... DrawSomeThing
" m# Y+ {8 ^5 l' r) n' y4 D
0 P0 X8 a# d0 X% }. M9 i
}
) Q6 l1 e& }# k5 r0 ~- z9 c
. J7 i7 d2 i; W7 C# C; o1 t
0 s* d# h/ l$ O# `! s
MyTime time;
1 h" ]6 O0 q- ^' S. y. s3 _( a- m
void WINAPI wglSwapBuffersCallback(HDC hDC)
1 N/ W- w. C- {) B6 s0 v7 p: t0 ?8 z
{
2 p0 O Q5 ?( m) }& w3 |- N: O
time.draw();
4 ~( d7 n! {7 m
wglSwapBuffersNext(hDC);
/ {" o: W0 A; B5 K" M2 n2 o* d$ O
}
1 Y7 q" U. Z+ t* X) M
* N( [% z6 |4 R
你只要掛進去前呼叫 time.initial();
7 e+ X# V, x+ [2 Y% y: l: G+ v1 i/ E; K4 N
結束呼叫 time.finish();
& d$ t( G7 b( c- {* w- U
6 u" V2 m$ k9 X) A9 L" y
. l0 q2 d$ w. D# f
4 y3 B/ Z: w& C0 R3 ?" z
; b# B% W2 W2 F; {: l
作者 : fushunwu(fushunwu)
! H# M- P2 I0 b$ T' z4 l; l* `
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
0 t. v4 a& l' U* ~) N5 D
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
" q" P( ?$ F3 G8 i0 A( j
2006/9/7 下午 04:19:31
1 A; p. ^5 G# S3 L2 ]: c+ @, R+ G' ]
?& }$ K" C8 o- m) d% D
謝謝. 但我還是有幾疑問想要請你幫忙,麻煩你了.謝謝 ~
% \% P" u, K1 M: X/ e
- h; ~/ Z5 {. h8 W6 D0 k
(1). 因為我要固定放現在的時間字串和BMP圖在被我Hook的Game上面,所以我必須要知道那一個OpenGL的API是一定會不斷地被Game來呼叫,這樣子Game畫面才會不斷地更新.
. J$ h) o# p9 [7 c# h: N
時間字串也才會不斷地被更新而BMP也會不斷地貼在Game上面而不會被Game遮掉.
2 a, g2 W. N7 {" ]+ V
像是DirectX Game中的Present API就會不斷地被呼叫,所以我只要把現在的時間字串和BMP圖放在這個API裏面就OK了.
& z( h* t% r8 R% g
所以我想問的是OpenGL Game中是不是會不斷地呼叫wglSwapBuffers這個API,讓畫面不斷地更新 ? 還是有其它API是一定會不斷地被OpenGL來呼叫 ?
1 S ^' c* L$ `4 v! D
! p1 G: t' @8 N! M
. ~% t; b+ u' a( @7 p
(2). 現在OpenGL Game看起來都不是用Pure OpenGL API來製作,比如說像是用Glut
. {1 ?7 i# G9 s& U
來開發,他們是只是封裝起來底層還是需要用到Pure OpenGL的API 嗎 ?
6 T6 P# P% k% X! G
這樣我寫的Hook才可以通用其他非Pure OpenGL的Game.
}% ^- b( @* U2 u6 A: W) v' l
* t, Z0 W( }. f7 ]0 R
(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
: q$ n- G6 e# v9 Z0 J9 Z. Z' I( g
7 Z6 x% v& E, I t
4 S7 C0 D Y. H/ W; ]8 o) ^8 ^8 V1 T
# y! W# W+ A/ e5 ~( q9 N7 j# x
+ |6 i! e. F6 `
6 \2 v$ r: U% [# D, I
作者 : dorkas(aming)
/ ^0 e' H6 c- X3 m
[ 貼文 2621 | 人氣 4536 | 評價 11800 | 送出評價 2 次 ]
* c' P& w( x4 p) m: f$ i
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
5 P v; T2 w$ W' u) d5 m
2006/9/7 下午 05:31:01
! C' z; ]* b* l; k7 d7 i5 V
3 G# o$ N: d1 n( E9 E) ?# C- J
1&2
. ~' J3 |# W9 E. H& ]' R8 N6 V
我對OpenGL不熟...
/ h( y$ T4 G4 _, P2 _# ?2 q
4 z, Q. r; C! ^& S; D) c' K# G* V/ i
>(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
! Y+ C: y) f+ j- ^, n; U
' u! w$ a4 |8 }4 {5 m
6 E4 W' P2 D/ K: f. W% q' q
初始跟結束都是做一次的就好了
% }/ z, d' B" F4 g
你高興要擺在迴圈裡面也是可以
8 `; |# b1 ~. }- c. _
' j1 f1 W8 `. ]
程式的要訣就是 起 承 轉 合
/ C% e' q+ ^9 m* b9 ]% A7 |
initial
8 E) z) t D3 v2 {4 a% D& P
upDate
6 Z: l* V5 ~9 r. A; U l \; `7 Z
change
" L z- V/ s5 U6 s" w0 E
finish
) s. ?! J5 E6 }+ K. H
物件也是起承轉合
2 T1 X6 G9 f' c/ ^+ A3 [
函數也是起承轉合
3 l' b4 S' ~- \5 C5 {
迴圈裡面也是 起 承 轉 合
5 o( u' @1 p. B
6 v0 M+ x- j8 M0 S0 P9 @3 t
起
8 A$ S' d, b; C5 @* G
for(起;承;轉)
6 S! y) H- r, \
{
6 O! v2 x: H! n2 I/ F, o
起
7 T# }+ j N" O7 Y
承
3 S4 O& [* |9 d& I) ~2 {1 J! D
轉
& q+ n9 h; B6 y2 I4 ~" q* p
合
* {2 _/ e y" Z7 {( }3 i! p# L& h6 Q
}
6 M; |& ?+ ?0 f. j- f* ]
合
: D8 G' ~; J/ y0 R" q% E
. E7 B; u ]+ y" ?
只要你分的清楚 屬於那一塊的性質就好了
; j; W- x. i. _8 j% ~3 A* K! d
/ J0 b+ d( m& T; e
7 v! P3 ^4 V7 m* a+ a$ z
{4 ]* _5 u: r, T, C, o+ t
, ~. [! G2 y3 x y1 }: i
% s* ? j: g0 v8 s$ B2 h# G, K
作者 : fushunwu(fushunwu)
3 V0 k5 o8 @) ~; O1 B; o5 }7 V! `
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
1 t8 e! J9 Q; o, L: l
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
- B& @ z( J0 J! }. w2 B
2006/9/8 上午 10:32:26
: t. A7 l) ` r# n
; z7 I) B# B* s7 Q, y; D
恩,還是要謝謝你,目前問題還是沒有解決.Quake4和CS 顯示的狀況還是不一樣~
7 a, [- f' u1 K
+ W1 N" r2 P/ a7 U# E; K
像是Quake4這個Game它就沒有使用到glBegin這個API 所以我hook不到glBegin
6 p1 ]' Y2 z) F6 ]3 p
所以我就把顯示字串和BMP圖放到swapBuffers裏面去做,字串可以正常顯示但圖秀不出來
; H, z; U$ S+ b" Q; X1 X
我在想是不是因為座標還是矩陣的問題 ?
! M. Y# u3 Q' x
' b) i2 f* ~' I, \& [
但是CS放在swapBuffers圖和字都顯示不出來,但是因為CS有用glBegin所以我就把同樣的code放在glBegin裏面,可以顯示字串只不過會顯示很多個,我在想是不是也是因為座標還是矩陣的問題 ?
7 ~6 |) M& q5 Q! H' Z
至於BMP圖在CS片頭時可以秀,只不過會秀滿全螢幕而且是顛倒的占滿整個畫面.
5 K: e4 h b0 S, ?1 q
/ A& }& ^; _9 n1 K0 W4 A& u
所以我才想說有沒有一個統一的方式可以讓我把同樣的code放在某個OpenGL API裏面去然後每個OpenGL game都可以正常顯示.
作者:
海心的剑
时间:
2010-1-24 15:03
一丁点都看不懂。。。。。。。。 [s:60]
欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/)
Powered by Discuz! X3.2