最近对OpenGL进行了一些研究,有了一些新的思路,先写下来备忘。
* t. b2 h- |0 o% t/ b/ \+ @& s& s/ @, ]1 |1 O! @/ @# a. G
OpenGL的汉字显示,简单的说就是先用wglUseFontBitmaps函数把所有字符生成显示列表,# K6 b4 m$ C0 S
然后用glCallList把显示列表显示出来。1 P- V0 C$ O; o; X6 K' J
( Z$ s; w% J8 N! h% S) W下面说说汉化思路6 v8 x2 h5 F0 O9 c% v
思路1. 英文游戏一般只生成了英文的显示列表,所以通过汇编级加大显示列表的容量,把所有的
0 k/ T- I+ q( }& h0 g2 o# z 中文字符都生成到显示列表里面,估计就可以实现汉化。当然,程序的性能可能会有影响,
! B# T8 k, S% w L! J 但是,我认为生成显示列表一般在游戏初始化的时候进行一次,所以问题应该不是太大。* {9 @5 }! u1 Z
下面的帖子可供参考+ A4 p7 c" U* j! v" w
Win32下OpenGL的中文显示3 ~3 Z$ N* L* Y6 f, X) l: ~ W; \- T$ \
https://www.chinaavg.com/read.php?tid=20406
8 l& i, m N) `& }6 {( L I3 H9 X1 l7 N0 l
思路2. 根据我的理解,游戏更新画面的过程一般是这样的
5 p$ M9 ^* _- a: h, s$ G7 N' k8 X9 B- j& Z J8 d9 h& E) r
更新画面函数(区域1)8 X, G+ c+ d- ]
更新画面函数(区域2)( L; L+ |$ }+ S
。。。$ X8 k" V4 [" Z8 R
更新画面函数(区域3)- Q* b1 c5 ~. }
显示函数(字幕1); W: H" W# C7 g* E1 R: w
显示函数(字幕2)9 L* X( z* y, J5 z, o, s' g
。。。
8 V C* m. ]# L6 l( m2 | 显示函数(字幕3)
8 ]5 ?" W: K5 a- z( ~% }- E SwapBuffers(wglGetCurrentDC())6 `/ c3 w3 F3 Q( {3 e2 |) x, c8 B
3 R- C3 b! M( z! `
所以,在显示函数的入口处,我们可以内挂一个DLL,把要显示的字幕输出到一个ini文件或是内存镜像文件中,然后HOOK SwapBuffers函数,在调用真正的SwapBuffers函数以后,读取ini文件或是内存镜像文件的内容,把要显示的字幕用textout函数显示到当前DC上,即可实现汉化。
$ O. ]8 E' N/ B- }
% ~0 |/ T& A1 f* l) R* w: _ 先把汉化思路写下来,等有空的时候再做试验,期待可以解决nibiru等使用opengl API的游戏的汉化问题。 |