最近对OpenGL进行了一些研究,有了一些新的思路,先写下来备忘。: i2 X. ~/ _5 R6 r1 e$ f% ]& G
0 P' U$ r- ]" J# ?7 c+ o) z: V! MOpenGL的汉字显示,简单的说就是先用wglUseFontBitmaps函数把所有字符生成显示列表,, q" m4 ?4 p2 L4 e: ?5 w6 U$ E0 G; Y% `- Z
然后用glCallList把显示列表显示出来。7 t- {) v2 ^$ G! D# F E
& w# x# h3 s: _ ?4 l: T* e下面说说汉化思路1 Q2 d4 Y8 b+ K' @9 ~+ a
思路1. 英文游戏一般只生成了英文的显示列表,所以通过汇编级加大显示列表的容量,把所有的
5 s0 `) c# g9 w9 ? 中文字符都生成到显示列表里面,估计就可以实现汉化。当然,程序的性能可能会有影响,. n, f! D; Z1 @7 F$ ~0 T
但是,我认为生成显示列表一般在游戏初始化的时候进行一次,所以问题应该不是太大。3 C+ l u! Q H6 }) \! Q) [
下面的帖子可供参考0 H6 _. P/ J B5 F- `; i( Q
Win32下OpenGL的中文显示' t% ]9 V; _1 O+ v/ h) H5 M
https://www.chinaavg.com/read.php?tid=20406
5 h. M1 @/ ^2 {& R/ l5 ?2 n+ z% d: Z6 f7 R5 m. J3 {
思路2. 根据我的理解,游戏更新画面的过程一般是这样的
" _% W3 p: ?+ U: J( F7 N! G6 T& `( K& s1 f
更新画面函数(区域1)3 ~: g7 X/ G$ @9 p$ K
更新画面函数(区域2)/ d- A0 G, [, L/ i7 w
。。。9 e: @4 |$ s8 S8 ^; L K: y9 }
更新画面函数(区域3)( o: Z' z8 @9 c0 ~2 n, v* n6 h
显示函数(字幕1)
$ X0 e* m$ w$ f9 {' ?) [ 显示函数(字幕2)
' r3 j: L4 V6 L( v0 [& ] 。。。
( K6 U1 p& u+ p _, ^# R 显示函数(字幕3)
( x- `( K8 ~0 R% U, ? SwapBuffers(wglGetCurrentDC())/ o2 d8 r# l+ w/ Q2 {5 z
+ ` r! R9 R5 [+ d
所以,在显示函数的入口处,我们可以内挂一个DLL,把要显示的字幕输出到一个ini文件或是内存镜像文件中,然后HOOK SwapBuffers函数,在调用真正的SwapBuffers函数以后,读取ini文件或是内存镜像文件的内容,把要显示的字幕用textout函数显示到当前DC上,即可实现汉化。0 a8 P2 `" ^8 Q/ j+ p
! [" U! Z1 _8 I" E8 z
先把汉化思路写下来,等有空的时候再做试验,期待可以解决nibiru等使用opengl API的游戏的汉化问题。 |