本帖最后由 shane007 于 2023-9-4 18:48 编辑 # T7 z8 ~: e2 I4 n4 S; q$ F1 p+ Q
7 m q. S/ K/ l9 ]3 n
这是个opengl引擎的游戏,对opengl的初始化是在scream.exe里边完成的。
9 @' @9 }! B$ b' l7 G% t对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数
6 ^! K" W& l0 t) x
j% B- y* [/ |. B* w2 \- ~$ t
2 l% @3 r/ }. _( f# H6 MglGenLists的调用有4处,前3处参数为1,应该不是。' S+ }, L" A) r T% D) ~& w2 V0 J! B
一下是第四处代码,这里应该就是生成字体的地方。# F8 D0 i6 x* J/ }- J5 S5 Q; a
从代码里可以看出,字体材质长宽各是16各字符,共256个字符,此处要修改。0 z6 ]( P) P% a9 w
- int sub_40BEB0()
, Y5 }7 T" |* c - {
, [7 \. k3 h# m/ g* U - signed int v0; // ebx4 X D$ u/ m& S' X% b# r+ I8 C
- int v1; // ecx
1 ^0 n; q! N) P% d+ ~ - float v2; // ST18_4
! m4 `6 D" v+ Y0 p. a2 ? - float v3; // ST1C_4& m8 n9 X+ s( \( v# V. X2 y
- float v4; // ST20_4) p# I9 Q/ g3 G" B+ J
- float v5; // ST24_4
/ N, _; {- ^6 v# d( e" I1 G - int result; // eax
2 k) b# `. F9 l, N9 J
, f) T' c8 B8 P0 Z3 l' c, A, ]- v0 = 0;) C, n/ Z2 N V
- dword_4DF5130 = glGenLists(272);# u8 j' p9 H1 L9 n/ _4 T. z
- do
- G# P( w7 k3 Z - {: u' H7 n8 I7 s# L+ @8 @
- v2 = (double)(v0 % -16) * flt_483450;; D, I3 K# k8 O5 ]
- v3 = (double)(v0 / 16) * flt_483450;
8 ^1 E) y# Y! m8 g - glNewList(v1, v0 % 16, v0 + dword_4DF5130, 4864);4 y, q( a6 l9 V
- glBegin(7);2 B" O' o r! |2 }
- glTexCoord2f(LODWORD(v2), LODWORD(v3));
& Z. k* X8 ^- X. K! l9 h. m - glVertex2i(0, 0);
; @; K# m* [; b - v4 = v2 + flt_483450;
; C" P# v# z6 {0 C# B# D - glTexCoord2f(LODWORD(v4), LODWORD(v3));! S# a$ R" T. C$ e% G1 C& h. N. ^! ^
- glVertex2i(16, 0);
' m9 P5 K/ A" G* N; K$ I' k - v5 = v3 + flt_483454;
0 D" F8 L6 K8 _. H7 {: B, [ - glTexCoord2f(LODWORD(v4), LODWORD(v5));
) U% U0 G8 k- Z2 t* {# r - glVertex2i(16, 16);0 `) H* X5 X# Q* I5 j( O6 e
- glTexCoord2f(LODWORD(v2), LODWORD(v5));/ m# ?5 u/ ~0 w5 Q; P7 R
- glVertex2i(0, 16);7 P* q# W) N$ S- @2 o
- glEnd();( x2 e! b& O: o% r- X2 D
- ++v0;
8 E7 c! D- q! J9 b% F - glTranslated(0, 1076101120, 0, 0, 0, 0);
L0 ]4 z2 \. }8 i9 E; R - result = glEndList();
( a8 y3 Z' [. D+ @5 f7 T" _- N - }
) A( G. a* S7 @/ v5 F4 r - while ( v0 < 272 );& w; K$ M- Y8 H8 d
- return result;* J: i2 n; Y" [0 ^( }
- }
复制代码
$ ^) Y# v1 z2 W$ \* o4 J: L {; Q9 p# [: n% g% D2 O
对glCallList的调用只有以下一处,! D' L5 p" a' F7 ^$ j a
这是显示单个字符还是字符串的方法,待以后再确认。) ]" O9 R/ K9 G( H7 W& x3 P) `8 y
glCallLists(strlen(&v7), 5121, &v7);$ d$ A: I, p) ?( n. f6 \
5121为0x1401 ,即 GL_UNSIGNED_BYTE ,是单字节。
2 ^) a E: J3 {8 O \7 [+ f5 y; V9 D$ I+ s" w u; Z& }
- #define GL_BYTE 0x1400
8 ]9 i8 }) l$ b0 Y - #define GL_UNSIGNED_BYTE 0x1401+ e- U. A( ?& r" J+ E- e+ @. }
- #define GL_SHORT 0x1402( [5 G8 p+ W, ] I j
- #define GL_UNSIGNED_SHORT 0x1403
' C1 D9 T4 G/ D, P3 @0 S; d1 t - #define GL_INT 0x1404+ M- g! e$ J0 d
- #define GL_UNSIGNED_INT 0x14051 \7 M- W3 m$ a; c& Y, r
- #define GL_FLOAT 0x1406
2 C% g3 x' g! x! W# O: F6 P0 W - #define GL_2_BYTES 0x1407
8 c/ a! H, n1 W) k1 y - #define GL_3_BYTES 0x1408& l4 V$ c: `* U8 G+ P5 y ?7 g3 a E
- #define GL_4_BYTES 0x1409/ O8 f1 q- m; G
- #define GL_DOUBLE 0x140A
复制代码
; j# F; ^" u) b7 T
8 c: p( ]3 b: c
4 G! _/ g D$ p8 N3 v& q- int __cdecl sub_40BFD0(signed int a1, int a2, int a3, int a4, char a5)6 }. ?) }2 j+ M% `% S
- {1 g1 U: X" q' Z5 O/ V9 P
- int v5; // ecx
c+ A1 u3 g5 O4 e% @! g - int result; // eax
' O8 I- t* s6 l* q - char v7; // [esp+18h] [ebp-118h]$ z6 ? R* Z. O0 N! n9 [
- char *v8; // [esp+118h] [ebp-18h]
7 K: o* V+ x% y4 n - int v9; // [esp+11Ch] [ebp-14h]: K5 s& W* v3 R9 [0 ^
- int v10; // [esp+128h] [ebp-8h]# m) s/ L4 i: ^
) S( X" I7 P5 ]: @7 }$ c$ @( M/ {2 ~- v10 = v5;. [4 Y& }/ p8 E5 L- @2 s* q
- if ( a4 )8 X s. E1 m6 @# ?
- {/ n- i B6 C" k; G
- v8 = &a5;
# @( i3 ]" g2 f6 B. D' m - sub_41BA00(v5, a4);
R' u& A# Q" o( A+ u7 @5 g - v8 = 0;5 e5 U% m% P: w1 Q0 ]" m
- glBlendFunc(770, 771);, s; |$ i% F F5 w. V) K
- glBindTexture(3553, dword_4DF3BC4[8 * a3]);+ u2 S6 Z" ^4 m
- glPushMatrix();5 B+ S4 r+ U r$ G# O
- glLoadIdentity();0 o* `3 N7 T! W0 `9 `+ I. h/ s
- v9 = a1;4 w& h& |" t* a: g
- glTranslated( v, A5 d0 F' f q7 b
- COERCE_UNSIGNED_INT64((double)a1),2 q3 K( ~2 o% Y1 z- x N; [
- COERCE_UNSIGNED_INT64((double)a1) >> 32,+ a5 W; h) x' b- b& h7 H. y# W
- COERCE_UNSIGNED_INT64((double)(dword_4DF8B68 - a2)),
" R. H4 t) b' ` - COERCE_UNSIGNED_INT64((double)(dword_4DF8B68 - a2)) >> 32,
. Q5 j; H. E- }/ G) o - 0,& m( s+ S$ }1 n! s: r
- 0);
9 e; |$ i( g: V9 E$ s J - glPushAttrib(0x20000);
K( D) D; r& H - glListBase(dword_4DF5130 + 16);# ~/ s" u5 d9 {9 P
- glCallLists(strlen(&v7), 5121, &v7);9 j% w% X Z. K1 C7 ^
- glPopAttrib();& _% J3 l# F; Q' P& H: c
- result = glPopMatrix();
. n0 U+ D i$ s - }
4 [% Z# ^- a6 `* C5 T$ P9 ^ - return result;
3 W9 X& N2 P2 x- \9 u - }, @5 q/ i9 b! ^
复制代码 " S# Z; W, v+ q$ x5 o; A
, a4 ?3 d5 ]4 k
0 d9 N4 F( C8 V4 _# e1 x. G |