设为首页收藏本站官方微博

【汉化资料】在DirectX 9.0中渲染文字

[复制链接]
查看: 1634|回复: 0
打印 上一主题 下一主题

【汉化资料】在DirectX 9.0中渲染文字

跳转到指定楼层
楼主
发表于 2009-3-12 11:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

【汉化资料】在DirectX 9.0中渲染文字

http://www.5178c.cn/article/6/2006/200605173892.html
2 M. g0 U( N3 @/ G
$ V+ }6 H+ X( e* T在DirectX 9.0中渲染文字 7 ~* x5 g1 ?3 D, i+ u7 O2 Y: _! \7 L
作者:佚名  来源:不详  发布时间:2006-5-17 12:27:04  发布人:admin
- V6 j  d1 _+ `9 I3 H) E减小字体 增大字体 / P2 d  I! d# ~3 ?/ V

1 D& e4 ?4 ]: w; A' j3 S+ k. h+ G- {) {, v7 D

) t3 I3 \  |" o0 h7 K- V
+ T! K! K9 X" U, _
! q( l& O. x" h0 Y( A" O  o, t
3 @, z7 |7 Y4 ^9 l0 d& u( ]9.   字体4 w# _3 L0 ~9 ^* y- w9 O+ h0 R
本文翻译自《Introduction to 3D Game Programming with DirectX 9.0》第九章“Fonts”,敬请斧正!XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />! U, T( k* r( |: J8 |  c, [8 J

! T- n3 c! T; V. F) x, E ' m3 M) ~# R7 T" l' @: K# a) T9 ^$ M
5 K7 A. R; j8 }1 P. w1 P! [9 D
在游戏中,文字信息的显示是必不可少的。本章将讨论在D3D中使用的三种显示字体的方法。同样,这里只列出每种方法的演示程序的主体框架。学完本章将达到如下目标:* }, |/ a4 V8 n7 ^1 M4 m
% R  [5 d* G" M6 P" F- N  v& x
l          学习如何使用ID3DXFont接口渲染文字- g; ~) q% n& H. u3 W- i' e5 D
, K" C* Y7 k" p
l          学习如何使用CD3DFont类渲染文字
& ^0 y/ {1 e2 ]
1 c+ h' y3 U4 |- w4 cl          学习计算游戏帧速度的方法* v; ]& \, U: N% @3 U

8 c/ |  r+ g( x5 y0 xl          学习使用D3DXCreateText函数创建3D文字3 }2 f" c/ @1 Y& k* H" V( A& F

! a9 B9 w7 d' G7 ~9 d$ `4 Y8 l9.1. ID3DXFont9 O2 X* Y3 X$ R' |' u
要在D3D程序输出文字,使用D3DX库提供的ID3DXFont接口很方便。其实该接口是使用GDI实现的,所以,其执行效率有所降低,但是它可以很方便地处理复杂的字体和格式。
0 F3 H/ T: a6 K8 y$ y: ^, T
  i5 b$ o: q; R8 N9.1.1.    创建一个ID3DXFont6 c5 E/ ^, Y( X1 ^
可使用D3DXCreateFontIndirect函数创建ID3DXFont:# ?" B  j, k1 q+ R

6 N$ l, S& w2 A6 B; f7 z4 \3 ^HRESULT WINAPI D3DXCreateFontIndirect(
* m, E3 Z' n0 A+ v( x& C% ?) _; C6 H( N" l+ x
    LPDIRECT3DDEVICE9 pDevice,9 @! I, k: a/ J5 M% G" u
3 ]7 Y1 L( Q4 Y; x$ W/ D) K7 [- n; e
    CONST D3DXFONT_DESC *pDesc,
* U6 F1 q! O9 Q1 G
0 ]; d& L* S. a    LPD3DXFONT *ppFont
" J7 [- K0 S5 x, ]: G! o, s9 L6 Y0 h3 k% y$ |
);/ P/ N4 s2 f) v1 m2 E+ L, O

2 C- j7 J# E+ o+ Q, r, C8 c5 T5 T9 O$ Q
译者注:我所使用的DirectX SDK是Microsoft DirectX 9.0 SDK Update (Summer 2004),也就是使用DirectX 9.0c的那个版本,在较早的版本里,该函数的原型有所不同:第二个参数为CONST LOGFONT *pLogFont,它是GDI中的结构。以后,如无特别说明,将以DirectX 9.0 SDK Update (Summer 2004)中声明的函数原型为准,特此声明!! u8 v4 U6 }) d# z- F) j+ c

