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

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

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

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

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

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

http://www.5178c.cn/article/6/2006/200605173892.html3 S$ `2 Z9 t# O! Q  l, f" `

( u1 r7 ]' W' B# }. [1 n( F! W0 Q在DirectX 9.0中渲染文字 ; \. x- W  w9 \9 G* p5 g1 W
作者:佚名  来源:不详  发布时间:2006-5-17 12:27:04  发布人:admin
: M/ j: h$ @+ q减小字体 增大字体 8 E# V  [1 B! ]

5 L" _# k7 K% u& O4 n; v
1 Y3 Q; J; G% O* T0 ?: r! A( }- q$ \0 z1 u, E! x$ h$ F9 t
: R1 h- {# ]1 N8 ?: ]: l! y7 [
# P6 J2 l, Q* a8 u; m% V6 |! l
4 i$ ~# x& y4 i) `3 L$ i
9.   字体
5 N4 K7 i; j' ~6 G6 ?本文翻译自《Introduction to 3D Game Programming with DirectX 9.0》第九章“Fonts”,敬请斧正!XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />: Y0 C  B' j) [( c( L% n

8 z. H% b( R4 A; S; y% M 7 a# o# M: U. g7 a$ \, y

) ]% o# V" s6 A6 Y7 r: [0 f/ a! Q在游戏中,文字信息的显示是必不可少的。本章将讨论在D3D中使用的三种显示字体的方法。同样,这里只列出每种方法的演示程序的主体框架。学完本章将达到如下目标:* u# G& N& J1 \% i" s1 y
' C* P5 U& c" l4 e) S( y" H- G- T
l          学习如何使用ID3DXFont接口渲染文字
/ s: }/ F5 J0 U8 k
$ W+ u# z5 p$ C) T: I5 Kl          学习如何使用CD3DFont类渲染文字" `' o: o/ N3 w& H8 a
: L/ K7 F  I' l; g% [1 @3 g
l          学习计算游戏帧速度的方法: m* X. [. N# c/ z% y% S& x7 {
0 ?5 b- \: |# G0 k9 r
l          学习使用D3DXCreateText函数创建3D文字
# Q/ j- _; h6 ^  [# A4 C7 _0 V0 n- L) ]1 |, n" h! s0 ?
9.1. ID3DXFont4 O6 ~. ^7 v% W1 a; S+ ?
要在D3D程序输出文字,使用D3DX库提供的ID3DXFont接口很方便。其实该接口是使用GDI实现的,所以,其执行效率有所降低,但是它可以很方便地处理复杂的字体和格式。
( u+ r5 c4 v% r8 L( F; `5 C) A) R1 A; w
9.1.1.    创建一个ID3DXFont
  o. M% Z2 {- R% S( f4 I4 n0 L可使用D3DXCreateFontIndirect函数创建ID3DXFont:
0 G9 v& Z5 d4 B- C( a
5 k$ i; V& h2 F) W0 k# v+ eHRESULT WINAPI D3DXCreateFontIndirect(
) T0 P: z; _( K9 K3 B: w
6 u1 C# q' X: V+ Q5 U1 M5 e    LPDIRECT3DDEVICE9 pDevice,: D' J6 R" p+ F* p& Z8 G6 L' k+ p, D
4 s4 v+ e* u$ B6 S+ N9 k/ t( `! Y
    CONST D3DXFONT_DESC *pDesc,/ @; U4 Q; y* j, J7 j* X

+ D- p8 M) W0 @# }% [/ }5 F    LPD3DXFONT *ppFont
% N% {: P8 ]' j6 D. M; I& M7 E7 S1 O8 J
);4 ?4 S' M2 a2 ~& k' w4 M$ t) W
& E5 Y8 z5 L' a, S

" ?4 W2 `3 m1 g8 r4 f译者注:我所使用的DirectX SDK是Microsoft DirectX 9.0 SDK Update (Summer 2004),也就是使用DirectX 9.0c的那个版本,在较早的版本里,该函数的原型有所不同:第二个参数为CONST LOGFONT *pLogFont,它是GDI中的结构。以后,如无特别说明,将以DirectX 9.0 SDK Update (Summer 2004)中声明的函数原型为准,特此声明!9 h0 ]) P+ X. i# Q

$ n8 ]  S" @" b. ]; L8 D, D使用这个函数时,需要一个D3DXFONT_DESC结构:
. l+ I& n# E7 y+ |8 q" @/ N6 f" g, `9 ]/ ~- h
D3DXFONT_DESC d3dFont;
) H7 G: \/ O1 \9 u8 u
* `( r: A4 ^- \6 {& o8 fmemset(&d3dFont,0,sizeof(d3dFont));; D7 N5 w) q% c1 e
3 O9 o% F# V. N
d3dFont.Height=25; // in logical units! B0 {1 E3 U% S9 @0 y

5 Z: H. W7 F( `: r' H/ ld3dFont.Width=12;  // in logical units
8 k8 _5 f/ T/ W9 l
+ ]  w6 G& {3 i% v% @6 Nd3dFont.Weight=500;// boldness, range 0(light) - 1000(bold)
8 G( P% T" @1 v# W9 a2 k  G/ P. Z* A+ v
d3dFont.Italic=FALSE;. E) E2 L" q+ ]
: g3 n( w, |6 t2 j, b  w. Q3 w! T
d3dFont.CharSet=DEFAULT_CHARSET;
1 F. W8 ~8 l# ~% l: U& X9 d* g: G" T8 [
strcpy(d3dFont.FaceName,"Times New Roman");) X" o* r$ _) F" t
2 t# G$ v7 r8 \
ID3DXFont* font=0;
( w: I3 J; W' k9 X
/ g; L3 r4 s0 l( }4 UD3DXCreateFontIndirect(Device,&d3dFont,&font);6 ]( i3 B$ W' ?$ T3 \6 v' m! B

9 Q$ e4 Q* t6 K5 g$ ]! Z; a# O1 P0 I  w& E4 N
如果你使用的是LOGFONT结构,则:
: l! g2 l7 v& Y) X5 N0 f9 V' D& z/ W. y$ G7 ~+ _. E; m
LOGFONT lf;
1 {1 w0 X, a3 |5 h8 |
. d0 I8 ~  n- aZeroMemory(&lf, sizeof(LOGFONT));
- C  [8 O0 t5 ?9 i2 i3 Y2 t8 A5 \& |  x* q  d* L  p. M) O
lf.lfHeight = 25; // in logical units( L, Q# |; B+ m0 q. r9 B& L! C

% [; A% b( ?/ d; p2 j. g: slf.lfWidth = 12; // in logical units
' b* I$ D- Y( n9 k7 Q) E! S
* E9 t- c$ {: R: B7 `* plf.lfWeight = 500; // boldness, range 0(light) - 1000(bold)% \3 T, u1 a- ~4 m; m
( j( E" x4 P( [$ {
lf.lfItalic = false;" T. O& |! l# e, p' A5 \5 U

8 |8 I6 i' l- \2 N* a: j% jlf.lfUnderline = false;
- A* L- j" p( f+ F% l" P; M4 a2 o2 x4 t3 K8 U' `6 }0 j* i) ^' f5 h
lf.lfStrikeOut = false;
  R& K4 S0 \: u) {/ N& A
; H# s( m7 T2 c# ilf.lfCharSet = DEFAULT_CHARSET;
8 {+ _( Z" W) F6 ?: y$ ^8 v+ G, \9 N" j& N: M  q3 d
strcpy(lf.lfFaceName, "Times New Roman"); // font style0 v& E5 a+ \7 S1 n) L$ I+ O
0 |8 j2 R+ ~* ]& G* @# W
ID3DXFont* font = 0;  N& _- @* A6 z9 Z

3 U) F" f: g8 ~% p* l' ?; ]D3DXCreateFontIndirect(Device, &lf, &font);% g' e% i. d) K: n# Q+ t
+ v( S. b3 M. \5 k( `

1 F7 F) ]& M5 {5 k& t4 G另外,还可以使用D3DXCreateFont函数创建ID3DXFont的对象。2 D; l! z9 h5 [- ^

6 N( Y% O8 s+ J8 v+ p5 Q! I. j9.1.2.    绘制文字( d+ M4 v) ]. {; v4 ]/ m
得到ID3DXFont接口后,绘制文字就很简单了,只需要调用ID3DXFont::DrawText方法:; M+ g8 H- l1 H' E

* ^' n" V4 G$ v. }& B; HINT ID3DXFont::DrawText(
8 c% H. a0 C8 k6 L+ z5 Q7 ~
* _, F! ?1 h& O; f' `/ P& ~    LPD3DXSPRITE pSprite,* J! z) u! K9 _4 ?/ j

& h/ _4 z! K' N) i    LPCTSTR pString,
: m* k; O& {/ S6 b4 P3 J
# T* d  `* f4 U6 P% ]% Q* X8 n    INT Count,
; D# `+ ?9 x! ]! X" {/ ^. {
% Z& q( ^" W, ]9 |) j    LPRECT pRect,5 o# M, q8 Q! x, X& G

3 j/ d* ]+ O  C" H    DWORD Format,7 {; W8 Y* i1 e# |0 \0 E( I" d9 _6 e

1 s+ Z- w, ^* \* ]    D3DCOLOR Color$ V$ f7 k7 l4 G4 s& W% ]* ?2 l
7 r$ F, U- Y! N4 C
);* L, o8 d5 _$ i! O8 U
6 o  o, _0 A# }7 n, F9 d# L
' t& d' L' P  q4 [: `$ ?( z
l          pSprite –输出目标,为ID3DXSprite对象指针,可以为NULL值,此时字符串输出到默认对象* b: ^' j3 X/ Q
6 t- j4 G$ ]% f2 {' D5 p8 F
l          pString –需要输出的字符串. P" P0 R8 a/ ~# }9 V- E

  W5 `% e) n& R0 tl          Count –字符串的字符数,如果为-1,则以0字符为结束标志
+ W. ?. \  e$ d4 `+ }- b: }9 d: U$ t) |3 f6 |  \
l          pRect –绘制字符串的区域% m7 l% h; s+ v* T' p1 ]& ~

