http://www.5178c.cn/article/6/2006/200605173892.html
% W+ ^6 a9 @# d' F& V
6 t* B8 L7 T3 d, M, h0 g2 W; i在DirectX 9.0中渲染文字 - l4 m* I1 Z; o$ X" \5 Q
作者:佚名 来源:不详 发布时间:2006-5-17 12:27:04 发布人:admin
! }5 X8 v5 O3 c减小字体 增大字体
, Q0 `4 f1 O {) L
/ ~4 q% i% `) E8 ^2 h7 ^& ?
' D7 q2 I) Y4 z( v
; `# Z* s3 j6 ?' r0 H+ t, l. Y# h- b5 x6 F( q: H# B
7 x" j: i1 D, U8 _( q! U1 e& ~+ _3 _+ M: W, o+ q' Y
9. 字体2 V5 t1 o d, `0 ], g$ a
本文翻译自《Introduction to 3D Game Programming with DirectX 9.0》第九章“Fonts”,敬请斧正!XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />1 ~2 v. d, N$ H( F* W
) \; n9 W# b+ B5 z" A ! `" D, Q6 \% T5 Z+ F0 r
, K- L/ H. [: Q+ j' ^6 t
在游戏中,文字信息的显示是必不可少的。本章将讨论在D3D中使用的三种显示字体的方法。同样,这里只列出每种方法的演示程序的主体框架。学完本章将达到如下目标:
, g+ E& g. L! |; `1 c
3 F# R( T9 C% Zl 学习如何使用ID3DXFont接口渲染文字
1 E) Q9 I- }6 Z2 C/ D, A! \% o* P; E8 v% g1 C$ k0 C
l 学习如何使用CD3DFont类渲染文字
' P( G6 v! B% i3 S* C+ Q
3 g8 R! L/ L& J, z, A2 ~l 学习计算游戏帧速度的方法
; P, a1 M( t; n7 \
( J7 [* R( H" [: ]2 @8 X$ Rl 学习使用D3DXCreateText函数创建3D文字
5 o T4 a2 d) Z
1 h1 N. t- j) \/ t* Q# P9.1. ID3DXFont8 y- f3 a) ?/ [! N' P. q
要在D3D程序输出文字,使用D3DX库提供的ID3DXFont接口很方便。其实该接口是使用GDI实现的,所以,其执行效率有所降低,但是它可以很方便地处理复杂的字体和格式。- T, p) X, w9 m7 y- ?) V
4 O) `4 o4 n0 ^8 y* L4 g0 s& r
9.1.1. 创建一个ID3DXFont
! v. D8 U [5 v/ X) U( s可使用D3DXCreateFontIndirect函数创建ID3DXFont:) h. ^0 O- V+ R1 y& J3 O1 B" S
2 K" {, |0 o- w( I1 s: ^HRESULT WINAPI D3DXCreateFontIndirect(& S( z+ E; o6 U, U- }+ \6 g
' R- z" u' x; E5 P0 W3 Z5 T LPDIRECT3DDEVICE9 pDevice,6 m! b( g6 x& L1 F
, X3 g, f* L* M) Y7 c CONST D3DXFONT_DESC *pDesc,
: T0 i1 g) N. d' ] [7 i% V2 Z+ i/ n* ]* x/ r
LPD3DXFONT *ppFont+ e7 M& X6 J2 c m% s! d# e1 d
2 ]. y( T; w5 f" n7 ]+ u2 O);
9 a, O' d" t/ C! [% f9 _( d
`, h# b [! h4 g6 h+ q0 X7 Q7 t7 s! Q6 C* r
译者注:我所使用的DirectX SDK是Microsoft DirectX 9.0 SDK Update (Summer 2004),也就是使用DirectX 9.0c的那个版本,在较早的版本里,该函数的原型有所不同:第二个参数为CONST LOGFONT *pLogFont,它是GDI中的结构。以后,如无特别说明,将以DirectX 9.0 SDK Update (Summer 2004)中声明的函数原型为准,特此声明!- u7 ^, t# q/ r% S3 S q
0 a8 T& n4 u: s1 e" a5 ]
使用这个函数时,需要一个D3DXFONT_DESC结构:1 _: l0 x& u3 Z ^" z7 Q) a- l
( |' Q7 K; W3 x/ `" K2 ]
D3DXFONT_DESC d3dFont;
' k* h$ r" c1 a# m; c0 ?0 C' g) r9 A
* D1 F( e, Z/ ^" L0 jmemset(&d3dFont,0,sizeof(d3dFont));
# D* r2 L* _* X( K3 X1 c% M: q9 g' g" o
d3dFont.Height=25; // in logical units
8 |9 {9 r5 d8 p' h! p" h8 A) A+ ]" d0 D; _) Q5 ?$ u
d3dFont.Width=12; // in logical units( A& N' s& U) D8 G3 Q$ A! l
# v- f& ~' Z8 {
d3dFont.Weight=500;// boldness, range 0(light) - 1000(bold)
, r. _4 B) K9 B7 ]+ P5 Z# x, u: m' i+ Y
d3dFont.Italic=FALSE;
% F$ J' ]: Q1 N! v" h$ k' x) r: Q- |+ A3 g: S
d3dFont.CharSet=DEFAULT_CHARSET;3 f6 h: A$ X: O# l B
5 U6 K4 Q) g0 s* B1 F0 l6 v, q
strcpy(d3dFont.FaceName,"Times New Roman");
2 ~4 T4 Q; O7 |9 i: v: S7 M
2 o. H# L' q4 P/ Y! j" KID3DXFont* font=0;
0 w2 f4 g* {# [! [* g' a6 v' x& p8 u$ B( e- s
D3DXCreateFontIndirect(Device,&d3dFont,&font);* V' N. B3 n7 R
9 R( o8 Z! I0 @5 L! H+ M
( m) ]* e; u) @) v9 Q' a2 |- r如果你使用的是LOGFONT结构,则:! S- Y5 X, X6 J& b: ~ x p: F
2 ~# S! c9 z: K+ `/ W" N
LOGFONT lf;8 v9 \) j) o" h% `. n0 ? u1 B0 u
5 m4 t: M4 ?7 {( U/ w0 U7 VZeroMemory(&lf, sizeof(LOGFONT));
: ], ^1 o/ I4 T6 C% F$ Z- N/ x7 Y6 j" q
lf.lfHeight = 25; // in logical units
0 _& @6 U2 ~# h, ]: ]" J) E7 Y
! v8 D/ c B* o8 m5 Flf.lfWidth = 12; // in logical units
3 T8 k1 z1 z5 ^/ `* T# a% H7 N: H
|9 u! Y0 L9 s5 V; B( `lf.lfWeight = 500; // boldness, range 0(light) - 1000(bold)
$ D0 p$ p, Y' w, ^ b0 p0 M% W( o/ ~! P1 p* U+ Q3 r8 B2 c
lf.lfItalic = false;; G: E E& d" i
3 o# x4 m: w. q' n# Q+ llf.lfUnderline = false;* N$ V' ~2 a N6 h3 K
* w* s$ \1 Y! x( U. P3 z. }3 s5 J
lf.lfStrikeOut = false;
9 m/ t. p( E2 Z$ s7 d- x3 \% _( K! B3 N
lf.lfCharSet = DEFAULT_CHARSET;" ^6 a3 Z8 n, ] G0 O) Y
' q( X1 ]# j+ ^5 m6 w$ ]4 Cstrcpy(lf.lfFaceName, "Times New Roman"); // font style2 W0 r! e: m) N$ V' B5 L
; C; i/ s. r1 F' k0 ^* p% fID3DXFont* font = 0;. H5 g$ `9 n7 k1 ?
3 c3 |/ j9 E* w C/ s
D3DXCreateFontIndirect(Device, &lf, &font);: F* Q/ @. p% {# v+ d/ U) T" Q
2 @( W. f% K! b7 j3 `* k5 a$ I, e0 p5 R: l V
另外,还可以使用D3DXCreateFont函数创建ID3DXFont的对象。
9 @( h2 r' g: U5 D2 x U, H. P6 G _
9.1.2. 绘制文字
+ E, T4 }/ f! F Y得到ID3DXFont接口后,绘制文字就很简单了,只需要调用ID3DXFont::DrawText方法:
5 J5 e s# `+ f0 w; Z; n- E
/ G! W9 F% i8 m8 e+ O& s2 k( |' vINT ID3DXFont::DrawText(
0 l. D" `" L, y1 e) `& Z
0 r6 P5 k% A0 @# B9 o, A6 F+ r LPD3DXSPRITE pSprite,
% l/ t& \/ T+ k
( ~& `9 T* ~/ x. ^ LPCTSTR pString,5 Q" c2 G" P3 d9 C8 d
1 l/ o5 j4 z- f6 s INT Count,
$ y' H7 {# ?: r2 u0 q3 Q5 h9 \' z+ ?. x3 Q' H
LPRECT pRect,: h! d" G, z- ?7 w
6 ^( w& U& o: i: T# }) c2 p! x DWORD Format,. X# @9 @/ T, t# W/ I
! W! ^$ J. j; \- {
D3DCOLOR Color' U3 M3 t$ d5 ]* d& b* ^$ H/ |# X
6 Z6 o( d( i; I' w7 _3 t( P0 p);
/ R" h7 R; n5 O$ J! i
2 x8 Z% U0 y% M: q' _$ L- a% w
6 z* @# g7 t; h' P/ c3 |l pSprite –输出目标,为ID3DXSprite对象指针,可以为NULL值,此时字符串输出到默认对象
; d% l9 ^- m( Z+ s- b
# h! q7 k6 S8 T, U2 ]2 [# U$ y" gl pString –需要输出的字符串- M; c' d, U1 C9 F7 w
6 b* E% v, ]7 M7 k; T# e. Gl Count –字符串的字符数,如果为-1,则以0字符为结束标志, e* j/ V$ N/ I# u. a
; Q: q( Z% z, j, j( ?1 j* xl pRect –绘制字符串的区域
( m* @9 R9 V: p+ z
' H1 _/ U( {' m8 tl Format –文字的输出格式8 P' f1 c3 c* M6 I* e
$ {* ]5 ?* \6 _+ h* C8 Ul Color –文字颜色, j# k( P9 T U! \+ g
- {0 K2 U% W- @. L2 c3 x
例如,可以这样使用该方法:
1 ~& L9 g8 o; s( f! i% B1 s6 Z/ p; B. n) ?
Font->DrawText(NULL,
! r+ z- k9 e+ y% p, @/ w: Q D
+ r- }, t9 F( B: r7 S "Hello World", // String to draw.
% l+ U8 Z" i( j0 S. m. M& Z& \- A; E) W" }* o w8 c0 S* W' @/ L
-1, // Null terminating string.
8 N( E# P3 X$ ^% A( w" }" |3 y @" p6 r
&rect, // Rectangle to draw the string in.
# G* D# h Y" |: c! W5 f' g
0 R, J) M6 n1 U; e1 G$ t2 D DT_TOP | DT_LEFT, // Draw in top-left corner of rect.$ j3 M- N/ `' f
: R% G0 I7 X" @
0xff000000); // Black.1 E8 N; I& e5 o9 J2 T( r7 R# p9 C
* [7 M: @# h% _1 N3 K0 t
" }" @) m8 R$ w1 s5 a" w3 z9 E# ]2 ^4 `9.1.3. 计算帧速率0 {8 h( T( D0 q* S% M
帧速率用FPS(Frame per Second)表示。首先声明三个全局变量:- \6 X' Y9 E1 Q" M' C7 C3 ^0 w' Y* I
& T& G; I% Q# P- a Z V* j+ a$ z
DWORD FrameCnt; // The number of frames that have occurred.2 |) Z8 k" J7 M3 X$ S- Y
9 t2 D6 h/ `3 S, d1 ~float TimeElapsed; // The time that has elapsed so far.
% u+ q8 Z; n1 b, Z- x) z) {5 R4 B# b% }* ?$ [& V
float FPS; // The frames rendered per second.
. f- H8 @% T0 C: P # u9 f% s% @7 y# x E* Y
7 _! { m' a$ c; s0 I2 N. @
每秒计算一次FPS,这里计算的是平均值。我们也可以有足够的时间去读FPS值,而不至于因FPS的快速变化而产生较大误差。9 ~6 L( J4 b) B% j
1 I: @5 u% ?* D0 J/ W, H# ?
每渲染一帧,累加一次帧数和所用的时间值:
# P$ r9 s7 l( `* O. p: d3 Q! H) j& ?, |2 r0 {7 V4 r- B5 k
FrameCnt++;6 T* Z( X3 b+ L) ?! k+ n @* k
* p/ @+ M4 o! a6 PTimeElapsed += timeDelta;3 G) f5 L9 h/ |0 L
- p6 o3 p, m8 w" v. X1 ?
) b" m7 M# `8 w6 @3 R! w! o这里的timeDelta表示两帧间的时间间隔。每过去一秒,就可以使用下面的公式计算FPS了:
! D* K: \/ U- R B* V* j: u- R) Q& d- P* M2 s
FPS = (float)FrameCnt / TimeElapsed;
) H7 d( v" g4 T- R* { ! {' e1 G( Y$ {% V( [3 S) k9 L
v o1 R5 m' M6 h3 { S& J1 k计算完成后,需要将FrameCnt和TimeElapsed重新置0,这样下一次的计算结果才正确:
1 f" F9 e. G# s9 i6 O
7 Z3 |0 s7 l* U# }- x* t% |5 tvoid CalcFPS(float timeDelta)
/ N* q) i+ P2 Z# \ f$ ^' }/ w6 }. T. b1 l
{3 W% H. A" [& a. |; |9 x* |; I
( o3 e4 U* |2 m) b4 u T0 s6 d FrameCnt++;1 c7 _) @% D& \3 Z0 U0 `+ u6 r" S. i6 B
$ c1 b, u3 b, y4 P
TimeElapsed += timeDelta;% s* x3 A* a! j; p' j0 e
' g4 p, _5 O7 {* ?1 K1 {
if(TimeElapsed >= 1.0f)
3 s1 s& v3 |* k/ `! S' F' i) B6 J& g: F! a$ b/ c/ J- h% O9 `5 P
{
& ^& C% `' A# t" n5 F- Y. K. F3 N! k I
FPS = (float)FrameCnt / TimeElapsed;
% S$ n4 i$ {" ]7 Q8 i9 T
1 J2 d o. ~. Q3 J# s) n7 y7 R TimeElapsed = 0.0f;" V/ l3 s( _5 u' w- N: \
' V. u2 c% t' D" t2 t3 u
FrameCnt = 0;
' e; K( C5 f5 C7 I) y
5 m% X; F8 d& G: X$ W7 T( l }) r5 \$ ~" o0 V6 u+ U, R* K9 n. b
* Q9 P+ J: L- @, x6 C m}
0 m, ^% u4 `" V( X6 y1 p
# v& {/ W9 F }) C' z, j% j; N6 c- }5 a+ q. U3 K0 ~% v5 c& O# \
9.2. CD3DFont
8 H/ r9 b3 Y& h+ g9 L$ M在DirectX SDK的安装目录下,提供了很多有用的代码CD3DFont类就位于其中。该类使用纹理三角形和Direct3D渲染文字,而不是通过GDI渲染,所以,其效率高于ID3DXFont。但是,CD3DFont不支持复杂的字体和文本格式,如果只需要高速渲染简单的字体,CD3DFont应是首选。
2 e$ d, ]1 ^( |" b* `+ a t0 f4 Y' ?: U& Z- F
使用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版本!
- |7 h2 M4 ~6 x2 ^! C, ~2 Y8 C# W1 W: y: K' p4 S) E
9.2.1. 创建CD3DFont对象
! o6 v# U6 O9 A$ V创建CD3DFont的对象,就像创建一个普通的C++对象一样,其构造函数如下:% y" `- \. s2 L/ Y# `; X9 n c
; O! U* f# B! P9 vCD3DFont(const TCHAR* strFontName, DWORD dwHeight, DWORD dwFlags=0L);+ N% e5 E) E% c4 W( w- j! P
/ a& o# t6 \7 N- @( j- x$ ?
1 N! K: M7 T0 s( ?" }9 ^0 |! Il strFontName –所使用的字体名称
# A! r) L9 N" p, P
- m, M, b4 T+ n5 q& L0 [2 |l dwHeight –字体高度
( ]5 L! {) a/ e
9 f" ^, _- f4 nl dwFlags –可选的标志,如D3DFONT_BOLD、D3DFONT_ITALIC、D3DFONT_ZENABLE等。
# e! d q* m, ~! [% f4 S/ P" t1 }7 [% V0 H/ U# z
得到CD3DFont对象后,还需按顺序进行初始化,如:9 H; W' F- I c" z) T7 F
* _" B/ P' ]; b" H1 z! ?& Z; ~Font = new CD3DFont("Times New Roman", 16, 0); // instantiate9 j9 H; O0 D E+ j. L$ p: n% X6 Z
7 ?# p2 }( ~$ z
Font->InitDeviceObjects( Device );
) h0 M+ C, N- g9 h9 w, y z+ j
) [$ k# i ^' s) k# c! UFont->RestoreDeviceObjects();, M: x! U8 t" V8 t4 t
9 ^9 I- T* ?# J; J% ]7 k1 q. E
% o, M+ J* O$ X# R! @& K0 [9.2.2. 绘制文字2 {: S# L. Y0 R: o
使用CD3DFont对象的如下方法渲染文字:
7 B: `; ]8 D( m, D
; ?/ t6 k0 e1 T$ {1 x- |( OHRESULT CD3DFont::DrawText(FLOAT x, FLOAT y, DWORD dwColor,
7 {, g+ r6 K d2 D" ?$ E) E+ _4 z+ [) B* c5 v) Y: q
const TCHAR* strText, DWORD dwFlags=0L);1 B' i/ f/ `! P$ }
/ v5 P; |) ?2 @+ \ h5 e$ Q7 |
% Z& S7 g3 y5 sl x –屏幕的x坐标
7 [! d2 C- O# z4 W% h" R4 |
( r; U$ w9 d( M I& f# V1 |l y –屏幕的y坐标
# u& g8 a. A% ]! O% Q/ D3 b
( c4 J6 ?' h7 P, m9 ~l dwColor –文字的颜色2 S: i7 Z: h" A
+ A7 K3 q' Q# Y/ r
l strText –要绘制的字符串( ^) }; \- ^: A3 d c3 y. o
2 M: e' R8 T6 z4 `* t ~0 ?8 y
l dwFlags –可选的渲染标志,可为0或下面的值:D3DFONT_CENTERED、D3DFONT_TWOSIDED、D3DFONT_FILTERED。: T: e! D( ^! y/ ]2 X+ M
$ k' Z4 A$ S5 J3 I w- j
例如:/ i% I3 j0 _) k- L& f! ]% S8 q0 _
& q& j* }# m f
Font->DrawText(20, 20, 0xff000000, “Hello, World”);
6 R/ w. d, w0 Y' ]- d# ` ' |% Z" J; c, Q$ W
3 z* h) H* [" h' }4 v0 r: U
9.2.3. 资源清除
! |% M$ [ c) C- u( J: ~4 O在删除CD3DFont对象前,还需作一些清除的工作:9 y, T+ `2 C. m/ X* v7 o
8 I# c0 b* M6 h: [0 \) {
Font->InvalidateDeviceObjects();0 i! r$ F: Q v5 n& [
T( N( E# Q4 f, S" xFont->DeleteDeviceObjects();% I- ]) h; Z4 O/ H8 e/ p4 M
0 s. V1 g5 g: B/ F. _2 mdelete Font;# p: G8 J: c5 [4 l9 {4 [. R
; U7 ?. G9 u2 c. ~- M. d
, ^3 ]3 C+ \* u3 [, K- L: n
9.3. 函数D3DXCreateText
* u P& M1 e0 h! P' E该函数用于创建3D文字Mesh,原型如下: U- p W8 _0 V. ?
9 a: b2 W1 L# C' Y& `HRESULT WINAPI D3DXCreateText(9 e4 r" O: \8 h, @* A, T# Q" @) W
# b+ n Z, J6 f$ V+ o6 `
LPDIRECT3DDEVICE9 pDevice,
- ~9 J# S' r9 Q, z8 i! _
: }0 M) y% B' G& p, M; d1 f HDC hDC,5 M6 J& o1 w4 O. ]& X# j1 L
# I! V% ^4 b" f/ h7 d9 g5 E, c
LPCTSTR pText,
y! d: O% X6 G* _, k% K2 t" i9 \- }! _' A5 f) s. q6 R T
FLOAT Deviation,+ G9 i" c2 N* C- _
0 Z7 g8 `0 `7 p
FLOAT Extrusion,
& q$ ^$ ]! c+ B% F9 \4 E+ }3 ?" A, [) `& ?/ C3 |3 q
LPD3DXMESH *ppMesh,
- g) O. w1 z- @6 ~/ L- e5 S
' h( |5 P+ x( d1 Z LPD3DXBUFFER *ppAdjacency,/ l* d! _$ y5 j7 M- c
$ \6 G6 k' F5 e4 o
LPGLYPHMETRICSFLOAT pGlyphMetrics
7 g: Y f! b( ?& S* Y! z+ n9 O0 O9 j9 X' s" F4 n# V8 c7 G; l7 O5 o
);' ?: b5 Q8 G% {
; W7 K4 a. k o! |( H" G: R6 G; W. N: k4 e
l pDevice –D3D设备: m) k3 E- w% S0 d/ h
2 B V; z& b5 U) R' j# L" u
l hDC –描述字体的设备上下文句柄1 R. j6 m: h" X5 K' H
+ y( k) y: w! Y: B0 I& |8 bl pText –要渲染的字符串7 |9 ]+ B8 c4 x7 g- p
9 Z6 F* {. N3 el Deviation –TrueType字体的一个属性,该值不能小于0。如果为0,则使用字体的默认值# d0 n! V) \! `! ?7 t, ?! i6 V
: d+ b" X& ^, y# |3 n( }- {4 {
l Extrusion –字体的深度,相对于Z坐标轴
6 K5 |& ~* j/ ~% B9 [# J
2 q$ Q8 P( h6 k$ z: {, I9 q; [l ppMesh –返回生成的Mesh对象指针
9 D. q c4 T7 ?& ^* I9 v. V* G- G; X* w, Q; b( Y
l ppAdjacency –返回邻接信息。如果不需要该信息,可使用NULL指针
( B; K) d( x' ^2 ]4 ~; C8 h. [8 Y! y2 q, O/ ~3 C' k, I
l pGlyphMetrics –结构GLYPHMETRICSFLOAT的数组,返回轮廓矩阵数据。如果不需要该数据,可以设该参数为NULL# E+ n3 n' j' [2 n" f$ }% o& m7 S
0 Q6 @' ~3 T% d$ g下面就举例说明如何使用该函数创建3D文字的Mesh对象。
/ ?1 D& f) ~) C+ C' R
* F) p% T* a5 I6 B+ n) h// Obtain a handle to a device context.9 e! q, U/ b. v. V
" {6 |( k8 q$ r8 p+ w0 n7 L) P" yHDC hdc = CreateCompatibleDC( 0 );" x9 |" V+ ~, N% M, `5 g5 K
/ y8 p' r0 b; S# A3 G( V0 }* Q// Fill out a LOGFONT structure that describes the font’s properties.
; e7 [+ ^# ]7 \
8 L4 k+ p Q% j2 LLOGFONT lf;9 G3 R! k5 H3 s: H
0 L4 d2 S4 O7 H5 F2 j, A
ZeroMemory(&lf, sizeof(LOGFONT));
m1 I9 v/ f: t2 H3 b; z) n7 f8 p' f; H3 H
lf.lfHeight = 25; // in logical units# T% x3 d- ?7 Q/ E
5 i. A. h" ^- q7 N2 {3 `- a Plf.lfWidth = 12; // in logical units U4 l, x7 C8 W6 |* S. K
: A; }4 i7 g1 {8 Q) v0 S0 vlf.lfWeight = 500; // boldness, range 0(light) - 1000(bold)2 c# ~1 Q; }: \, D
# f: X4 _2 e2 f7 |
lf.lfItalic = false;
. i6 N) o$ R) ~ h- [; C1 k# ]
6 d* m3 h' D. e1 Ilf.lfUnderline = false;
! B: i2 G! p6 s7 w6 G0 `' F" J% K6 ^: [( N' O# X( ?) k, C0 W9 d
lf.lfStrikeOut = false;
. T5 o9 Z y9 B4 c1 b; L6 v! O" f* d
lf.lfCharSet = DEFAULT_CHARSET;
% k$ o3 K! N6 e' V+ [" \9 b( S+ X: V" p/ c U
strcpy(lf.lfFaceName, "Times New Roman"); // font style
8 Q6 N5 _2 [5 B- ^: T! M
1 F7 L$ V6 h3 Y, o// Create a font and select that font with the device context.# I. b9 p ~1 D/ t, g/ l
1 r7 j# b7 ^) Q7 O% RHFONT hFont;
9 h' [( T5 C. C, I7 y/ Q
4 M9 a; m; G, [0 F) b% _9 S+ VHFONT hFontOld;
* @$ m7 O; N5 l ^1 m+ f8 w# `7 T* r8 D
hFont = CreateFontIndirect(&lf);# ^- C1 Q( k5 f$ r: n& B
3 {: |1 _0 W, P9 k8 K8 O# C3 mhFontOld = (HFONT)SelectObject(hdc, hFont);
( ]3 v* `9 j4 b4 ~, x' y
! ~ N+ J6 R, s+ }// Create the 3D mesh of text.
% {, {- p! T# v/ E0 ^& A9 f5 J9 k) D9 V N
ID3DXMesh* Text = 0;3 u+ e( ]! g) R7 ~0 }0 b6 q1 g
& i1 L2 r9 Q8 l* V* ~+ FD3DXCreateText(_device, hdc, "Direct3D", 0.001f, 0.4f, &Text, 0, 0);- O, F/ U* s" V& M# W4 {6 c4 ]2 L
7 K- g9 \+ }; t# c a
// Reselect the old font, and free resources.1 F5 G! J; N/ O4 [8 Y- q
+ ~; t0 |" n& g/ R) i$ ESelectObject(hdc, hFontOld);
0 s7 `* @' m+ m) I6 p( h& G5 ~( S M v
DeleteObject( hFont );
R0 z8 B1 @( q0 E6 ~
. I- Z- M, W" f# F( D* SDeleteDC( hdc );$ L2 i: @4 F9 ~' s2 f
& t- t m& V; I$ E: Y6 p" q( t+ t4 g/ j
这时,Mesh对象已经得到了。最后,直接使用DrawSubset方法渲染即可:5 R& I. B; E4 g& V5 Y5 H
t+ F4 Q! D# W
Text->DrawSubset( 0 );
7 x* y( r8 y1 r, U5 T# Z
+ J; ]+ e W% S0 {* H# G) P5 a0 u3 w: Q( L* c
译者注:上面的例子代码,使用的是较早的DirectX 9.0 SDK,不是Summer 2004版本。: e' ^7 R8 \5 U" @4 [# u- n
1 H" q' M; ^: S6 \; Y9.4. 总结1 o" M8 [: q' q9 S" }
l 如果需要渲染较复杂的字体和格式,使用ID3DXFont接口会很方便。但是该接口是使用GDI实现的,故效率较低。
# |% ~7 \/ `: K6 g
( o7 {1 F1 o. }% Nl CD3DFont类可以快速的渲染简单的字体。该类实用D3D的纹理三角形渲染文字,故速度较ID3DXFont为快。
9 t' ~6 S$ s" ^3 w3 Z* m" l* L1 S, U; F1 _; t& @
l 使用D3DXCreateText函数可以创建文字的3D网格模型。 |