最近对OpenGL进行了一些研究,有了一些新的思路,先写下来备忘。9 t6 E( ~ m2 J7 o# S: q
, K3 M# j- ?, M, }
OpenGL的汉字显示,简单的说就是先用wglUseFontBitmaps函数把所有字符生成显示列表,
$ ]- @ e$ c% c. D4 a( l1 s2 k8 q然后用glCallList把显示列表显示出来。
n" V" K B8 Z9 g" `" y" O' {& p! N* M$ A
下面说说汉化思路
. P/ u3 l% ]: H0 [% H- A5 R思路1. 英文游戏一般只生成了英文的显示列表,所以通过汇编级加大显示列表的容量,把所有的
5 v1 F: V0 x) o2 \' L1 } 中文字符都生成到显示列表里面,估计就可以实现汉化。当然,程序的性能可能会有影响,
; [: o3 [4 r! Q2 g* }) h 但是,我认为生成显示列表一般在游戏初始化的时候进行一次,所以问题应该不是太大。
: U6 o8 w: ]2 K 下面的帖子可供参考/ z0 ?) P* I/ Z% @" g
Win32下OpenGL的中文显示
8 G6 R# X# f! v+ J8 p https://www.chinaavg.com/read.php?tid=20406
8 }& k" e. m% W3 e! @" n" h- r, J2 r H/ {7 U
思路2. 根据我的理解,游戏更新画面的过程一般是这样的
! B" N! S% X3 a- ]: h$ _% C5 v6 W" Y* {! Q, Y
更新画面函数(区域1)# S2 M! x4 i) [: N
更新画面函数(区域2) ~* B+ [2 _7 a4 Z' K0 i/ K
。。。
! m" e# r o: t K 更新画面函数(区域3)
6 q6 u. }5 S; B. g+ ~ 显示函数(字幕1)" d; E; U) G) }2 z
显示函数(字幕2)
, x9 h/ J; u1 Q1 o+ A 。。。! j6 S- l5 ?# D4 D/ n7 d0 g& k/ E
显示函数(字幕3)
( G! ]8 ^# a' c" i0 B# }/ G SwapBuffers(wglGetCurrentDC())9 G: |6 j$ h7 K% o3 [, R
5 T% D: b! t& ^6 _0 `3 } 所以,在显示函数的入口处,我们可以内挂一个DLL,把要显示的字幕输出到一个ini文件或是内存镜像文件中,然后HOOK SwapBuffers函数,在调用真正的SwapBuffers函数以后,读取ini文件或是内存镜像文件的内容,把要显示的字幕用textout函数显示到当前DC上,即可实现汉化。0 {, [& `; ^% Z& U, y( k3 f, ~
$ v2 l- L b R" W) T Z7 L
先把汉化思路写下来,等有空的时候再做试验,期待可以解决nibiru等使用opengl API的游戏的汉化问题。 |