+ ?  \5 ^$ i2 {6 m& K( hl          Format –文字的输出格式- C4 R; Z2 t7 @$ w6 u- Q
  R4 m: O3 I6 e" e
l          Color –文字颜色) A4 R6 `% w* }

3 `- ^0 H/ }2 _, H例如,可以这样使用该方法:
" e7 P2 L/ y1 A  m5 M% B1 K
- k3 v! P  V' A0 ]( ]/ cFont->DrawText(NULL,1 s: ]% k1 J/ v5 r

8 o( _4 Y5 V4 k4 P. _3 y1 R4 |$ b    "Hello World", // String to draw.
+ W9 r# Y: `8 a) U
) D" r9 V; K; b. [( A; Q8 Q. V3 [    -1, // Null terminating string.
: j# c  ~- x" Z% M7 {! _* I! \* f  g& G
    &rect, // Rectangle to draw the string in.
0 U; b7 j+ Q3 X8 \* r! \$ K$ B- z: o
    DT_TOP | DT_LEFT, // Draw in top-left corner of rect.
2 r, p2 u* C3 G& h1 i+ z2 k6 Z! r  x' r' K1 F  j
    0xff000000); // Black.
5 \' @7 X: I4 C$ q " g6 k; }! y* q5 q. l; S" G( s3 x

