最近对OpenGL进行了一些研究,有了一些新的思路,先写下来备忘。% O" F4 A, t/ ?. J {% ? N
$ }- }: d: S6 X5 |
OpenGL的汉字显示,简单的说就是先用wglUseFontBitmaps函数把所有字符生成显示列表,
" q- w1 R+ J! }. \然后用glCallList把显示列表显示出来。! J7 u: t U; r
5 e* ?7 H2 A- c: C1 n下面说说汉化思路
( l6 f, A; q+ C$ _思路1. 英文游戏一般只生成了英文的显示列表,所以通过汇编级加大显示列表的容量,把所有的
* v$ C0 y H2 n2 _0 Y 中文字符都生成到显示列表里面,估计就可以实现汉化。当然,程序的性能可能会有影响," t( @1 [1 N. K7 }2 ^% d+ P
但是,我认为生成显示列表一般在游戏初始化的时候进行一次,所以问题应该不是太大。$ D5 n9 t _0 d' {
下面的帖子可供参考
1 c0 ^7 ^" O& C: n" J$ n Win32下OpenGL的中文显示
# V2 f" g; R' k3 x: u, R https://www.chinaavg.com/read.php?tid=20406
( v8 @+ W2 c7 Z, Z$ U3 l" [4 R4 R! |, o$ y
思路2. 根据我的理解,游戏更新画面的过程一般是这样的
?. q" i4 A/ C- I! E& d$ h M" n/ t( r0 V- |1 o* G
更新画面函数(区域1)" d- e, l. l# m8 u3 s# f4 `
更新画面函数(区域2)' t5 z- Q/ Q) B9 D
。。。" m2 U! I% z2 Q- \" G. E* y0 x
更新画面函数(区域3)
, p2 A5 q9 z. w- h% L2 d1 Z0 p 显示函数(字幕1)
$ A% I, L% m9 G r 显示函数(字幕2)
6 {2 h: z4 E7 A 。。。5 f* `# a1 L/ W8 N: r
显示函数(字幕3) & J) n) \# l- M" M
SwapBuffers(wglGetCurrentDC())# F) p) }$ K' u
' y9 E2 K" O% {3 s
所以,在显示函数的入口处,我们可以内挂一个DLL,把要显示的字幕输出到一个ini文件或是内存镜像文件中,然后HOOK SwapBuffers函数,在调用真正的SwapBuffers函数以后,读取ini文件或是内存镜像文件的内容,把要显示的字幕用textout函数显示到当前DC上,即可实现汉化。; j- @; L% \7 F
& V- K m1 u7 w/ x( w$ y 先把汉化思路写下来,等有空的时候再做试验,期待可以解决nibiru等使用opengl API的游戏的汉化问题。 |