本帖最后由 shane007 于 2023-9-6 16:01 编辑
# t# z" a! e7 u: K+ P6 {* W ?6 C* w: z/ \$ N5 ?
生成了一段最接近于游戏原本代码的代码。把这个程序调通之后,将相关代码段取出,放hook dll的相关部分即可。5 v5 |9 f& a, \1 s' U
, n8 s- w1 G8 Y5 [" u5 tchinese.txt保存游戏中所有不重复的汉字。/ i4 r+ O0 f: I
hook dll在初始化阶段,执行initialize部分代码,初始化字库。1 G% u/ E. d6 P- P& l% z! Z9 c
显示部分依旧可以用glCalllists方式实现。( R1 ?3 v' ?& ^. N
/ b0 b. s! t+ [9 j6 A
- 这段代码会根据 chinese.txt 中的中文字符创建字形位图,并将它们存储在显示列表中,只生成 chinese.txt 中包含的中文字符。确保 chinese.txt 文件包含你想要显示的中文字符。
复制代码
* v8 C$ B H" a S; }/ e4 {
: n2 G$ T3 o$ J- C5 X) H( A/ c
9 J7 x6 }% \, `/ t1 \' ]- #include <stdio.h>
8 `9 Z M+ O+ B" a9 @% x# S - #include <stdlib.h>
- j+ l( X* d: I - #include <GL/glew.h>8 h( o7 [" i8 B; g7 K, \
- #include <GLFW/glfw3.h>
, b" K' U, m: d/ Q0 J - #include <windows.h>
D0 F4 m" M7 {/ b' t% q* L- \
6 J7 F8 j- A1 Q7 O$ j1 r- GLuint fontListBase;
9 _6 K+ l4 v( |* E - HFONT font;
6 I! ?9 c( l$ V# U" K3 q - GLuint fontTexture;
E7 S: c9 ~4 U5 D - 1 J/ z5 [! o- V2 R. Y; h
- void initialize(const char* filename) {0 d! a& d" e) q) C: ^% k$ l- i: T
- FILE* file = fopen(filename, "r");
) D% J7 m1 e3 ` - if (!file) {
) r2 P1 }0 J: t$ P9 D" K - fprintf(stderr, "Failed to open file: %s\n", filename);' |5 R: U& _, E
- exit(EXIT_FAILURE);6 `" R+ D! `, \* Z6 v
- }+ e3 Z# D/ n3 K0 G9 I
- . Y0 z( R& O" r# @. q- _$ w
- char chineseChars[128]; // 用于存储中文字符
6 G* i7 ^& Y0 M( F* t - int chineseCharCount = 0;6 ~" ?- ]8 O' H* d! Z. s. t4 o9 R
- . B1 O H) s- ~# E% r1 E
- // 读取中文字符并存储到数组中7 ?$ \- \% a9 i/ p
- while (fgets(chineseChars, sizeof(chineseChars), file)) {
& t2 j7 W: C F4 K9 v - for (int i = 0; chineseChars[i] != '\0'; i++) {
6 i$ O, w$ W% g% W - if (chineseChars[i] >= 0x4E00 && chineseChars[i] <= 0x9FFF) {
' S1 k1 D- w$ _( J* {1 Q/ D) R - chineseCharCount++;* `- ]8 t) Q/ g9 n
- }
! c @& a C& H6 e; E2 n - }
4 A3 J$ x2 z" H& m8 O$ ~# N - }' |9 V. T- G+ ^+ X$ T
- % O# k0 p: c( q6 Y" L
- fclose(file);" q1 g" y0 e, @3 e
- 8 o$ y, H3 m: R, n* x
- fontListBase = glGenLists(chineseCharCount); // 为中文字符创建显示列表
, `$ V: Z; P. l, B/ H- n( s1 P
- J; |. t0 R$ u. Y+ I1 b- font = CreateFontA(7 J7 T6 H" l* q4 H) s
- 48, // 字体高度
@, U8 q1 l! Z; z, d5 e - 0, // 字体宽度% f! q0 o9 @3 H. D
- 0, // 倾斜角度# ~$ q2 O: u) M
- 0, // 倾斜方向7 w- o8 `& E' V- P
- FW_NORMAL, // 字体粗细. w0 m8 S- |. ?& G0 {: P8 x
- FALSE, // 是否为斜体
2 R8 [1 S. z$ G* Y* f1 M - FALSE, // 是否有下划线( A6 i) V& q& K4 o, \& a- N
- FALSE, // 是否有删除线0 |; i9 s) {0 C2 i* F6 o" e
- ANSI_CHARSET, // 字符集
% ]6 p! N5 M+ |7 X8 G) { - OUT_TT_PRECIS, // 输出精度3 }. J7 |1 w3 \) O( T+ u
- CLIP_DEFAULT_PRECIS, // 剪切精度
+ W9 m8 M4 ], a) z- N; y - ANTIALIASED_QUALITY, // 抗锯齿质量 L$ ~, s: \! j% F
- FF_DONTCARE | DEFAULT_PITCH, // 字体族和字体Pitch
& r; }% C j* X1 [+ L3 V; D+ N) H - "Arial" // 字体名称3 p/ b, H% }# ~/ A: W
- );) i1 Y1 l' O/ _6 t2 Y
- ' Y" S5 N& [; R9 X
- HDC hdc = wglGetCurrentDC(); // 获取当前OpenGL设备上下文的句柄
- A/ ]9 {2 V( Z: j - HFONT oldFont = (HFONT)SelectObject(hdc, font); // 选择字体
8 Y$ [/ J; r! ]1 X. W
8 a$ p) d6 Q- k6 E& B( q- int currentListIndex = fontListBase;6 d l7 x& }' g6 s0 W5 u9 u# R
- $ U/ d4 ~7 D- c; I- M2 a# w& ]
- // 逐个读取中文字符并创建字形位图存储在显示列表中
" R2 O. ]8 Q( S - file = fopen(filename, "r");
$ {+ L9 w3 a( c& C( V - while (fgets(chineseChars, sizeof(chineseChars), file)) {' c* e% @ a" D4 v& K6 K/ m: Q
- for (int i = 0; chineseChars[i] != '\0'; i++) { }5 f4 I( s6 L5 {+ F, e6 o
- if (chineseChars[i] >= 0x4E00 && chineseChars[i] <= 0x9FFF) {/ b2 r3 h) }9 L+ B/ {8 y6 h
- wglUseFontBitmapsA(hdc, chineseChars[i], 1, currentListIndex);' O0 y* v- J4 T9 y. Y$ r
- currentListIndex++;6 w y+ R. _/ n Z, p
- }3 R- h- S% F' G3 k0 X
- }
+ e' D% V3 y! ?5 X8 @ - }8 M, B; a: V' w+ f1 j5 j7 x! g
- fclose(file);
[6 H; }* P: L* X2 b( ^ - # z8 s/ _, K0 ^( |( B R/ p
- SelectObject(hdc, oldFont); // 恢复原来的字体
; | |+ v" Z& ?& z$ P n - / v& W. G, I+ [* Q# P2 w
- glGenTextures(1, &fontTexture); // 创建纹理用于字形位图% I& U# W+ [& t& K
- glBindTexture(GL_TEXTURE_2D, fontTexture);9 W5 C/ `6 O! E9 J& |4 h4 p) |
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);. T; z/ e& j V- y% x. @4 u
- }
! _9 r9 x8 m5 q z6 b6 b3 v - * f+ Q' r1 `/ _3 I I6 t
- void renderString(const char* text, float x, float y) {5 x' B& [# }5 t: n! w K8 y# z9 b
- glBindTexture(GL_TEXTURE_2D, fontTexture);
0 `1 ~/ r" u+ c# e8 C M% |
5 u. K8 q. U/ @9 {# j3 e1 a- glEnable(GL_BLEND);
7 c0 t6 F/ E- J, o. S6 |# | - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
. t5 M Z3 }0 `2 h K0 g
+ e7 y) B4 t* }+ D- glRasterPos2f(x, y);
! U4 g4 a; S( Q1 j! G- Q
! Z* c: q2 u- r' i {5 I2 ^- glListBase(fontListBase);
$ x3 ~: O& a; ]$ s/ `( i" N
, K4 [, s8 b- t: M4 c. o0 c% S) ~- glCallLists(strlen(text), GL_UNSIGNED_BYTE, text); // 使用显示列表渲染文本, s" W; X: B( A T5 |. I4 C
- i# ?6 J6 z/ O& f3 e( y5 u
- glDisable(GL_BLEND);
5 ~& [. g3 x" W) r' u - }
) V7 D& s3 ?3 U - # q% W8 E1 k$ r
- int main() {
- t- _- Y6 b E& j0 ~ |: ~8 h - if (!glfwInit()) {
! z9 s1 a3 A6 t1 D4 b - fprintf(stderr, "Failed to initialize GLFW\n");( |+ G! `) y& H# T: [3 e
- return -1;& V7 N0 z6 ]& f, e/ {
- }
! S& Z1 B: L" j: J) f - + S- {* A- w. q4 C2 i
- GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL Text Rendering", NULL, NULL);' [; [, W2 L* Q
- if (!window) {0 C$ |$ N f& z
- fprintf(stderr, "Failed to create GLFW window\n");! C) m& } f: u# i$ k5 S
- glfwTerminate();* Z# v3 @+ B8 ]) z8 g0 ?. Z
- return -1;- V2 [& \" U7 t( n* ~7 B, q0 r
- }. z# k5 ?1 C: w5 e" v O
- % `! R: R9 u0 @, w5 s5 v% F
- glfwMakeContextCurrent(window);$ C1 n3 v4 q1 X5 ]1 E5 g: Q7 O! z
- glewInit();9 b6 d7 g: u. l, a" m
- " [( `0 {2 v; h8 O( q
- initialize("chinese.txt"); // 传入文件名
. G' d% W( G* O" a& e - 9 c- O) B" g/ E& ?
- while (!glfwWindowShouldClose(window)) {
! T9 [8 Y6 `3 y i1 z* U - glClearColor(0.0f, 0.0f, 0.0f, 1.0f);- a n s! f6 `+ _) i q! Z
- glClear(GL_COLOR_BUFFER_BIT);' o4 s5 _/ l4 ?" Z
- 9 W4 C0 ~% Y1 d$ m" ]
- glColor3f(1.0f, 1.0f, 1.0f);6 u0 t3 z# M! e/ y ~1 h2 M
- renderString("你好,OpenGL!", 100.0f, 100.0f); // 示例中使用中文文本+ C! U4 V+ M+ ?# b: L" F5 n) [2 ^
# X+ @+ Q; _" a. P( O- glfwSwapBuffers(window);
1 c. o! G( p7 x* f# x1 D - glfwPollEvents();5 ^4 q' t# ] Q; l6 I
- }7 T1 l$ e' I8 o' R. o
- ) R7 X/ ?) x' [% A. L0 y5 C
- glDeleteLists(fontListBase, 128); // 删除显示列表0 J) q% Z8 g. ~+ e
- ! H5 I% ?; C* d/ g1 W
- glDeleteTextures(1, &fontTexture); // 删除纹理 z. T. M- B+ d3 }7 m) k0 ~
- 7 ]& {8 T+ J" @4 ?, v" o9 J" C
- DeleteObject(font); // 删除字体对象* ~0 J" W) F# s, O/ L% A) w
- 9 U3 ?2 I8 g5 d
- glfwTerminate();- [/ S8 N/ ?; a/ Z( ^7 b3 ]7 J
- ?- k4 D: o& ]2 t) q# ~3 S
- return 0;
1 [, J" f% i: y' H - }4 S( {. b: |. |1 q+ @2 f
复制代码
7 L. m5 y- K0 X6 a2 Z& Z+ B: \1 p2 z8 x/ x. t/ Q. U
Y8 p5 x4 y8 M. X
|