& h* K* n6 M/ K9.1.3.    计算帧速率
' V$ P* I" @% m+ y: d帧速率用FPS(Frame per Second)表示。首先声明三个全局变量:! e* e' w( r0 b6 y& ]

6 e( Q2 O7 E+ t6 v6 B5 m: NDWORD FrameCnt; // The number of frames that have occurred.
$ x" g* l% S& t8 X% l' {3 Q5 v, u+ _
- ]! @5 A! G4 N# \$ }0 U( R5 Nfloat TimeElapsed; // The time that has elapsed so far.6 i; K& j+ j( L# g, ~- R
6 D9 w% C1 {) \% d$ V  b7 _3 K1 \
float FPS; // The frames rendered per second.! l$ S  d' y" V/ H5 @6 }
4 L0 i9 X' l- H0 e& W2 {5 Z9 o$ k

5 H2 K. P% a9 y4 Z; h) _每秒计算一次FPS,这里计算的是平均值。我们也可以有足够的时间去读FPS值,而不至于因FPS的快速变化而产生较大误差。
& m3 {# m5 E1 S4 w: B1 G# X6 f$ m6 A5 i( R- j7 L- r+ S1 V1 l4 I1 K
每渲染一帧,累加一次帧数和所用的时间值:
- ^: \; Y8 f( W; O% a1 F" \* g. f& P5 G  w* r; O
FrameCnt++;2 a2 s" o( r9 w
9 c  `% `$ B" L4 B! W. X
TimeElapsed += timeDelta;
: v  b4 e- j1 P( D8 y
0 h! z: q+ v+ z$ k
9 a- ]  l: @  R( r- [* j  s这里的timeDelta表示两帧间的时间间隔。每过去一秒,就可以使用下面的公式计算FPS了:/ X# x: U# C/ f( w7 E( D

$ o$ z+ \2 H! m9 |FPS = (float)FrameCnt / TimeElapsed;
- ]' _7 }- ?+ B& d0 A% p$ o/ m7 F & m6 {' o5 U# y/ k% ]* a

; w( @% G, Y/ B  v计算完成后,需要将FrameCnt和TimeElapsed重新置0,这样下一次的计算结果才正确:
% X/ F6 L% D0 E& j
9 F, U' n6 G3 d- C& ?/ mvoid CalcFPS(float timeDelta)
: V( m3 B" |9 S! n' G& b
  J; s' l, o! b% V6 W3 d9 U& E{
7 K- V) W4 i$ _( f* S
9 t1 K# z3 j( `6 {    FrameCnt++;
$ L4 ]& C; L8 O8 R- g* B1 Y
' A7 g! B( ?2 X. K; c    TimeElapsed += timeDelta;
% R0 [$ q  v% w9 T. X" i( ]7 w/ \% Y3 M6 n# W, I
    if(TimeElapsed >= 1.0f)& V' C. Q- r7 O9 v6 S

: x8 F* a. I$ k) x7 C. L    {
& A* [9 `+ [' \- Y, b) A
" |" D* I1 g( r& A  b# E- o# n3 O# j        FPS = (float)FrameCnt / TimeElapsed;
, d* g3 @- W% V/ O4 S9 g* _' S6 O) w6 r4 {1 x7 U
        TimeElapsed = 0.0f;, e( O+ ]" A/ A
' G5 g3 i1 t2 G# o
        FrameCnt = 0;
" K/ x5 f9 x" j$ }' ?
* f) e) v+ R: n/ C$ X; M    }; O; Z5 b  H* b7 e( [1 q! D7 j& u
( \# Q# _" g9 e4 E- Y9 A7 ^
}0 u( G. v6 u/ l. ^8 x- C) z" P) e
& U: @8 i1 Z, W% L
7 @0 q! p3 I" `
9.2. CD3DFont
+ ^+ X, m, U* ~& G4 ]6 V; ^/ q在DirectX SDK的安装目录下,提供了很多有用的代码CD3DFont类就位于其中。该类使用纹理三角形和Direct3D渲染文字,而不是通过GDI渲染,所以,其效率高于ID3DXFont。但是,CD3DFont不支持复杂的字体和文本格式,如果只需要高速渲染简单的字体,CD3DFont应是首选。
& \6 n- \* ]( K" X+ |
$ ~* L0 h" m( Q. Z使用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 J& ]- `; P; j+ ~/ X6 h& @% P

8 C* S$ s& B- q* K4 U* k9.2.1.    创建CD3DFont对象8 k/ C+ T7 t: M# d( @
创建CD3DFont的对象,就像创建一个普通的C++对象一样,其构造函数如下:
8 N7 o9 _) S0 s4 c
6 T# U* R/ X4 m6 _& I" \CD3DFont(const TCHAR* strFontName, DWORD dwHeight, DWORD dwFlags=0L);
4 K) G* B& s1 R' a 2 I, {4 v7 i. \# T& g( b( S$ X: h

8 e* B- R: N/ G2 {, V" |, o/ q! bl          strFontName –所使用的字体名称! \- s' z% C+ v* J" D5 U2 I
, J  r, e) C  D+ F( s
l          dwHeight –字体高度
& g0 ]0 l% r" |5 j; N" f
9 }; p# Y6 I5 w$ x' b% yl          dwFlags –可选的标志,如D3DFONT_BOLD、D3DFONT_ITALIC、D3DFONT_ZENABLE等。" m* ^. F1 k: I0 l  l/ Z
: k3 J# b5 i7 ?7 i1 ?( c$ \
得到CD3DFont对象后,还需按顺序进行初始化,如:( d" D. ~% Z( d+ s, |, `

- Q# J+ s+ b3 o* I, [4 TFont = new CD3DFont("Times New Roman", 16, 0); // instantiate& Q6 Y& F, V0 b& C  t! Y
- q; e9 F  K1 A$ X" g+ J+ M
Font->InitDeviceObjects( Device );) k& e9 ^5 ^1 X' h& K" \

4 Y) U2 g1 |$ {; I/ g( W0 SFont->RestoreDeviceObjects();
9 Q+ w6 V' H, z " n8 U0 I$ m6 O# [% I

5 ]2 g% D  W& _3 x  W6 z9.2.2.    绘制文字
4 e3 C7 g) O# ]: }' b' V使用CD3DFont对象的如下方法渲染文字:/ @$ Y# d; k( p* U/ w

2 E5 h, Q; ^* j7 N! [3 ZHRESULT CD3DFont::DrawText(FLOAT x, FLOAT y, DWORD dwColor,
% N, u: Q3 V. Z) n" y5 a( e4 x; U$ r3 E
    const TCHAR* strText, DWORD dwFlags=0L);, C  ?) {; Z2 L+ k+ F% Q- @

6 N, p& u) j% K
: M) ~& n- c7 Z) G- O8 V6 O, [l          x –屏幕的x坐标  D1 _, p, E* s9 l

0 W) T1 @! X7 S! Al          y –屏幕的y坐标
3 v" j& B- _7 n) c1 S
# |$ z# @8 \( f' g( d0 el          dwColor –文字的颜色
/ x6 o* N+ @: s4 ~5 Y9 ~3 H/ D4 `7 Q: `/ H
l          strText –要绘制的字符串
& ~" X0 D. x7 G+ a" @
, Q9 R6 M/ s8 }3 x) C8 il          dwFlags –可选的渲染标志,可为0或下面的值:D3DFONT_CENTERED、D3DFONT_TWOSIDED、D3DFONT_FILTERED。" i; H8 ]; T- h2 f' Y  w; j8 U# B
) K) B( n/ }3 Y' ?$ N( @
例如:
4 w, t0 k( T4 U5 s! n! S8 L. a5 d& {+ a$ d" V% H( U; y# F
Font->DrawText(20, 20, 0xff000000, “Hello, World”);% w" i8 ~7 m+ V! n

$ Q' M: i7 Y5 f: O7 d, J9 }! i$ }" W. P
9.2.3.    资源清除
8 V$ P/ G, p/ L! w* ?在删除CD3DFont对象前,还需作一些清除的工作:
$ p& g6 d- u/ j- @( s. E6 z$ \. R9 k" D- M& e; g, o4 P; ]
Font->InvalidateDeviceObjects();2 b9 f, ~' z. h) V! x8 M. T
/ o7 ]! S! t7 C4 F3 w! h; B3 H
Font->DeleteDeviceObjects();
% V) A. R% Q0 z
, p$ I' Q3 P$ ?; m' ]7 Udelete Font;
% m7 j: d3 y3 ~0 Y$ N ) s! @3 s9 w8 _! ~' ]
7 I) j6 O& Y$ G8 \' t9 }) K+ {6 R
9.3. 函数D3DXCreateText
2 S9 d6 W/ O5 f" z该函数用于创建3D文字Mesh,原型如下:
; }$ G+ P  ?3 _; O7 x
' v8 B, H* C$ i! q+ X8 hHRESULT WINAPI D3DXCreateText(
3 o. j0 T* ?/ m3 a) u! |' }3 q0 v/ n& s3 R; ]2 }, d
    LPDIRECT3DDEVICE9 pDevice,
