http://www.5178c.cn/article/6/2006/200605173892.html
: C4 T' [: h6 L) \8 I' j1 |
% _$ T" s3 J& `/ f在DirectX 9.0中渲染文字 ; U8 c; V" G3 K: z( c6 f) w8 J
作者:佚名 来源:不详 发布时间:2006-5-17 12:27:04 发布人:admin ) q) R7 I* m5 Q" L
减小字体 增大字体 ' ?. S# k# d6 c
9 W2 k" I8 K' W X
) A: X) i. m. X) k# e H! P* w7 c, r# D
& `* a7 i* G( m2 R: Z
# P( Q( U& }0 `/ j: T- r' e" w* J
0 v$ q" t0 a3 r! X$ U; ?( V9. 字体+ Z2 K' V% f# E3 q9 t* R0 Z2 @- t
本文翻译自《Introduction to 3D Game Programming with DirectX 9.0》第九章“Fonts”,敬请斧正!XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />
( X; n# h8 |/ d6 _( v4 q* x7 L
; n; X1 [. T- Y 3 j7 x2 w8 w+ w6 d
" u2 c s5 d0 ]' W* r在游戏中,文字信息的显示是必不可少的。本章将讨论在D3D中使用的三种显示字体的方法。同样,这里只列出每种方法的演示程序的主体框架。学完本章将达到如下目标:. x& A7 a9 [1 `+ [4 y" X% O
* {5 M; r! g6 B$ r$ ?/ El 学习如何使用ID3DXFont接口渲染文字$ ]8 Z8 {5 t* N! r: X& q4 a
0 P' X! R0 R2 f/ L) x
l 学习如何使用CD3DFont类渲染文字, d' w) P' q# R$ _ Z2 y9 f
$ v& X3 a, \" H& M6 il 学习计算游戏帧速度的方法+ H, \4 |2 \8 M3 k5 {8 m
% y# c: t- U/ L# M+ I
l 学习使用D3DXCreateText函数创建3D文字
9 ?1 y: B0 B& k- a9 r# _( p) U% G* [6 y# [$ {& k
9.1. ID3DXFont
- x: c, ?1 R. ?& S4 ?# Z, a, z) s* |要在D3D程序输出文字,使用D3DX库提供的ID3DXFont接口很方便。其实该接口是使用GDI实现的,所以,其执行效率有所降低,但是它可以很方便地处理复杂的字体和格式。" z; m+ W# g& F8 r: \ {% H
2 n2 ^* C) f5 A; D
9.1.1. 创建一个ID3DXFont! c7 a" ]3 |0 C" r
可使用D3DXCreateFontIndirect函数创建ID3DXFont:/ w$ ]7 L% J* s9 e
J k& u6 d$ B1 r8 i8 m% a+ |* MHRESULT WINAPI D3DXCreateFontIndirect(7 ~7 }5 N0 @7 U$ A. q: j
3 v* ?" d. q/ A- T+ K$ E1 z LPDIRECT3DDEVICE9 pDevice,) r, J4 x! O7 v( J2 U
2 o. V" d$ E; ? d CONST D3DXFONT_DESC *pDesc,: |, \) \+ S! {) A# B4 _
I1 S4 P/ z p LPD3DXFONT *ppFont
, S- T/ v& J9 V6 e$ T( I
2 i9 ?/ d( f1 `" q$ @& p);
, M$ v' {" D* F# K* Y) G' r3 S% D ' C6 X) f- O# d
& w6 f$ k: Z* M
译者注:我所使用的DirectX SDK是Microsoft DirectX 9.0 SDK Update (Summer 2004),也就是使用DirectX 9.0c的那个版本,在较早的版本里,该函数的原型有所不同:第二个参数为CONST LOGFONT *pLogFont,它是GDI中的结构。以后,如无特别说明,将以DirectX 9.0 SDK Update (Summer 2004)中声明的函数原型为准,特此声明!
% p6 V7 g* S, k9 F' E/ ^
8 S9 t2 [& l5 v使用这个函数时,需要一个D3DXFONT_DESC结构:
+ e( j/ o* G& \6 ~) U
% j# m2 M! O, W+ G- X% l, H2 }1 lD3DXFONT_DESC d3dFont;/ u2 t0 p) u7 y: o; I1 J
7 C& V$ d' C1 p D- imemset(&d3dFont,0,sizeof(d3dFont));, F: B* e6 \; y6 n
# a. }9 m( x8 ?* Q$ Xd3dFont.Height=25; // in logical units9 ]5 o" X0 T9 |9 X# ]+ t- b! q/ \
1 h, z V( Y( ~6 M2 {9 k! ]5 ~$ A; xd3dFont.Width=12; // in logical units q4 D: j t! c6 q$ s
3 q3 Z0 q: l5 ]' S+ ad3dFont.Weight=500;// boldness, range 0(light) - 1000(bold)+ o. e. O1 V3 N7 ]% ?# c5 x6 v
5 ^3 f/ q- z, C
d3dFont.Italic=FALSE;* h1 A/ {/ I! R; N7 o4 L2 T# }
. P( \" j2 x: X0 s% O' U- Bd3dFont.CharSet=DEFAULT_CHARSET;$ b$ F) a* [1 @ Z: P6 h) M
4 _! C5 W/ S* I0 T: f0 m: hstrcpy(d3dFont.FaceName,"Times New Roman");- r+ R$ O" W# }% z, R
. r4 ^; {- _" Y/ CID3DXFont* font=0;
9 s! e3 v- M3 ?
8 h1 G% ]- L$ ], F1 PD3DXCreateFontIndirect(Device,&d3dFont,&font);
% `& E! {* E: j2 c: i
( F/ L0 p/ w% u7 i" ~- c F5 k* r
3 X, H1 \7 b+ |% _8 J如果你使用的是LOGFONT结构,则:
/ g6 R1 \! M: K4 I5 Q! ]* V" |6 ?8 I0 u5 S5 {" u
LOGFONT lf;! k8 z* N; _3 K$ Z, {% [
3 H; Y2 V! V8 Q. b aZeroMemory(&lf, sizeof(LOGFONT));! s( j5 Y# O/ D3 `" x; ?
o j7 K0 o9 t/ E* h1 Hlf.lfHeight = 25; // in logical units
- F( v6 f; Z3 N
; W: b6 [! o0 c# D1 }" Qlf.lfWidth = 12; // in logical units
1 S" ~5 U) f$ { q7 ~' w
) ~! _ E6 F) y% Wlf.lfWeight = 500; // boldness, range 0(light) - 1000(bold)
7 c/ i& q3 j& A, o% \2 \# Z; y4 J5 [1 B4 T+ l' Z8 p6 `
lf.lfItalic = false;* |6 m" i+ \# C+ Y7 S) P \
% h3 u, U- l, M5 N
lf.lfUnderline = false;
9 N( L5 W9 h ^: j5 X6 T: k( Z5 \
$ c5 K7 U7 N, E& _) U* G! tlf.lfStrikeOut = false;/ g# {1 d M: @6 H
( l0 B5 L! P/ Plf.lfCharSet = DEFAULT_CHARSET;9 t% m8 P; _; T
' n6 D5 s1 s% o7 [' A5 e
strcpy(lf.lfFaceName, "Times New Roman"); // font style8 u( ~' b) z- c
4 [, E& v. n- w4 q+ o0 a1 y
ID3DXFont* font = 0;/ u; } c- I! F7 T0 [
: S' p4 J( j' x+ j4 f( N
D3DXCreateFontIndirect(Device, &lf, &font);
' c4 ~$ H4 N( ~# ]$ ?8 z* }- H ) u5 j- C" I( E5 _& C& Y
+ \1 s7 K) ]2 t! D
另外,还可以使用D3DXCreateFont函数创建ID3DXFont的对象。
! |3 ?$ O6 P5 {5 S: X
; T1 N8 i4 z+ {' l- e$ Z6 k @! \9.1.2. 绘制文字
5 @3 l: Y1 H! o' D6 c4 c5 I H5 B得到ID3DXFont接口后,绘制文字就很简单了,只需要调用ID3DXFont::DrawText方法:
6 |* C/ ~( F q/ P; w; [, ?! r( O, @4 G `! ~/ ^2 Q* u
INT ID3DXFont::DrawText(
9 J9 d5 v% b, b$ C4 Y3 g+ ], U \2 N
LPD3DXSPRITE pSprite,
+ I7 K% ?2 ^- i9 q
$ i4 ~6 `( Q7 W6 p8 F* x5 g9 G LPCTSTR pString,& c g9 N: ^/ @- L
- h% b( w( |1 g" B( C6 H INT Count,5 q4 a6 O; O U$ N, g2 N
: _- N- E; z3 w1 c5 k
LPRECT pRect,' X+ b- Z+ U& _% G: f) o
! f9 Z5 {# c1 C" h DWORD Format,# |2 X& ?: M9 F: c1 t' `
& m' S `* t* w1 r D3DCOLOR Color
' X; f( z3 E" d5 W+ Q3 q" w* k% a/ ^% K% x
);4 T3 j* E! h. p( @0 {- \
. m5 r7 C) l) H
: S L7 s& e0 F1 ?6 E/ Y# A- J7 Wl pSprite –输出目标,为ID3DXSprite对象指针,可以为NULL值,此时字符串输出到默认对象1 |' R& b- y4 f2 N2 @* ]( k. Q
[& k& y6 U5 r3 F: A/ f
l pString –需要输出的字符串
, X$ A4 E5 B6 I" m; \
# W, u. ?! P K. V* N; L7 n5 Kl Count –字符串的字符数,如果为-1,则以0字符为结束标志
! F% i% j2 G) u. T7 ]
( n7 y$ } p9 W4 Zl pRect –绘制字符串的区域
E) L& B. f) U8 T; a1 O- Y. f5 r% h9 M% b
l Format –文字的输出格式
0 ]# p# p# }' {& o0 f" A: e% M9 Q; L0 X" P+ o$ K# S1 H' \' l
l Color –文字颜色
8 n& N+ p; A2 `9 J
% u3 X! w% W7 Z0 G5 O, ?( s. D例如,可以这样使用该方法:
6 Q W9 s% W K j2 b* L
% i- t2 Z- _* C1 d% M' EFont->DrawText(NULL,
" Z2 y+ ?/ O K: U6 j+ Z! k
% q1 j7 v9 X3 x" [; Z" A; v1 d "Hello World", // String to draw.
, m8 N0 t0 x+ A
2 ~. ~8 O# b ?8 D) V -1, // Null terminating string.
) ^, _- m# I4 P0 `+ i7 `/ x3 v. P
1 T( |# _. S( M! j9 b" j& u/ Q5 g &rect, // Rectangle to draw the string in.; K6 U5 y" u% t6 V
4 u- j7 `7 o# N; E6 I7 G6 g DT_TOP | DT_LEFT, // Draw in top-left corner of rect.
. ]* c/ k2 } e7 a9 O
6 D" G- \' B+ W1 p7 f 0xff000000); // Black.
# t1 m9 j( `. E m
" {1 v9 m5 G/ C) y
& _" Q7 |+ O) H/ ^1 o! o' Z6 A9.1.3. 计算帧速率5 Y) i1 `1 G8 u6 C/ P: l7 P( W2 w
帧速率用FPS(Frame per Second)表示。首先声明三个全局变量:6 X; z6 b# Z, f4 Z+ E$ G
. m9 r; M& M; oDWORD FrameCnt; // The number of frames that have occurred.+ B5 x5 K! {# y* [! L( x! _
7 [" h! _5 Q) i9 p
float TimeElapsed; // The time that has elapsed so far.1 X5 v+ o3 ]) o9 X% A$ U/ h# _7 a9 M
( }" P) t, X6 O% M$ `float FPS; // The frames rendered per second.
" g& L, e0 k$ a# q5 U4 M: |7 c* i
1 k9 u1 |( L. b. |( \1 B+ F/ {
Y+ B P4 P7 s9 S" [! A7 r每秒计算一次FPS,这里计算的是平均值。我们也可以有足够的时间去读FPS值,而不至于因FPS的快速变化而产生较大误差。
, v+ w, Q% i ]: P$ s1 N9 q2 K8 v. Q( o! p
每渲染一帧,累加一次帧数和所用的时间值:
: m; c% r$ r# t, S- |6 v
% n5 _0 \ N! `6 E( l' s4 C& VFrameCnt++;
: ^/ a& l' J: G% a& [ i4 q; h/ ?2 z
TimeElapsed += timeDelta;
/ J8 d# B* E4 V9 u4 R! S
8 k( h: J# V2 b3 \$ S. T
; s, F8 g% `# g) w/ R8 K这里的timeDelta表示两帧间的时间间隔。每过去一秒,就可以使用下面的公式计算FPS了:
- P4 k1 _0 [& `6 z" [0 A( ]+ _) d, @+ i) B& D2 }+ Z5 d
FPS = (float)FrameCnt / TimeElapsed;, l! t) V# F: d8 R5 o3 e
( X% D( D/ B- Y/ V/ p
2 A& Z4 w. x/ S7 S. S: [计算完成后,需要将FrameCnt和TimeElapsed重新置0,这样下一次的计算结果才正确:
' c# P' W* x/ V4 b1 \8 { h# z+ s! I, P; Q( K
void CalcFPS(float timeDelta)
. A# D# [' }+ u% K& R
7 y- z' A! D( e7 O0 Z/ `+ l% X$ `{! \8 y3 B) C% o3 }9 f* c4 A6 M% K
& |; h& Y# x6 c0 r FrameCnt++;" | Q- f8 r1 v
' B: c& l- T( j- ^# s5 M6 B# z TimeElapsed += timeDelta;6 |/ ?8 N7 {7 Z0 j8 p `: L
4 U) i( s- u/ w0 z0 o4 B, a) O if(TimeElapsed >= 1.0f) t; w8 o. t! A. k$ I
9 h# ^$ z6 A: L1 R& |/ u L, k/ ? {6 { s3 k. i# m a, e% b7 T
' l* H& l4 b1 i! E6 F FPS = (float)FrameCnt / TimeElapsed;
5 p" B" S- D" j# h
0 {" y9 @, z: C, c9 b) I2 o TimeElapsed = 0.0f;
; {! ~$ u& \" S) [% |% K9 F/ G
' j6 G. t# }* x' F. o @) w FrameCnt = 0;
N$ R2 m8 m( s+ I- x# {1 Q A/ k' f/ u* I7 R
}8 U. E8 E/ Y: Q4 z* Q1 m
3 |4 t2 ^- q' T}; g; N5 E% ?" j0 U: _" f
. L8 d v, }8 Z) V; {% H
6 E# c1 m7 C5 V8 f; J
9.2. CD3DFont( }5 `) b- z$ g/ x
在DirectX SDK的安装目录下,提供了很多有用的代码CD3DFont类就位于其中。该类使用纹理三角形和Direct3D渲染文字,而不是通过GDI渲染,所以,其效率高于ID3DXFont。但是,CD3DFont不支持复杂的字体和文本格式,如果只需要高速渲染简单的字体,CD3DFont应是首选。* ] c2 x: J ^: g, M2 l/ T
8 _ d! }# D) g7 D使用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版本!
P" x, i2 R L3 k" ]$ K" { u$ B+ g( e% l- v8 p
9.2.1. 创建CD3DFont对象
- a, P7 d9 N5 N9 E5 a5 k$ @2 S+ I创建CD3DFont的对象,就像创建一个普通的C++对象一样,其构造函数如下:$ k& ^# X8 [( W5 Q
) B% a: I; C7 I. H6 }CD3DFont(const TCHAR* strFontName, DWORD dwHeight, DWORD dwFlags=0L);4 V9 K( ?' \# f3 w/ ~
# J/ w' ~5 f9 c/ X2 a' t3 b8 V" K S: z
l strFontName –所使用的字体名称0 \& Q# \) ?# P; c' p/ Q
9 J" u5 J5 S# r8 X6 }
l dwHeight –字体高度& K# p9 d+ }/ n6 z
5 Z) j5 t; H! X9 J; c
l dwFlags –可选的标志,如D3DFONT_BOLD、D3DFONT_ITALIC、D3DFONT_ZENABLE等。
3 e0 @$ y$ u. f& a3 L7 ]" Z' [' n' X0 u
得到CD3DFont对象后,还需按顺序进行初始化,如:/ ]2 Q7 B5 ?, `( ?# L' W! c
6 `' V* x3 N8 U4 jFont = new CD3DFont("Times New Roman", 16, 0); // instantiate
( B# V7 `0 x% K& r0 {7 \/ B9 F: V" p% p
Font->InitDeviceObjects( Device );/ }) Z! L- @4 _
% O+ S7 h, ~. a0 h. |- D9 J% FFont->RestoreDeviceObjects();
0 S- n8 w& a6 m8 j# t/ [ q' B
/ l4 S9 p. ~+ _. @% R) ~+ T2 ~$ B, X% L9 L
9.2.2. 绘制文字+ [2 \: E: t- q" Q) O7 F X
使用CD3DFont对象的如下方法渲染文字:
5 ?- g# T1 q2 p3 H4 S, a$ W9 f, q0 m `0 g' P: `
HRESULT CD3DFont::DrawText(FLOAT x, FLOAT y, DWORD dwColor,5 l5 l( k& p4 D6 ?# v* h3 K
* B# }& b. w2 r$ U
const TCHAR* strText, DWORD dwFlags=0L);6 X; C$ b( e4 u6 d
5 Q' k j: B/ M- y9 w, g }
& k+ O. n9 J0 z# Z1 J* X! Q6 z
l x –屏幕的x坐标
: c: s& Y0 o5 q2 c3 K" |* k2 c O* V4 W
- w( S6 \, e- i, t6 W" @l y –屏幕的y坐标1 @# ~: [2 M' Z7 X0 u8 o. i6 e; ^
2 B2 p' r& I( E
l dwColor –文字的颜色
8 {1 R+ j$ A) Q; C/ K2 j/ H
. A( ~& t( C" {; z; Fl strText –要绘制的字符串
6 @ T- |9 S7 Q8 U, j/ i8 x. p) ~- Z4 d3 k4 r$ h- P' R: i5 N
l dwFlags –可选的渲染标志,可为0或下面的值:D3DFONT_CENTERED、D3DFONT_TWOSIDED、D3DFONT_FILTERED。0 N; A V: G, P- U! S8 `" [
% |% |/ C! e7 y ~例如:
9 Z) y2 q. U" k& e% \5 w6 r" f0 L$ Z8 N3 ^$ l6 r
Font->DrawText(20, 20, 0xff000000, “Hello, World”);
8 D. g, Z* o. I L+ {
+ Y8 v& M2 x2 ?: d
$ V0 [$ i9 [3 A9.2.3. 资源清除1 i4 i$ K/ K3 E9 H6 E
在删除CD3DFont对象前,还需作一些清除的工作:3 L' C C- |8 e6 Z* n
( V2 V. `. V! s! i0 {* Z& g
Font->InvalidateDeviceObjects();
F, V; B$ D2 Z! O+ g; H- l7 h4 F* a ]0 y& Y6 ]; a8 }
Font->DeleteDeviceObjects();+ U% Z9 o( C2 \0 } M9 u; ^
5 W' i( H( ?4 H
delete Font;* c1 l/ R# ?3 q( S
# r9 j z9 z9 P+ J' x
4 n& k1 ~9 B& Q- S7 t% O/ B
9.3. 函数D3DXCreateText
) m! P/ t/ V! C9 ?2 v( Q该函数用于创建3D文字Mesh,原型如下:0 ]& |+ [" {( L; c; }0 J9 z5 i
4 U- Q Z. b" T, L4 Y' Y, I B: ^
HRESULT WINAPI D3DXCreateText(
# |) ?2 _) S9 h) J2 v7 I7 q9 G6 {. v1 c6 P7 l4 _% [
LPDIRECT3DDEVICE9 pDevice,0 P% q7 ?) v U; W" G
: w* m/ T1 f1 Q# i* O- t HDC hDC,
$ ~; V, T5 P+ Q0 ]( h; }: _2 C' H# O# G' t: q7 Q6 s2 X
LPCTSTR pText,9 P) R: K& V* M8 H4 I
/ ?* M5 t/ ^' c w2 \5 P FLOAT Deviation,9 P- K% `, u6 o- W- ?. R
2 [4 V( C$ P( o1 h# o g FLOAT Extrusion,7 T; W, j9 v i* ?& ~
/ [4 W* r0 n3 W# }. y) D
LPD3DXMESH *ppMesh,
6 X/ u- ?$ _6 N2 g2 |2 C- a* {# D+ ~* Y2 \$ }) I6 P: |' T; [9 j* N* q
LPD3DXBUFFER *ppAdjacency,# r+ H, c2 H) D0 a) l+ O7 x/ H6 U
6 {% R, P) w" A) R( `( v S/ e
LPGLYPHMETRICSFLOAT pGlyphMetrics5 {" D& f0 d. C( i F3 g# D' a, T2 B
! ] W* k" \1 Z: C: U
);* u) {' ~. a1 A! t9 r' t8 N7 |& k
& L, k) T. I4 r& I- \. l6 U! ?8 C" p: _
l pDevice –D3D设备
5 A" U' I- `' k
, U A; K) K$ D2 E S; Gl hDC –描述字体的设备上下文句柄
* r$ d& p n7 u: N9 K! s
, Q. e$ R* O/ Z! M& Y8 |. A; ]8 T5 B- }l pText –要渲染的字符串5 u( L* q: `. E) |: Q' t
S. p# h$ h$ @" Bl Deviation –TrueType字体的一个属性,该值不能小于0。如果为0,则使用字体的默认值
& p3 L9 [) o! J2 \: W, t3 I D& B% B" e3 `: C
l Extrusion –字体的深度,相对于Z坐标轴3 V7 i1 D( V i3 j/ ]" L/ e( B5 M
8 h j2 S8 a' n6 G+ q, m
l ppMesh –返回生成的Mesh对象指针
5 p2 n" T% U6 r" M% B& G) J! S+ N* V
l ppAdjacency –返回邻接信息。如果不需要该信息,可使用NULL指针
+ X: v( a- [0 D; H& ?, K# V1 n4 ]' \: q: D0 F% s! R
l pGlyphMetrics –结构GLYPHMETRICSFLOAT的数组,返回轮廓矩阵数据。如果不需要该数据,可以设该参数为NULL
% j/ i$ P# |5 U* U% T9 _7 D Y8 o1 a/ } B- ?/ J
下面就举例说明如何使用该函数创建3D文字的Mesh对象。 D, J9 {/ e9 a1 s# k, M/ W* g
8 R! D& n' \; `2 t; U( U7 p
// Obtain a handle to a device context., b$ ]9 u6 u) o6 q! a# Z- s
0 {" X1 D8 k: f4 M, m/ z0 {) H$ D3 r
HDC hdc = CreateCompatibleDC( 0 );
2 u8 o6 l& z+ o
0 k: V9 _# _% R- ~) G2 k! {// Fill out a LOGFONT structure that describes the font’s properties.+ _) o/ W. j( P2 b6 M' x. e- [/ f
* H. q o: ?/ Y+ p6 B7 b
LOGFONT lf;% i. |/ k( Z0 S% m* \* V0 p
8 F& `. R7 m eZeroMemory(&lf, sizeof(LOGFONT));
v4 w2 P, L. h1 K. s4 R( m
1 `: z4 [% u. g( @ V( v% U; q0 n- wlf.lfHeight = 25; // in logical units
# M V, u$ X" J1 n; q- N4 J5 t, h+ v* I/ T/ Y8 b: Y0 T& s" ~- z/ X
lf.lfWidth = 12; // in logical units/ \: ^, U, y# I1 n2 I3 M% s3 y
* d! G" i" G9 P* Q; a( G2 J. b7 Alf.lfWeight = 500; // boldness, range 0(light) - 1000(bold)
& ~4 K. D D/ ^; a, q! I: `: q4 ~: G7 v5 X
lf.lfItalic = false;* d' r( U8 ~/ g
9 {5 u& q7 l6 C7 a: }( ulf.lfUnderline = false;& Q2 p3 |) W+ N; C" k
) V" ]/ [$ f( h# s) L
lf.lfStrikeOut = false;
" ^" R& l$ x- w4 w: i& n
* h" L! n+ x5 C& m* rlf.lfCharSet = DEFAULT_CHARSET;, \5 o5 Q. N$ Q( N. u9 ~
( R5 j$ b5 ^6 |/ P$ B8 L: A
strcpy(lf.lfFaceName, "Times New Roman"); // font style
$ z" B' I. v& O3 K
[6 g1 i$ a8 ~) {// Create a font and select that font with the device context.& [) o, e7 T4 u8 H/ k" {
% Q3 B9 J# R; u4 B
HFONT hFont;
, ~! O9 d! n8 h8 b5 Z; d% X7 U6 Q, a0 K$ Z
HFONT hFontOld;
$ w0 `3 m) e% E+ E5 G
. M8 D( A$ H1 E, {6 C( G- XhFont = CreateFontIndirect(&lf);/ ?$ r; X6 s1 ]+ Z2 h" ?2 P
3 X5 S% Q X8 ]hFontOld = (HFONT)SelectObject(hdc, hFont);7 @: r9 F% R/ n0 _3 d
2 ?, g7 d. U$ W0 v// Create the 3D mesh of text.
# X$ r$ f. {& h3 H2 A
# J' i# F0 V- x" y2 lID3DXMesh* Text = 0;
( X8 b$ ~* A: n( @4 \9 ^; r+ f4 r+ c% k
D3DXCreateText(_device, hdc, "Direct3D", 0.001f, 0.4f, &Text, 0, 0);! I2 L' ^/ U6 M& G6 x+ \: r. r
; E- {3 ?( o; E+ e- s// Reselect the old font, and free resources.
9 I5 Q: H& |& R0 ^- E: x7 u4 v5 o5 ]
& P8 M+ P( C" Z7 K8 U/ USelectObject(hdc, hFontOld);" U5 p. a9 N2 O1 t! Z
4 W8 q" Y& i6 |DeleteObject( hFont );5 _$ b3 ~+ a) s# a1 j
; t# U" }6 r% Y5 c3 S2 w! k
DeleteDC( hdc );
% w7 y2 [# v- z( L1 g$ r
9 }+ U2 T& J0 ` }8 s e" s! y6 b2 _1 e# e* M( H
这时,Mesh对象已经得到了。最后,直接使用DrawSubset方法渲染即可:- J# E9 `$ `8 T) z+ L& g; U7 U
9 C- U& u' A% f5 X4 R/ n4 N7 P
Text->DrawSubset( 0 );
: s X( x; i4 a; l' Z9 q5 q( a
7 Z4 ?% p0 ?4 i! M1 Z+ F( I- t) l
3 i- K& U- l: @5 V译者注:上面的例子代码,使用的是较早的DirectX 9.0 SDK,不是Summer 2004版本。# a- m. M- u) k, d( Z+ p
2 p* e& d$ t+ m8 P9.4. 总结
- [6 ~1 O5 |, j1 M" _5 i0 v0 zl 如果需要渲染较复杂的字体和格式,使用ID3DXFont接口会很方便。但是该接口是使用GDI实现的,故效率较低。
" S$ ?* t% q5 J4 x; i5 P% x o, Y: J
l CD3DFont类可以快速的渲染简单的字体。该类实用D3D的纹理三角形渲染文字,故速度较ID3DXFont为快。5 f% B& w) e: H! [1 N# G
) N# [6 d' _+ Y8 ?7 q* y# \5 il 使用D3DXCreateText函数可以创建文字的3D网格模型。 |