最近对OpenGL进行了一些研究,有了一些新的思路,先写下来备忘。
3 A9 z1 E3 H: E. I! z4 B8 L/ R6 t3 U4 P
OpenGL的汉字显示,简单的说就是先用wglUseFontBitmaps函数把所有字符生成显示列表,. D7 Y* g- m4 V- `# x+ ^
然后用glCallList把显示列表显示出来。
' J: p! h: u+ M: [% k& _8 ] `$ V, J' F. p6 X+ S+ R R
下面说说汉化思路
( x, o7 ^: \% Z! G思路1. 英文游戏一般只生成了英文的显示列表,所以通过汇编级加大显示列表的容量,把所有的& g6 {4 O. l/ k8 ?9 |6 G
中文字符都生成到显示列表里面,估计就可以实现汉化。当然,程序的性能可能会有影响,. P$ r2 Y6 Q( w- d- {% X
但是,我认为生成显示列表一般在游戏初始化的时候进行一次,所以问题应该不是太大。
- m/ Z4 o) J2 `: J: c" M9 j' E 下面的帖子可供参考
/ k) |- |9 j# b Win32下OpenGL的中文显示
' n; H( Q# m' H' \' f9 v' e9 T5 | https://www.chinaavg.com/read.php?tid=20406
$ D. x6 H$ W8 E# K
" [" t+ i: V0 C思路2. 根据我的理解,游戏更新画面的过程一般是这样的
0 c/ R! f; y% |) _: ~1 ~
* x5 v- X% p! N7 e) ] 更新画面函数(区域1)
& B7 y" E8 D3 @) G1 e' X 更新画面函数(区域2)
8 K' Y/ ]7 m. t# B 。。。
/ t9 X# Q* `* E! C 更新画面函数(区域3)
6 j6 }. H" G% W+ c O. |, J 显示函数(字幕1)
# F" q/ d; r* o 显示函数(字幕2)
; G F; }, K3 B. V, T 。。。/ Z3 v! o- O7 B% U
显示函数(字幕3)
6 j3 x9 C& E: A6 J6 F SwapBuffers(wglGetCurrentDC())9 b/ o, Y! p! I& g$ V( T
2 ?1 ?: {" h8 _% F, c9 T+ X# C# h1 M 所以,在显示函数的入口处,我们可以内挂一个DLL,把要显示的字幕输出到一个ini文件或是内存镜像文件中,然后HOOK SwapBuffers函数,在调用真正的SwapBuffers函数以后,读取ini文件或是内存镜像文件的内容,把要显示的字幕用textout函数显示到当前DC上,即可实现汉化。
0 s) [0 T+ F/ R2 c+ P) `0 g- O
; v6 F I4 T- b% j& R 先把汉化思路写下来,等有空的时候再做试验,期待可以解决nibiru等使用opengl API的游戏的汉化问题。 |