本帖最后由 shane007 于 2023-9-4 18:48 编辑 : O8 e( ?" \3 j q- t$ ^) B3 K
7 Q. y6 {3 Y# B; b: i# b1 |" A* @4 _
这是个opengl引擎的游戏,对opengl的初始化是在scream.exe里边完成的。5 d" {& {+ f- A& B3 d+ c% x/ F
对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数
$ e Y; ?# w4 c2 c5 z) o6 p2 X5 M d/ S
/ n, S4 i1 s. T* a8 }glGenLists的调用有4处,前3处参数为1,应该不是。. T; O! ?$ {" |. k& l! s- m
一下是第四处代码,这里应该就是生成字体的地方。
9 D( V4 b5 ?& b5 y; p从代码里可以看出,字体材质长宽各是16各字符,共256个字符,此处要修改。
6 f4 Y$ ?& ?( h; X" S- int sub_40BEB0()9 V. u3 k& A# D4 Y2 { B- ~. w
- {4 ]' n* J$ u& C7 v' z* v
- signed int v0; // ebx5 q! n+ l$ t( {6 L5 W
- int v1; // ecx
4 z5 h# E6 E5 c8 D/ Y - float v2; // ST18_4
1 l6 `/ P' q/ t - float v3; // ST1C_45 `1 U! \# l5 w
- float v4; // ST20_4
" ?+ f$ ~9 I2 r! D$ y8 \0 y; u - float v5; // ST24_4. r8 P; V+ W2 H7 ?
- int result; // eax7 C9 M& a w, N" n+ k
- # s G# O; e6 ]* L& t
- v0 = 0;
4 ~ |* z' c; B: q8 G, |- D! X2 p - dword_4DF5130 = glGenLists(272);
* Z, ^$ p) [$ m; D7 C& ?9 P$ { - do
$ B H# n. g% W4 d$ Z8 ` - {9 u+ y6 ~0 m5 l
- v2 = (double)(v0 % -16) * flt_483450;
: j* j' a, o! r3 n; s% d - v3 = (double)(v0 / 16) * flt_483450;0 R* M8 L& S/ ^. E2 R" D0 j/ w- i
- glNewList(v1, v0 % 16, v0 + dword_4DF5130, 4864);
0 c8 @+ q3 G, v( Z4 H A - glBegin(7);1 Q* |/ f7 f+ b
- glTexCoord2f(LODWORD(v2), LODWORD(v3));4 D; a! |# |& p b+ t
- glVertex2i(0, 0);/ _: X+ z7 D% o
- v4 = v2 + flt_483450;
! y7 O# D- l1 _* h/ p3 w - glTexCoord2f(LODWORD(v4), LODWORD(v3));
, z# U" h r: y# F - glVertex2i(16, 0);/ G3 ^' c) M5 t7 O# k
- v5 = v3 + flt_483454;
* @% A$ \; b- w8 C8 d" \ - glTexCoord2f(LODWORD(v4), LODWORD(v5));/ `9 E. t0 w" a+ A$ j, L
- glVertex2i(16, 16);
, ?$ \2 ^' w2 Y, W" V% | - glTexCoord2f(LODWORD(v2), LODWORD(v5));9 y3 [% H# C G3 ~5 n4 L5 r) k
- glVertex2i(0, 16);& p+ ^- W S6 Z/ j# K
- glEnd();& R9 G% F8 K. U `
- ++v0;
4 o$ k2 u) C/ a+ k - glTranslated(0, 1076101120, 0, 0, 0, 0);+ U3 N' B9 l9 B/ S- s# {0 y
- result = glEndList();
) ~2 T: S/ V1 a - }9 b- O+ b$ o3 f, U: ]: |0 w4 ~8 \
- while ( v0 < 272 );2 V7 @# k; E" y# N6 _
- return result;5 P% Z% p) G, |; n, H
- }
复制代码 , j: \, Z8 t- g' v
4 A" |. M: i' \# r对glCallList的调用只有以下一处,) ^' {' ?. J. t( T; h1 B2 H) j
这是显示单个字符还是字符串的方法,待以后再确认。
: q5 P) z& A8 P( j: T2 H glCallLists(strlen(&v7), 5121, &v7);
$ x( r7 h: r9 U! c/ X- H. D9 G5121为0x1401 ,即 GL_UNSIGNED_BYTE ,是单字节。
; u' Q$ j! }& o- T3 F: [; H8 i+ M
+ U* B8 ]( b @. Q. ]: Y0 o$ s* P' c! e. g- #define GL_BYTE 0x14009 V5 a* `8 P2 I
- #define GL_UNSIGNED_BYTE 0x1401
6 S/ @$ c& M. T6 c+ i6 H - #define GL_SHORT 0x1402! N, o! i) A: F) n
- #define GL_UNSIGNED_SHORT 0x1403
^: @( d0 T j% A4 ~8 Y' v3 M - #define GL_INT 0x1404
i) S( d$ q' B {$ [ - #define GL_UNSIGNED_INT 0x1405) }" |! p0 S8 Z' ^7 C9 L: j( s
- #define GL_FLOAT 0x1406# V" [7 t5 u n$ V+ o
- #define GL_2_BYTES 0x14079 `- W# W) W) a9 F( y4 a/ r( }
- #define GL_3_BYTES 0x1408
. |* d! Z3 {# h: a8 Q - #define GL_4_BYTES 0x1409
; a: _# ^6 X5 O1 x - #define GL_DOUBLE 0x140A
复制代码 6 Y7 m/ }9 [9 L; a; k
5 k: [0 ~$ R) z N( \
; {7 F, f3 H. T: _" @- N- int __cdecl sub_40BFD0(signed int a1, int a2, int a3, int a4, char a5)& x$ p% d. a2 Q/ i( l5 \/ _
- {# o% r- A; b' \( O
- int v5; // ecx1 O2 I5 Z; K2 g6 T7 m
- int result; // eax
! d0 e6 f) w' Y; Z/ b0 P) {; }7 e9 f - char v7; // [esp+18h] [ebp-118h]1 O3 J# n: E. `% {( b3 F a
- char *v8; // [esp+118h] [ebp-18h]
5 d' T) o( W$ m4 ~+ T, a9 m - int v9; // [esp+11Ch] [ebp-14h]% w A. {8 B. U4 z
- int v10; // [esp+128h] [ebp-8h]8 M g9 d3 d4 [' }. h) k, U
- ( ~# b6 M6 z% z/ ]# O2 g) v
- v10 = v5;7 L& t" m& f' L/ O. A1 P
- if ( a4 )
. U {. l1 [/ N# Y' u5 ? - {
1 R9 E, C+ h* l1 a0 ?4 Y - v8 = &a5;
/ i$ W# ]6 W" z/ ? - sub_41BA00(v5, a4);( S; l; }1 |& c
- v8 = 0;
# z2 G* O$ Z: }. L9 Y" n - glBlendFunc(770, 771);% h, t1 H+ u( }* h, g5 `8 G! ?2 ~$ W. t5 z* ~
- glBindTexture(3553, dword_4DF3BC4[8 * a3]);. d5 i9 W9 o2 N: k8 Y3 |
- glPushMatrix();1 a# B- H5 k9 X# T
- glLoadIdentity();1 _5 Z4 J7 o j* @
- v9 = a1;/ y" H- K7 T# N [ y5 T
- glTranslated(
7 z1 N ]0 _8 D. d2 i - COERCE_UNSIGNED_INT64((double)a1),2 Y7 Y( G/ G3 V' M- k5 v
- COERCE_UNSIGNED_INT64((double)a1) >> 32,
1 x" j& Q6 b& s+ l& q1 Z7 ~ - COERCE_UNSIGNED_INT64((double)(dword_4DF8B68 - a2)),7 h1 M( w. j# o3 A4 s7 D5 i
- COERCE_UNSIGNED_INT64((double)(dword_4DF8B68 - a2)) >> 32,% F* Y, W! o% X- q1 \
- 0,; Y, |! H! @- ]& P3 a8 S E! K; g) e3 y
- 0);
5 b& Z5 p( X4 }4 [- o2 K0 a - glPushAttrib(0x20000);; z3 S- k) E! n9 |7 c; H
- glListBase(dword_4DF5130 + 16);' E U6 \/ M8 e, k' M/ I+ ?
- glCallLists(strlen(&v7), 5121, &v7);
2 u6 D7 y* n" e" g - glPopAttrib();
- d% g: W# w' w# C - result = glPopMatrix();
( t' N1 s. o7 n: e# I( | - }
1 G1 R" B9 O/ C$ g - return result;
4 `9 a T% S0 b0 M( ` - }7 x) k' D* M \, J
复制代码
{# g8 l- O; S0 w
r- U4 y% v( v% O" K: b. t) L% ~
|