* v  `3 L( p2 [2 C" z7 @: u/ w! a7 F4 q9 u  m& B
    HDC hDC,& l' j+ P$ W  s% }' d$ h
% {* J7 P  C  q0 f8 _% O8 h6 P
    LPCTSTR pText,: V# J- F" P  l3 a' n) O& ]
% g5 B0 v. `* ?* x  O3 ]  c$ w
    FLOAT Deviation,% G, a, D! y3 w5 G, C7 `  [3 i

+ r( R4 |+ `" I    FLOAT Extrusion,+ h  ^* R0 `$ z8 j1 D) }

8 }' O, R9 \  l  |$ i- [) a    LPD3DXMESH *ppMesh,6 M/ T1 Z0 B# M8 R

, }5 U+ A' D% F6 A% i! T    LPD3DXBUFFER *ppAdjacency,
0 m2 `% [& l& \, f; D8 U5 A" A8 I4 p. k; n* ?, A9 g9 r. ?
    LPGLYPHMETRICSFLOAT pGlyphMetrics( [1 s0 ^! {% i% K6 Y$ k
/ m! K' J. m1 L/ i
);
- U- ^$ `# X; N$ Z$ P+ T - F2 Q' m" H+ P9 u! S# V5 O9 k7 u

2 N, y" B$ U# W* Yl          pDevice –D3D设备
. n6 m% r9 T% `# Z1 B* }  H6 E. l! _$ v3 j2 {  j
l          hDC –描述字体的设备上下文句柄
1 F) g0 y- ~4 [8 C* x& _  n' ]( Z) ]/ A2 Q. Z" s
l          pText –要渲染的字符串
& F7 D) M3 H6 H/ r+ P0 Y  j% }) W. E) f" |1 O' |; v4 S/ }  h
l          Deviation –TrueType字体的一个属性,该值不能小于0。如果为0,则使用字体的默认值" e8 m* k9 s. n  T, @
* f$ n+ H0 V$ o
l          Extrusion –字体的深度,相对于Z坐标轴/ d7 B2 {( L5 `( Y- K5 B0 S

/ }+ R/ o5 D+ l9 Z: |1 _: yl          ppMesh –返回生成的Mesh对象指针
4 B- u- o3 K6 Z+ M+ \1 G6 x) d, W  T  i/ u# r
l          ppAdjacency –返回邻接信息。如果不需要该信息,可使用NULL指针- J# b5 A% B# E& d
, E3 o" H) w9 A6 ?; d5 ^
l          pGlyphMetrics –结构GLYPHMETRICSFLOAT的数组,返回轮廓矩阵数据。如果不需要该数据,可以设该参数为NULL
% l) q4 Z& A& A* Y+ `
, G: w. f* D# l  U9 r下面就举例说明如何使用该函数创建3D文字的Mesh对象。
5 [5 C8 ]3 a2 k1 X
, ~: ^( w8 S7 |7 G2 v# M' x// Obtain a handle to a device context.
4 @  E5 T" p4 {3 W# g7 S
- m3 r5 i- ~; ^, c- A, }2 GHDC hdc = CreateCompatibleDC( 0 );. F/ Z$ c) T7 h4 Z2 |
: @* t& V9 C# N" w) P% ?$ m+ n
// Fill out a LOGFONT structure that describes the font’s properties.# _4 M* M6 X/ ?( P" N
3 _7 p, O9 m: e5 D1 v
LOGFONT lf;
& ^2 f' w/ J. N4 F
' f* V9 X8 ~" l. B2 oZeroMemory(&lf, sizeof(LOGFONT));
# c; M! ]/ T6 k- S, |& \! c0 t/ [- w5 k  Q
lf.lfHeight = 25; // in logical units
7 b* f5 a- {4 |1 g' D7 w2 H( l; c0 H: _* v
lf.lfWidth = 12; // in logical units
/ D& X; r, |& b
2 k& b, j8 M+ W6 Dlf.lfWeight = 500; // boldness, range 0(light) - 1000(bold)$ A; M4 ?- E. N9 g, l# {
, y5 r: |: y; q/ @
lf.lfItalic = false;& f7 m$ m% `, c$ t$ w1 r& M
. P/ }) h  N; n1 [
lf.lfUnderline = false;
6 }; Y- u. I" ^/ F, I9 x" M9 P
- z, E8 ]6 T' v8 g4 Vlf.lfStrikeOut = false;# u, e/ v* F1 `: |6 Z% L: n