9 B! E6 f, R4 ~* s8 {: }( x, P使用这个函数时,需要一个D3DXFONT_DESC结构:( u/ P* {" C& w2 c; _( h

0 a6 Z0 i$ V9 X1 GD3DXFONT_DESC d3dFont;0 v: T0 v" B( F& I

4 |% J" H. M7 Omemset(&d3dFont,0,sizeof(d3dFont));+ d, m" h! F. \) g$ u, U) O

0 @5 V5 ]4 v5 q8 C! j( \d3dFont.Height=25; // in logical units% \) V$ a+ @, C3 j2 \& v5 l

6 @2 M1 E  v! F! m* ?0 hd3dFont.Width=12;  // in logical units9 x  r& \$ D) n; f# B* Z$ H5 X6 C
# `; R5 O$ O3 X, y  O! r- x% e, g
d3dFont.Weight=500;// boldness, range 0(light) - 1000(bold)5 U! h$ L2 F5 d$ ]$ K. P
' ^4 n" X# z0 y) }7 C5 z) g
d3dFont.Italic=FALSE;
4 x4 o. W4 H( E6 `" q( `6 C4 K* {& [* t1 A/ t, w
d3dFont.CharSet=DEFAULT_CHARSET;. i# N6 p8 @& Z( ^* V

/ y8 D8 C3 _& m* }$ c4 Ustrcpy(d3dFont.FaceName,"Times New Roman");
, U; u3 n7 ~+ L& u
/ N8 q( p1 }) t$ j4 L( Y; SID3DXFont* font=0;
+ p+ t' x" ]5 |8 k- A$ l: g5 O8 T  R: g/ t9 A. M+ X: E/ p
D3DXCreateFontIndirect(Device,&d3dFont,&font);
  h& J& R% Q% x- d ) W; l' Q1 |% g& ?

' z7 [( k! C# V( S3 O/ [如果你使用的是LOGFONT结构,则:
; t" ]( P* \8 h5 P1 z3 c2 _3 l+ d0 ?8 G$ f+ K2 n/ _4 v7 k! U
LOGFONT lf;
3 J5 F. J- l) O8 T- b, X  p! a. I( M! T# C# h7 z& I7 V9 N) B
ZeroMemory(&lf, sizeof(LOGFONT));9 K5 w6 h  a8 \. V) R
" g# A5 c6 A7 G; ~( J# D7 `
lf.lfHeight = 25; // in logical units
' W7 E" N+ m' k% _7 x* ]! i
6 i$ y" @  w2 a8 xlf.lfWidth = 12; // in logical units
, H0 Y) Q) ?1 ^( l8 z( R  o
% [- |- t* U/ _2 ~2 olf.lfWeight = 500; // boldness, range 0(light) - 1000(bold). f8 `6 l. L) B4 ]  v. S9 ^
+ ?/ Z0 n  z9 h( e1 Z2 r# D
lf.lfItalic = false;' f2 o) W* q' a1 R- X+ k9 F
3 }. s% v4 x( o+ G
lf.lfUnderline = false;$ [0 I) O! g; b* [
6 h& d# }4 F5 o+ P' m! e/ V  }
lf.lfStrikeOut = false;
* h" |1 [! B0 ?* e. j
) a4 T7 s2 t% q% D' M  |lf.lfCharSet = DEFAULT_CHARSET;
1 W7 C0 t5 R( o' ^  {3 a6 C: L% N+ w$ H  g2 b% f! ^+ g" R1 n
strcpy(lf.lfFaceName, "Times New Roman"); // font style
9 l) N$ M& j) F9 {7 [2 c+ ^
1 S2 Q6 p; W2 c% e6 lID3DXFont* font = 0;
6 [  F2 o) y& q2 r# j; P2 D; S9 D4 }2 A5 N$ F* d
D3DXCreateFontIndirect(Device, &lf, &font);
+ x) @/ X9 {. _; j$ r   h1 p7 h  f& ?# V, T

& \7 u1 Q! {7 o, Q6 {另外,还可以使用D3DXCreateFont函数创建ID3DXFont的对象。+ h$ I& p9 P  j7 N" I
6 m9 @- `" `, e9 ^  Q' r; T6 @, ]
9.1.2.    绘制文字+ q) v0 @% f- s2 H' K! p: y) A9 s
得到ID3DXFont接口后,绘制文字就很简单了,只需要调用ID3DXFont::DrawText方法:/ @) B2 V, k1 k% j5 s

6 r+ l% W) A- e1 I5 wINT ID3DXFont::DrawText(; @/ c$ w* ^- |& B6 Q' I# t
5 q- c' L% [8 M6 E! |. R# k' P
    LPD3DXSPRITE pSprite,- |  H3 R# z4 h) x( j

5 H1 u" R/ `1 e4 V( S+ c    LPCTSTR pString,
/ c9 L; ]9 B; d& y- t1 ]& q5 L* V
& \& x& `- h+ _+ B" h6 [/ K9 L    INT Count,0 a" |( i3 N# A" g, j9 ^
" k7 K4 P, D. e% |' K2 G* O
    LPRECT pRect,5 ]: y* _* {& z( N" g
3 L( i* @& F6 V5 H% y6 S
    DWORD Format,
4 o1 b4 r" K$ k3 m, u: a
9 G3 o4 \4 f* B5 A% Z    D3DCOLOR Color: W; N5 ~7 G! `1 C
" p' B2 s" f. I% n  Z
);
+ k' ]: U7 j! U' b7 ^ ' @0 r& ^' e/ L9 ?8 X) ~3 S

- {) T( M8 H4 |0 [9 [9 zl          pSprite –输出目标,为ID3DXSprite对象指针,可以为NULL值,此时字符串输出到默认对象3 R6 D7 D2 j, v: B( {
0 B9 _$ t" j: \1 c. e
l          pString –需要输出的字符串
( k1 z( {0 g! ]5 s( h4 u* N+ }
7 j+ X; s0 I2 D4 ql          Count –字符串的字符数,如果为-1,则以0字符为结束标志' _/ l; R9 N$ W

& i% P4 A) R* ?% `l          pRect –绘制字符串的区域$ P. ~5 a0 n: M- c( x$ ~
- e3 A& ]; Q( b! }; ]+ T8 ~- i
l          Format –文字的输出格式5 F3 x1 b4 r+ C. v. G2 E
, w  B% f7 c5 L$ n8 M' a
l          Color –文字颜色
' W9 ^) r% u. H. |$ s; O
- H; d0 S4 [7 f/ m例如,可以这样使用该方法:
- P' k, d* X7 t
9 {3 @* z+ W2 o$ A9 W, vFont->DrawText(NULL,  Q' X1 ]& Q& e5 C
$ p: n( E$ x7 o  J$ V* M$ {$ k
    "Hello World", // String to draw.
  c3 ~% ]( B; `3 D8 U3 E
! H0 n5 O" y& c& o" g9 S    -1, // Null terminating string.$ n# ^# `/ \! z0 o

. w% W3 m* a$ Q. P5 [    &rect, // Rectangle to draw the string in.
* j7 p7 P, p% i+ e+ t
0 d3 [! i* h: X: g5 y- }% N/ a    DT_TOP | DT_LEFT, // Draw in top-left corner of rect.
8 a3 z$ {. H& `( R. m% L) Z# ?; K: z2 W
    0xff000000); // Black.
! C1 U2 E- Y4 d3 v" T 1 I& o% w! F. U2 p" U: o

$ g4 t7 r, I+ l. C: N. H9.1.3.    计算帧速率) m/ ]* @: @& J) P! c
帧速率用FPS(Frame per Second)表示。首先声明三个全局变量:9 e5 n9 \) C/ O$ c
) _/ {( |" D: y+ e; X3 Q9 n7 c
DWORD FrameCnt; // The number of frames that have occurred.
4 n) ?' v* Y% z& x, y/ D
, D) U4 S+ C" n6 g; o( `float TimeElapsed; // The time that has elapsed so far.6 d7 v5 G4 p1 t. c% ~3 Y2 W
7 L5 _8 Z$ x+ X4 v$ `" @# |0 {
float FPS; // The frames rendered per second.
4 u% @4 k( B* [) r! w ; p( l+ N8 Z( S% a

5 U0 G2 l2 g9 n, _7 ^$ f% n9 p; c, J每秒计算一次FPS,这里计算的是平均值。我们也可以有足够的时间去读FPS值,而不至于因FPS的快速变化而产生较大误差。; `) v* T& B( P
$ x- a& D+ J* p$ O' x! _
每渲染一帧,累加一次帧数和所用的时间值:
3 K) i  H0 {: V( f1 q8 k4 E$ g1 [8 D
FrameCnt++;. {# h1 b* f7 T9 x" X+ Q

# z+ y: R0 [  C! lTimeElapsed += timeDelta;' S: _. r# {, o
+ t. {2 y2 ?+ |+ X; c( U$ g0 I

6 Y- W+ H4 _8 ~' k; Y  \这里的timeDelta表示两帧间的时间间隔。每过去一秒,就可以使用下面的公式计算FPS了:+ D. B8 U) G" u

$ E7 H! J  g3 M# c6 D1 O% ]: lFPS = (float)FrameCnt / TimeElapsed;/ K2 X' p% `1 ]! s/ q7 e& X

6 ^1 h8 V7 G" w- l  h1 X2 A; j9 z: z& Z6 D, t
计算完成后,需要将FrameCnt和TimeElapsed重新置0,这样下一次的计算结果才正确:) e, N3 L3 Q4 c

3 _' ?" c7 O) S. z8 l% t" Z# f$ Kvoid CalcFPS(float timeDelta)$ a( I" U( q+ A7 }1 W
! O! X* d4 V$ }9 d) n9 C# d
{/ i- x) G; i; `1 Z! m4 S( L

4 p) C/ c6 k/ t/ U8 L- H    FrameCnt++;+ c4 ~+ M9 ^+ e" L% g; }& E4 o

+ d) A, u! D! x; W  J    TimeElapsed += timeDelta;
' _* f+ ^# l; E4 T7 l) t0 k
$ H- I  a5 L+ r$ e9 l# O    if(TimeElapsed >= 1.0f)
3 t7 _- }, h' J6 x* l1 C3 m! f
( b) q4 j7 s( ?7 c5 j% S7 `    {# `& Q7 w8 B$ ~" Z2 \% r! }
7 i7 ?% R. ^: E- l4 F
        FPS = (float)FrameCnt / TimeElapsed;0 r$ u0 d4 L/ u8 f, ?6 B* b( H
; t$ V3 M: }: m/ f0 d) @
        TimeElapsed = 0.0f;- E  S' X2 `6 U$ [2 a
! N1 Z) h" Z4 l. [; g3 Y* x) c
        FrameCnt = 0;
; Q# i+ e/ f$ U8 q8 V/ w' V
9 ]( P" J  n+ x# d6 d# t( d3 H    }
0 ]2 r3 x$ {/ z3 p3 N! B% ^- G4 Q; X0 ^4 f
}1 x3 N+ {7 y; h. R9 F+ Y
! t5 R$ X' |& S, {& ^1 [7 j

6 f9 P7 ?& G% ^& B5 |" `1 v9.2. CD3DFont) s6 h2 n; ]5 y( `" y2 l
在DirectX SDK的安装目录下,提供了很多有用的代码CD3DFont类就位于其中。该类使用纹理三角形和Direct3D渲染文字,而不是通过GDI渲染,所以,其效率高于ID3DXFont。但是,CD3DFont不支持复杂的字体和文本格式,如果只需要高速渲染简单的字体,CD3DFont应是首选。# H, U  R% A$ e- q
0 Q0 `# e% d8 R
使用CD3DFont类时,需要加入以下源文件:d3dfont.h,d3dfont.cpp,d3dutil.h,d3dutil.cpp,dxutil.h,dxutil.cpp。这些文件可在DirectX SDK的安装目录下找到。在DirectX 9.0 SDK Update (Summer 2004)中,该类却消失了,所以,该节内容只适用于较早的DirectX 9.0 SDK版本!
% M( E- y) m7 I0 ?, Q+ _" ]6 g5 |
9.2.1.    创建CD3DFont对象
4 \7 r1 x. {7 N创建CD3DFont的对象,就像创建一个普通的C++对象一样,其构造函数如下:
2 s/ N; K9 l8 b9 j  Q' W' y2 X! W, G! @* r
CD3DFont(const TCHAR* strFontName, DWORD dwHeight, DWORD dwFlags=0L);) i* T" A: g. Q9 x
+ `) S- i; ?/ o3 p

3 J2 f) ^5 A  T8 y) Nl          strFontName –所使用的字体名称
+ L3 b; a  ^7 p! R; d% c) `. o
l          dwHeight –字体高度5 b8 T7 O2 V: o# u& u
: B4 M, K8 k6 j. I( }1 F0 F
l          dwFlags –可选的标志,如D3DFONT_BOLD、D3DFONT_ITALIC、D3DFONT_ZENABLE等。; Y. y5 x0 d7 B' H
( G# y8 u4 Y) Q( t
得到CD3DFont对象后,还需按顺序进行初始化,如:
# W0 A2 G" c! X6 m6 ]# s
1 O* l( |" E& R. p7 I( M0 K; D/ m2 eFont = new CD3DFont("Times New Roman", 16, 0); // instantiate8 `; m3 m( o/ s5 @; }, D, E

3 e* m# S% X) i2 ~" x$ F7 i% vFont->InitDeviceObjects( Device );& q) K+ ]) K, M6 P# y( v
' @/ [  ~6 J+ N# ~
Font->RestoreDeviceObjects();; i, ~- R" w9 z4 Q1 d4 m7 l8 _
" U$ u7 c& M, S
" B0 `0 s0 H  P; N
9.2.2.    绘制文字6 @7 A7 Y* j$ C( G8 I& |. s# D
使用CD3DFont对象的如下方法渲染文字:
, x% c7 F: q6 E2 s0 j% M4 m# j# ?4 }) y! u
HRESULT CD3DFont::DrawText(FLOAT x, FLOAT y, DWORD dwColor,( |3 o2 |: Z9 V1 j5 Z/ U7 ^) z
5 }  q; Z0 d, ~6 y/ v# N
    const TCHAR* strText, DWORD dwFlags=0L);
9 }4 k' k& h) r% v4 \3 K 2 @. U% @; F" Y4 x

8 @" [6 z+ C# o7 R6 gl          x –屏幕的x坐标
' p5 {3 Q. q/ y$ }) h8 {- V
: u& H$ l9 ]& t5 ~0 ql          y –屏幕的y坐标, ]( L; w8 U$ D* O  d

9 K# Q( }, V; {9 T& Z$ N  \l          dwColor –文字的颜色
+ h6 u5 M" G5 t( z+ q; W6 @
& c. B% c) s5 G* }0 Q$ sl          strText –要绘制的字符串/ z& \, h0 F* Y) @. g9 {5 J* `
$ P; X$ ^* K' p! b2 \
l          dwFlags –可选的渲染标志,可为0或下面的值:D3DFONT_CENTERED、D3DFONT_TWOSIDED、D3DFONT_FILTERED。
, d" E0 h" Y& m+ v
5 y; y# c9 l7 z7 M  H4 Q( Y7 Q例如:
6 Q0 D' t# n( }% j5 W% d8 @" Y/ E5 F' a
Font->DrawText(20, 20, 0xff000000, “Hello, World”);  L% ]6 Z! z8 c, p, ?. E

8 A+ k9 _$ |5 l4 P3 ^3 X4 O3 {# M9 D* s, m7 S
9.2.3.    资源清除0 Q. J, y3 D: `6 ]8 ~8 M' z
在删除CD3DFont对象前,还需作一些清除的工作:- j3 h6 X: X: K8 j
; E. s# j: n) O' h0 g. L: V
Font->InvalidateDeviceObjects();3 H* {- V8 e9 q  K( g2 G

% S) |0 I! H* PFont->DeleteDeviceObjects();3 _/ e. J/ F& m7 l7 L3 i' v1 t3 G, p

8 P0 m! P3 S2 F; Z% J  R' l8 Hdelete Font;
+ E. n" F% j6 @' ]
+ ]+ p( m9 e: z
7 x  }( D* s6 M: [9.3. 函数D3DXCreateText
7 r/ {1 I/ ]1 ]5 O该函数用于创建3D文字Mesh,原型如下:: ^; u7 z; B- s! ^  b
' G: r" v1 v4 U9 c# R; N
HRESULT WINAPI D3DXCreateText(
% Q/ e/ p/ |4 m" T  p1 S, R# U% m& i3 @3 |
    LPDIRECT3DDEVICE9 pDevice,9 w6 E7 z! j  W. \0 ]% t" a
0 f& R& c4 t2 W- D8 A
    HDC hDC,
# Q; d. i3 g/ g/ F  B$ W9 N. G( J$ j4 l" @- S
    LPCTSTR pText,
9 c+ j0 u4 e; |% B" W% p3 `( ?
* s6 }: [* }9 ?6 i5 w( T0 N    FLOAT Deviation,
4 ~) j- D9 a. E& {& |$ f5 w
: B; w1 l7 E3 R" T    FLOAT Extrusion,0 V, t  U% B- N* e9 _# c

/ E/ D# X$ B. ]: z6 g0 B    LPD3DXMESH *ppMesh,
2 J+ u6 ]7 b. K7 J- g. j( b
7 [# V# i# U  K5 r    LPD3DXBUFFER *ppAdjacency,
% I+ s' C4 X% S  D, A$ ]" e5 v, g
5 a0 R" _7 p8 ~- [/ H1 ^' i3 ^    LPGLYPHMETRICSFLOAT pGlyphMetrics" F% b2 G+ X# r" F

7 k3 y. D: y/ Y5 m! E, X  x4 H9 d);; {* k( i- L; `% q8 X- ~( f( w* n5 L
' H5 E, Z; x9 V7 L$ b. j. q" C
/ H, N! ~2 M# D
l          pDevice –D3D设备2 Q& Y. u+ s% ^; Y* e
  R8 v: s$ @1 M5 F6 S
l          hDC –描述字体的设备上下文句柄
4 O! w2 B2 z$ t3 {) v! t5 J$ E: a8 g- P& D$ L1 A5 ]- x" T3 b) T
l          pText –要渲染的字符串
9 Z. p; ^! V* G% d
! m9 j/ E2 Q9 _# Q1 s" Z. q7 el          Deviation –TrueType字体的一个属性,该值不能小于0。如果为0,则使用字体的默认值
5 }5 C" u7 _2 p, q2 G$ s7 D; [5 h; b2 s& i
l          Extrusion –字体的深度,相对于Z坐标轴  C" W$ M9 K; n2 M. }$ ~0 r4 h% U! `
. Q4 W9 r; X* N9 I5 o- q. W! y: C
l          ppMesh –返回生成的Mesh对象指针
4 L1 d" T! w0 U0 ^0 V* L
/ N5 r9 t2 N+ o0 S6 r+ {6 Hl          ppAdjacency –返回邻接信息。如果不需要该信息,可使用NULL指针
% H) t# u: v0 k! k2 `. c( X! c* {; `" j" ~# u5 b4 \
l          pGlyphMetrics –结构GLYPHMETRICSFLOAT的数组,返回轮廓矩阵数据。如果不需要该数据,可以设该参数为NULL
1 j( S/ N0 j5 L; E8 U: [+ B2 @- t9 x2 X8 V9 x$ ^* h
下面就举例说明如何使用该函数创建3D文字的Mesh对象。
& M, {  O. P4 p. w: a- t$ J& [* Y/ W* a; ?1 k; o, h6 ^) T
// Obtain a handle to a device context.
" e3 J/ Z3 c( n7 k1 a' y' ?5 E# j
HDC hdc = CreateCompatibleDC( 0 );
* H2 \! T/ Q# e
/ u4 s& _& l+ P  C7 }0 K2 J% j// Fill out a LOGFONT structure that describes the font’s properties.
* X. p$ Y2 C& }: M4 K$ J3 i5 y7 s% Q5 E5 W" C
LOGFONT lf;
& g) ~/ [9 H$ O0 y) S- U0 y3 [
, u/ r2 f; U, ~' D3 BZeroMemory(&lf, sizeof(LOGFONT));
) d: {/ n4 a- e3 ^+ v5 ~2 V7 ^- O# G* o& V0 ]% m& q0 M' F' V
lf.lfHeight = 25; // in logical units" q) @  O: D. Q
. z- \; x% S/ Y! o2 p  F
lf.lfWidth = 12; // in logical units7 K4 N3 m8 ?4 V1 q+ u

$ h% [+ T# \1 n/ [9 {lf.lfWeight = 500; // boldness, range 0(light) - 1000(bold). u  I" T8 b% v

- X) \( x8 h9 Vlf.lfItalic = false;
3 \% y0 P- a9 B0 @1 Z) F
2 S  l, \( h3 x/ F. s! d/ M* ~, Plf.lfUnderline = false;
; k2 i% Q2 o% w. \% g
/ K6 \6 t5 u8 L4 i! h/ @lf.lfStrikeOut = false;
/ O3 h3 X7 `* [* X
# F& q3 c5 }* @5 U3 _% A- nlf.lfCharSet = DEFAULT_CHARSET;
9 X- f  J! g. J% R; h6 y. j0 u9 X6 b: d2 I( R9 Y
strcpy(lf.lfFaceName, "Times New Roman"); // font style. u6 P+ F; L1 C6 M
1 E* o% i4 _# ]3 T+ f2 `  J. s3 a
// Create a font and select that font with the device context./ R1 ]2 q# X8 Q2 u

2 o1 D: @* h$ s2 F4 |+ vHFONT hFont;
3 C% m. W; U( H: c- T5 R
! m% w$ g, w0 ~2 ?# k; \1 [HFONT hFontOld;
" D: @# t, m1 l5 A0 Z& J5 K2 J/ g! u: k
hFont = CreateFontIndirect(&lf);
8 O: w9 T+ t( @, }5 e/ X
  d# ^! m" E0 Y& j# N9 {& H1 c5 n$ fhFontOld = (HFONT)SelectObject(hdc, hFont);
8 @. o1 D. I" x4 |* o& g0 D. j  X
// Create the 3D mesh of text.0 G9 {7 }: V; p  n  `0 j4 T3 ^

4 V7 j: [9 Y1 @' S5 W( {ID3DXMesh* Text = 0;0 h: x9 T- x. R0 \/ V+ I. ~( p! F

1 J" |; Z/ W( i0 L3 s' UD3DXCreateText(_device, hdc, "Direct3D", 0.001f, 0.4f, &Text, 0, 0);
% F5 k6 m% V. w8 u
: ^! m# ?, \( l$ ?) S! ~8 [// Reselect the old font, and free resources.  Y( |' }& p' M: Y7 c; ?3 ?( i, v

& w; `/ q9 j0 R8 @/ j5 |0 aSelectObject(hdc, hFontOld);
1 K! e2 [5 k) q  J* @0 n0 E7 `9 I" Z( K! R" e
DeleteObject( hFont );
1 l& ]+ j7 E+ n! x: H3 b7 d6 w) _, D; k7 X$ W6 d
DeleteDC( hdc );6 O* l# |* d$ k  D" @" k, L1 s
& E, m2 W/ T( l) B5 s7 q4 B: [

* R/ ?0 p6 K7 L' F* ~& W& ^这时,Mesh对象已经得到了。最后,直接使用DrawSubset方法渲染即可:
1 h6 D9 V" e. m" _  E5 q: k$ I2 H* R5 S2 H: r& e8 C, ]! J7 t9 Z! x
Text->DrawSubset( 0 );$ n# U5 K9 Y$ ~
/ x3 }/ y/ \6 s5 S+ c# n

, ]. u2 a1 m3 @& `# M) ^译者注:上面的例子代码,使用的是较早的DirectX 9.0 SDK,不是Summer 2004版本。, Z2 Y" ^9 ?1 x
/ \7 Z( a+ j" d" I% Q- f, `( R$ U8 M; _
9.4. 总结5 N% P0 ~1 U1 Z
l          如果需要渲染较复杂的字体和格式,使用ID3DXFont接口会很方便。但是该接口是使用GDI实现的,故效率较低。
' L- h* g& Q1 u9 u, Y: S- Z" l* V) l2 X# u, J6 I
l          CD3DFont类可以快速的渲染简单的字体。该类实用D3D的纹理三角形渲染文字,故速度较ID3DXFont为快。
5 g" ?  Q5 I4 z# j) [
  @( u9 Q% ^. ?& s3 Ql          使用D3DXCreateText函数可以创建文字的3D网格模型。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

冒险解谜游戏中文网 ChinaAVG

官方微博官方微信号小黑屋 微信玩家群  

(C) ChinaAVG 2004 - 2019 All Right Reserved. Powered by Discuz! X3.2
辽ICP备11008827号 | 桂公网安备 45010702000051号

冒险,与你同在。 冒险解谜游戏中文网ChinaAVG诞生于2004年9月9日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

快速回复 返回顶部 返回列表