最近对OpenGL进行了一些研究,有了一些新的思路,先写下来备忘。
) m; r N2 v$ ^$ @7 C" h) G$ j; M9 ~
OpenGL的汉字显示,简单的说就是先用wglUseFontBitmaps函数把所有字符生成显示列表,- P8 j c& n( Q# z/ Z
然后用glCallList把显示列表显示出来。6 l/ V5 A0 H. L
! ]3 k5 Q3 W4 [% q. T' E2 b0 }" G
下面说说汉化思路
/ `, a; J, J4 @/ P思路1. 英文游戏一般只生成了英文的显示列表,所以通过汇编级加大显示列表的容量,把所有的
5 q' R; v1 h0 V& p/ R/ N 中文字符都生成到显示列表里面,估计就可以实现汉化。当然,程序的性能可能会有影响,
+ y* y* _$ ]5 } G8 { 但是,我认为生成显示列表一般在游戏初始化的时候进行一次,所以问题应该不是太大。
% e) A5 O2 u* N4 K9 f; K" x3 ^ n 下面的帖子可供参考
& i! c- Q7 e S& }6 B8 K" f9 k Win32下OpenGL的中文显示
) O, T, C0 e& O% g ] https://www.chinaavg.com/read.php?tid=204063 d; ^% x6 G' U# p( {: L) R
; l5 _ ?# Z& F6 ~( N& o' r0 g2 \
思路2. 根据我的理解,游戏更新画面的过程一般是这样的5 y. Q' W y9 x4 b6 E* R
- o4 b+ v# P0 o 更新画面函数(区域1)+ p! t3 W$ Y2 X; o0 G- b3 b3 Y
更新画面函数(区域2)* W; e% ]8 Z' b; _+ H. s5 `
。。。% e$ {, x& B4 Z1 C
更新画面函数(区域3)
5 a0 b& e. G0 q X; y+ E 显示函数(字幕1)9 J* p; F/ O' v" k2 B c
显示函数(字幕2)4 I/ T$ c/ X2 _2 K& l
。。。
2 V: r, S8 r; W6 d/ x% J" a C& m 显示函数(字幕3)
* I( J* e: F P# e) z SwapBuffers(wglGetCurrentDC())
# r* J# Z. H- I % m1 ~8 l( n2 X" ?7 ]0 L4 W, K* P
所以,在显示函数的入口处,我们可以内挂一个DLL,把要显示的字幕输出到一个ini文件或是内存镜像文件中,然后HOOK SwapBuffers函数,在调用真正的SwapBuffers函数以后,读取ini文件或是内存镜像文件的内容,把要显示的字幕用textout函数显示到当前DC上,即可实现汉化。. S3 ^ Z. l5 J, ^. c
' z' d7 \: }# x$ z6 F 先把汉化思路写下来,等有空的时候再做试验,期待可以解决nibiru等使用opengl API的游戏的汉化问题。 |