, s+ D' i( D/ i8 `, G2 tlf.lfCharSet = DEFAULT_CHARSET;* Z5 O% N% I" P9 }. |# R+ ?  u$ I0 [
- a* o; {. ]# e9 d% B# q( {
strcpy(lf.lfFaceName, "Times New Roman"); // font style: X6 U" U% u4 w. _1 l5 n
. i7 H# y4 T  |4 e4 C
// Create a font and select that font with the device context.6 N3 ]% r4 a- u2 ?3 q- j

0 w/ ~; U, J( \) A* q4 L% jHFONT hFont;2 e- C! H8 X3 E% {$ d. y- m
- T9 M, B3 X# x. m9 u
HFONT hFontOld;4 k7 M" O2 L8 a6 v# U9 @
: I* H9 H& D1 ~) Z: F. a
hFont = CreateFontIndirect(&lf);# i/ |- q4 V/ F9 D0 \

* y7 g1 b( I; r5 u# t/ f2 shFontOld = (HFONT)SelectObject(hdc, hFont);
* `( k3 N- U) _( J* Z8 V" J' O5 L- R! a$ R  p- T5 l
// Create the 3D mesh of text.
" _, y6 E5 y9 [) m0 a  C0 M' y
; g: Y7 P# {* W+ Y  iID3DXMesh* Text = 0;; q  \5 ?/ C" u+ I3 n

! F8 s. ~- F! f& u1 jD3DXCreateText(_device, hdc, "Direct3D", 0.001f, 0.4f, &Text, 0, 0);
% w7 @7 L, Y' H2 ~) _! j- ~3 ?& `" c6 e6 @: K2 x. a
// Reselect the old font, and free resources./ L3 \0 j+ O! _& r3 B0 H
' e0 A4 c" \) I. }
SelectObject(hdc, hFontOld);
" ?! X" j7 g8 E/ s' m. D# Z+ K1 J7 x- e, A0 l6 I
DeleteObject( hFont );* Q2 K; q( u" G' ^

* h6 [, V  t/ [7 b; m6 w; z! YDeleteDC( hdc );/ F8 S+ l4 C% a( [
# {) e- x( E+ F5 D

* h0 u- p! n% b: m; v. O! F这时,Mesh对象已经得到了。最后,直接使用DrawSubset方法渲染即可:
2 B4 K4 U) W6 ^4 K' G  B( ?1 C  R6 o* o8 Z: J
Text->DrawSubset( 0 );/ j1 [% Z3 R7 _4 B) l1 T

1 P% w7 a" ~, u+ R1 {! t/ P
6 ^- `3 V8 ~9 c8 n& X% Z3 C译者注:上面的例子代码,使用的是较早的DirectX 9.0 SDK,不是Summer 2004版本。- m- G4 ?  ~0 |

0 ~: I/ r  }7 Q  F8 @9.4. 总结
; o* o! y% B$ ]  A5 v" B' Rl          如果需要渲染较复杂的字体和格式,使用ID3DXFont接口会很方便。但是该接口是使用GDI实现的,故效率较低。
3 B4 T: ~+ Y" v; b/ U1 h
& ^9 R1 ?6 k# p0 T9 I( t' Vl          CD3DFont类可以快速的渲染简单的字体。该类实用D3D的纹理三角形渲染文字,故速度较ID3DXFont为快。
) d5 c/ S6 ?6 q- T3 v$ s3 h* F8 p# t7 f8 f8 |, {
l          使用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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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