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

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

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

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

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

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

http://www.5178c.cn/article/6/2006/200605173892.html9 X/ k6 G  m0 v# g. ]1 t

- F; m2 |) m, Q& y( L在DirectX 9.0中渲染文字 / i1 L- d* l3 J; o2 H
作者:佚名  来源:不详  发布时间:2006-5-17 12:27:04  发布人:admin
! Z6 r0 i1 Z8 c减小字体 增大字体 7 n; i6 _9 q' ?

7 `6 r9 b8 Z/ e0 P
; i5 ?* E1 v9 ?$ t* ?6 o
' r  b* N% ~' Z  h6 a1 s8 y( O1 l4 N
3 }/ t6 t  e5 i# f
4 ?7 v9 ?  {: t! `/ l% a2 [
9.   字体. K  R2 p$ q# X2 z! B- m
本文翻译自《Introduction to 3D Game Programming with DirectX 9.0》第九章“Fonts”,敬请斧正!XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />
( D0 {% _0 d" @$ `) j% _% I. w3 I7 ?$ _, b
$ F# c* \* f0 Y# R2 o

- T0 R) `# m, p! s8 z* m$ @5 |5 P在游戏中,文字信息的显示是必不可少的。本章将讨论在D3D中使用的三种显示字体的方法。同样,这里只列出每种方法的演示程序的主体框架。学完本章将达到如下目标:
  X7 f# J/ r4 n/ [$ b; e" V1 E
' b* a& x, y0 Y# j3 J- Jl          学习如何使用ID3DXFont接口渲染文字
' d) o" h2 Y9 I* p; U4 d$ z4 }" h! B& T+ S5 z$ @
l          学习如何使用CD3DFont类渲染文字0 o- n' J5 Z" l* O
9 r( |& T2 l" O% y( [- j- @
l          学习计算游戏帧速度的方法
4 m$ g0 G- N2 c1 ^$ L- f) ~
3 |* O: P; d0 Y, f/ d# sl          学习使用D3DXCreateText函数创建3D文字+ h8 t0 t/ O) P" k; K. H* Z( q

9 z% L& ]! S6 _) o; H0 Z* d9.1. ID3DXFont
# v  k! l- m0 v( e8 S. m要在D3D程序输出文字,使用D3DX库提供的ID3DXFont接口很方便。其实该接口是使用GDI实现的,所以,其执行效率有所降低,但是它可以很方便地处理复杂的字体和格式。
0 z- d- H4 O0 E, J9 ]
% U& \- W! A6 `- l! l) h9.1.1.    创建一个ID3DXFont3 S" Y5 r( F2 P8 A
可使用D3DXCreateFontIndirect函数创建ID3DXFont:
8 B4 ?6 S6 _0 ~  {9 N. u" x" N0 U' Y" k: u6 [
HRESULT WINAPI D3DXCreateFontIndirect(
. I& t! H( s1 a5 t$ r$ `" ~
3 k0 F; Z9 i3 c: L; M1 y0 y    LPDIRECT3DDEVICE9 pDevice,2 A1 }4 c) @/ R, K
5 y2 W; m+ a) v: S8 b2 ~) H
    CONST D3DXFONT_DESC *pDesc,4 N# `. h8 F* l" Q$ h0 x3 J
$ t" }! |8 g6 s& Q: J3 _7 j+ P
    LPD3DXFONT *ppFont* e  l) \# [5 ]! |. y, i0 b0 J8 ]
1 a1 r% w  v9 ~7 V: V! A
);
( Z  J6 k' h. w
2 s7 R6 P! q  Q8 i2 ?
8 J$ W- P) S# h8 x' W  e/ i; `译者注:我所使用的DirectX SDK是Microsoft DirectX 9.0 SDK Update (Summer 2004),也就是使用DirectX 9.0c的那个版本,在较早的版本里,该函数的原型有所不同:第二个参数为CONST LOGFONT *pLogFont,它是GDI中的结构。以后,如无特别说明,将以DirectX 9.0 SDK Update (Summer 2004)中声明的函数原型为准,特此声明!
8 p, G: H- f( r( t9 E4 f8 n4 L/ `7 J
使用这个函数时,需要一个D3DXFONT_DESC结构:3 p! q  |. J8 X

- ]) r% o: e6 iD3DXFONT_DESC d3dFont;2 E$ K+ {) m9 G; T' m( l3 _6 Z" T

# a' d' [5 M  xmemset(&d3dFont,0,sizeof(d3dFont));; a9 k; E3 ^6 Y+ Z" Q+ j% _

  P% i3 K( z9 ^d3dFont.Height=25; // in logical units
2 f: E( d. T1 }) W3 f3 y" i2 a( K+ h+ M) z7 X0 r2 A/ A
d3dFont.Width=12;  // in logical units. k1 w3 h7 V! G2 `6 l# x% K7 {

) B' t3 k$ ^% S+ V( s- l* _7 y% ^d3dFont.Weight=500;// boldness, range 0(light) - 1000(bold)& J7 J4 v% E( k0 n

# Q1 u$ E1 t( k0 vd3dFont.Italic=FALSE;" A9 K$ g3 w/ I- G3 h' [3 t9 U  v2 C

0 g6 ?& s! f6 D& B- P; {. a3 Xd3dFont.CharSet=DEFAULT_CHARSET;
4 c) r' R: U! e) e# a5 j  U& O6 h- ]) v! ~/ P" B$ S* _: R/ S
strcpy(d3dFont.FaceName,"Times New Roman");
* x( [5 w& O- H% m9 B/ h( I' b2 d8 V$ O6 v$ \' e. C
ID3DXFont* font=0;
  g0 ^7 i# b3 Y
- Q6 Q( D/ p0 O# M; @, N3 z2 ]+ mD3DXCreateFontIndirect(Device,&d3dFont,&font);
+ ]+ F1 ^# H! q/ ~# o2 D 8 s; g- _% h: a8 b) [  l# O: j" h

. X; B! @* }7 x% P, r如果你使用的是LOGFONT结构,则:
* V( O, K) _0 v6 u* j5 @  s+ U- y7 X, r8 K% S, R8 |0 t
LOGFONT lf;5 _+ K+ {. \4 M2 j# R( H5 |+ q
% j/ l) C0 s( W" y
ZeroMemory(&lf, sizeof(LOGFONT));2 @" k* Y0 l) _9 n* q, {! S. b

( m# H5 d' K" F. H$ ~0 c" Jlf.lfHeight = 25; // in logical units
! b: i1 Q; R. s9 S
% H. W4 S9 ?9 M. G- B& C5 ulf.lfWidth = 12; // in logical units
7 P8 U) u! G: G4 k& D4 k+ S* @7 C# U' n
lf.lfWeight = 500; // boldness, range 0(light) - 1000(bold): t" j9 E- H" q% b

, h, Z  I3 x! F$ c( {lf.lfItalic = false;) _4 o! }) S! o* J

) A9 f; r- I; H0 B: p) elf.lfUnderline = false;
" ]0 i) N7 ^6 m3 U; J! H/ @# K  A/ ~' F0 ]$ a
lf.lfStrikeOut = false;
- e: ~) p" z3 S) [5 t7 ~8 _( H4 Q0 ]- `. I2 u9 P* w: Z
lf.lfCharSet = DEFAULT_CHARSET;+ t# {5 Q, v4 x! X
. B! I" L* y1 a  [* ~
strcpy(lf.lfFaceName, "Times New Roman"); // font style! `% u) ?9 D; ]
6 w! q1 L' A2 z8 }
ID3DXFont* font = 0;
% H3 k# O) f* O; Z
! ?% T1 {' D5 d' _* d# Q; C% sD3DXCreateFontIndirect(Device, &lf, &font);
& t) L, f5 C% n 5 b: y9 K% o3 n, g7 R, P* s

$ \' Y7 k+ }" ~' T另外,还可以使用D3DXCreateFont函数创建ID3DXFont的对象。
& ?, z9 i: U0 M0 z3 Z6 o
! @8 \& k5 u  K* O& U3 k9.1.2.    绘制文字5 f! N& [+ m0 O8 }/ G4 ^' n. V, }
得到ID3DXFont接口后,绘制文字就很简单了,只需要调用ID3DXFont::DrawText方法:4 Z$ z% R! I' K  O

$ T; Q, E% n! U2 r6 ]INT ID3DXFont::DrawText(: b$ {# o& o( S3 w9 V: V5 v  Y* w
3 A0 X# [1 h1 Z3 F( w
    LPD3DXSPRITE pSprite,
# M: ]$ X0 }- q- V5 y, `; ^5 Q* N! ?7 S; R9 h; F2 `% S
    LPCTSTR pString,
" h) y2 M+ \# n& I, F9 m. z8 L, X% N7 O2 l
    INT Count,' I# y( x7 T5 Y4 Q

2 {& ~) a/ H) n* _* @5 W    LPRECT pRect,, m' G" u( E3 y

/ b; @" z$ g# t* T: e    DWORD Format,
$ M5 Y; n7 y# g- k2 x/ H4 n9 S9 B+ L; S' q) h; U4 l( Z" n
    D3DCOLOR Color
& a; q4 p+ y5 Q% w3 `/ ^4 k" w8 s3 x) J3 s# U/ o( B8 i2 j
);: k0 n  s) |0 k3 t8 B+ [) `2 z) J
8 J0 `7 ^' V- t
% B; J/ u0 i$ H( V2 \$ v8 K
l          pSprite –输出目标,为ID3DXSprite对象指针,可以为NULL值,此时字符串输出到默认对象
  u% G1 N8 k; r. i" T: C0 w$ i+ b4 R$ h2 U3 x8 y
l          pString –需要输出的字符串7 @# M5 R2 a4 j% R

# v- R, X: M/ gl          Count –字符串的字符数,如果为-1,则以0字符为结束标志" J( L2 \  n" L. n2 N

" e( b* M9 O+ |) g# `0 z9 _l          pRect –绘制字符串的区域$ d9 j8 t  B2 h9 }1 p

& v9 Z6 |4 T$ c1 \& hl          Format –文字的输出格式
& ^5 e& s6 P% H! H8 y) Q& a( T( g# c- S: J3 y! \+ s4 i* K
l          Color –文字颜色" z; y0 q5 ~: s% z8 v

3 k! d1 P  r: J1 }4 b" C" }5 l例如,可以这样使用该方法:
: a- H) L* ?* Y7 N( k' L- d( ^3 P! s6 v$ p3 a( m9 j1 D" X
Font->DrawText(NULL,$ c6 B: q9 G6 G9 p, T  V9 P

6 X2 b8 p$ M# h) o/ s    "Hello World", // String to draw.$ p. s! t! w! o1 V. z* v

* q, F' ^( V3 k( J' Z    -1, // Null terminating string., c5 G3 l; p# m! l6 E! b# L/ M: M

; {9 z2 w/ I3 b& N- b    &rect, // Rectangle to draw the string in.3 P# d# I! |3 ]5 a% }' ~$ I; l5 ?

+ v7 Y" w8 L0 `# i    DT_TOP | DT_LEFT, // Draw in top-left corner of rect.
8 r4 c9 B+ h' ]2 I) i$ m8 y; E- q0 x! `  X7 c
    0xff000000); // Black.
" P- L/ x) E3 E  F; g / R7 t2 V# @" O% d4 M( e4 v
( r1 N. j; r, w: b
9.1.3.    计算帧速率
* G5 n, s& A4 z, Q$ r帧速率用FPS(Frame per Second)表示。首先声明三个全局变量:
% Z; w* z4 X6 q- d1 }
. X7 N$ J4 x2 v* k/ E) K- BDWORD FrameCnt; // The number of frames that have occurred.0 A0 W  P. u3 f# [# ^

8 K4 ~# i# k1 Q+ M5 Jfloat TimeElapsed; // The time that has elapsed so far.
4 d& ?& `" b8 J. G, s: ^! }! ?
; y1 q$ n: e* Q5 v5 Zfloat FPS; // The frames rendered per second.
+ w) D3 ?  }0 l3 s- `6 \ 8 d) |0 O' J7 Q5 L1 Y

! d' o# R" \2 N( l, @每秒计算一次FPS,这里计算的是平均值。我们也可以有足够的时间去读FPS值,而不至于因FPS的快速变化而产生较大误差。2 N! H, Q  b: c% S/ a# t8 N8 L
+ Q, u( q' [2 k% Z+ j
每渲染一帧,累加一次帧数和所用的时间值:
: C' {+ K! i8 I/ @" B/ B8 r# h3 R1 J; X! Y/ Y+ i
FrameCnt++;! m! L9 ~$ b) Z* E, E5 e1 b% s

. N! d1 a- X; ?$ H: l0 F; Y) ?; nTimeElapsed += timeDelta;, C3 X0 l9 o* f2 D$ r7 H( ~  [" P
& X  v' ]+ f  W; O& \

7 B: f0 {1 t2 q5 ~! J( D这里的timeDelta表示两帧间的时间间隔。每过去一秒,就可以使用下面的公式计算FPS了:  ?4 e' ~8 c6 b+ C- w+ Q1 U

4 w1 a) q9 V# k" MFPS = (float)FrameCnt / TimeElapsed;$ \- M; F6 q& x9 ^6 X

( I) N4 m1 y5 W5 f4 ]: A8 m1 U3 m! I4 @6 ^# L# }1 {- `9 x6 J; _
计算完成后,需要将FrameCnt和TimeElapsed重新置0,这样下一次的计算结果才正确:
; k5 W$ ~0 j2 f- C5 u  ?9 c; O5 k( X' g  X
void CalcFPS(float timeDelta)' a+ _% `' _' P  \% N

6 P6 u2 g  ^2 u3 G' H$ ?7 Q{
9 e7 a/ K# ~8 F* p5 f4 P* e* x: y
    FrameCnt++;
2 m1 X; V; u9 w7 B6 s& A8 i, _; @, C3 g- |% F2 e& @  [# ]
    TimeElapsed += timeDelta;
  |% Y2 ]5 q8 B6 }! N- U8 u7 @! a2 `
0 Q) Z8 U3 S( a1 h# c8 k    if(TimeElapsed >= 1.0f)
4 o) O! J8 H3 l6 _
# V: H& D* C! r    {3 Q# E; w. j9 X7 C, ]
/ M$ [' `8 I6 v, J) k/ U  z5 j$ P
        FPS = (float)FrameCnt / TimeElapsed;  b6 x9 }  a5 Q9 `, I
& v; ~9 W8 h; [1 H/ F7 W, r' h
        TimeElapsed = 0.0f;
' V' C' `) _& I  t0 v! l: i( f5 |, M
        FrameCnt = 0;; X# |' r9 r0 l
4 r: G3 @$ M& `
    }$ ]% h" `' T8 z& U

( f7 I3 E/ H- k% M, f- O$ Q  g, F}
( X  L8 q+ h7 E  d: m
1 N/ `& A, f) g, A! z. n, k! Z
" z# P2 l; W/ h. V/ h9.2. CD3DFont
5 X; ~( i6 D* Z# Y7 z) \( o在DirectX SDK的安装目录下,提供了很多有用的代码CD3DFont类就位于其中。该类使用纹理三角形和Direct3D渲染文字,而不是通过GDI渲染,所以,其效率高于ID3DXFont。但是,CD3DFont不支持复杂的字体和文本格式,如果只需要高速渲染简单的字体,CD3DFont应是首选。
. s) m: i  A0 y* F+ N8 `6 c2 W2 [4 j- ?1 O( @
使用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版本!2 ?) ~- u" ?3 _

! |! r* a. V& V, k- u, G9.2.1.    创建CD3DFont对象
/ q- K' D, R, q% o创建CD3DFont的对象,就像创建一个普通的C++对象一样,其构造函数如下:
$ e1 o2 @: D. g& f! q4 t' c, j9 w
CD3DFont(const TCHAR* strFontName, DWORD dwHeight, DWORD dwFlags=0L);/ |2 V" m5 k5 s
1 C9 ~( T  e' |" t

9 J, r: c5 |  M# E$ F6 R1 a# s6 `* Nl          strFontName –所使用的字体名称
2 B- h9 h+ ]* b* P( _
4 w% d$ Q$ A3 u/ _l          dwHeight –字体高度: u0 B3 B! X( b( n) Y  _
: E! V8 \" c, @
l          dwFlags –可选的标志,如D3DFONT_BOLD、D3DFONT_ITALIC、D3DFONT_ZENABLE等。3 K, `2 u$ K9 b6 Y: l0 ^  V9 S

# S( u# u/ a" z1 J* f8 N+ D+ f得到CD3DFont对象后,还需按顺序进行初始化,如:4 K& i2 ^5 T) d

( I6 x& b# ]& Q8 H# ]Font = new CD3DFont("Times New Roman", 16, 0); // instantiate9 U( x, [9 J5 R6 h! e" n
; s& Y" }; f* c8 x! n7 r  T! w& y. X
Font->InitDeviceObjects( Device );
" P1 W4 _( v. U2 `4 r# W* a$ q' P1 K# D7 ~* g. R& c9 L3 Y9 J
Font->RestoreDeviceObjects();
8 q/ X/ A# Y, ?7 Q * f5 X: L- N8 `# W; h

+ H/ e! w+ q" T/ F- R( Z9.2.2.    绘制文字
( \& _$ X1 Y# y) J0 a0 X' N0 K+ h使用CD3DFont对象的如下方法渲染文字:
/ n" }# j2 a. t6 K8 C4 f( a3 w( K& Z& B
HRESULT CD3DFont::DrawText(FLOAT x, FLOAT y, DWORD dwColor,
  h  p+ d+ }: [. y+ I7 I, y' d6 C( Y* D& C- J
    const TCHAR* strText, DWORD dwFlags=0L);
6 F5 C# [3 D8 e/ R+ m, t" n 8 R4 O6 \: j" n1 ^4 r
7 s5 G3 I( q1 w6 `2 |
l          x –屏幕的x坐标* q/ i) ]& u) Q' a- a& a' [! g) o

1 Z* g* m+ Q* T$ Bl          y –屏幕的y坐标! G( m( I1 i% t0 D% g' u, c

( T$ N7 p2 k! q  v# El          dwColor –文字的颜色
# I, ]7 i. b% b& q! C
& X. Q4 S" ?) S, e( o0 t" r0 z# Il          strText –要绘制的字符串2 `- ?6 x* q, Z# A
9 D4 N2 F# W$ O- v& b8 ]
l          dwFlags –可选的渲染标志,可为0或下面的值:D3DFONT_CENTERED、D3DFONT_TWOSIDED、D3DFONT_FILTERED。
! M5 R# f0 K6 W# c4 C% f
8 n* S3 Z: T5 s  s例如:
- N# p7 Q! t/ ]; K$ S
' A- p9 p1 I- w; u0 kFont->DrawText(20, 20, 0xff000000, “Hello, World”);
. v# |$ V* d' ~. Z4 M: ?
0 V% L6 }4 v) r5 D! m, m1 n) Q# H8 L
; h9 V! E: j7 \' F$ E9.2.3.    资源清除9 V1 L: C$ }* Z, C* p7 c
在删除CD3DFont对象前,还需作一些清除的工作:
  H" o' ~: M! n/ M
4 }4 o3 z3 F0 E, v; zFont->InvalidateDeviceObjects();
9 I. @0 P  `7 f& M# I1 h5 S% o8 T; w6 j' Q, A; P; |' _
Font->DeleteDeviceObjects();
% B" h* |8 O  k
) Z; V9 C/ E# ~8 ddelete Font;* \, V+ y/ w4 ~4 `. [, W3 @
) ^+ f# t' W1 Q6 x+ v& [+ J) g7 t

8 ?! V2 i2 f9 ?9.3. 函数D3DXCreateText, s% b9 `- u7 X9 \/ }2 n
该函数用于创建3D文字Mesh,原型如下:" g! Y' U' D7 _! k7 E. D! c
; ~. f8 ~( n. J6 q% O
HRESULT WINAPI D3DXCreateText(
: `/ G" T0 t; Q5 B, R0 J2 s! K, g& V7 V( ]' \' q5 [* j0 }
    LPDIRECT3DDEVICE9 pDevice,
$ t0 e7 k  w7 c: w) I
' V7 N4 }. L: k2 i9 ^    HDC hDC,
* g# ?1 e5 B* {* A! Z8 B& s4 J: A- M- B& w: A  M
    LPCTSTR pText,4 i+ \: l, ~& t9 t
" g( o* {7 [0 i: P8 @
    FLOAT Deviation,9 d! s3 l7 d6 d4 o9 T

; a0 l- l% `" ]4 b) c( _    FLOAT Extrusion,9 _) R0 I' i* d* z% m
9 m4 a, ?7 J0 ~5 w3 ^$ H
    LPD3DXMESH *ppMesh,
- R4 S1 M$ ^+ Q
, }+ b; Q4 B# F    LPD3DXBUFFER *ppAdjacency,4 x& o8 s. h0 X* a! }7 r# H
# j& \5 E* L$ A7 _5 t; O2 }
    LPGLYPHMETRICSFLOAT pGlyphMetrics
& D$ s2 }' r; ~: f
9 p( p/ F( \5 t* x1 A# k+ |);* I0 g5 S) @! o& a+ q

& S; _- Z) t+ C& r5 {0 X1 P9 U1 y/ K7 L0 `* `
l          pDevice –D3D设备
9 \5 m6 |! @/ _6 X' ^7 v. Y4 Q3 _8 R, ?$ Q! }6 o
l          hDC –描述字体的设备上下文句柄
# y% {. T" K. k+ W7 b. L
) g! k) S4 i; s1 _6 I+ rl          pText –要渲染的字符串
1 o, x# I& l+ d6 y- x8 U
3 S$ s1 Q, q& A: U1 Pl          Deviation –TrueType字体的一个属性,该值不能小于0。如果为0,则使用字体的默认值
7 N0 I9 ]9 h* I% T$ t/ V; z6 `7 o
l          Extrusion –字体的深度,相对于Z坐标轴
9 }/ P* t5 M& U# M  d" ?/ K- T$ F
l          ppMesh –返回生成的Mesh对象指针
# g- r" C! \, H
6 [; t8 \% O7 `$ Tl          ppAdjacency –返回邻接信息。如果不需要该信息,可使用NULL指针
1 O. I; |+ f9 a% V( i' T" t' Y' Y' F# |
l          pGlyphMetrics –结构GLYPHMETRICSFLOAT的数组,返回轮廓矩阵数据。如果不需要该数据,可以设该参数为NULL7 h  T' U7 w- k/ Q$ p

9 x6 j: a( J! m7 v9 z+ `下面就举例说明如何使用该函数创建3D文字的Mesh对象。
. R' o" y* _, y9 [! E- e) `( P! V9 U# T$ l8 G5 l
// Obtain a handle to a device context.
" [( N0 k' i. C* q4 T
) d  @+ u9 r# ~; q- ~0 {0 nHDC hdc = CreateCompatibleDC( 0 );( A; w1 z- E1 I6 \5 C

/ B& r0 _# V8 x/ b/ b" T// Fill out a LOGFONT structure that describes the font’s properties.
: N; S! d# R; q5 u. a" k
) Z8 v, R8 n) @' ALOGFONT lf;
3 q( w+ N2 S+ g# |% |8 c3 E5 ?! r; M. p2 P( l1 G
ZeroMemory(&lf, sizeof(LOGFONT));. l3 u+ z% u( o" e0 F& k

3 c1 @/ \! m, l) G4 Blf.lfHeight = 25; // in logical units& X6 R. y/ S8 @8 ^6 m7 X
, a3 |* o9 S/ o+ u0 p
lf.lfWidth = 12; // in logical units
1 t$ v: O3 m* i9 {. c! I9 j- \$ F8 O7 W, k8 i6 \
lf.lfWeight = 500; // boldness, range 0(light) - 1000(bold)+ \& d8 s4 i4 o

$ f5 }3 n& p9 y0 @& O4 A4 J5 Mlf.lfItalic = false;* P: F% ]! W8 v0 |* N" r
4 \& ^1 j, s3 ]3 W7 w, Q9 @# ~
lf.lfUnderline = false;
8 t& E% X) ~: v/ q4 ^! o+ x
3 `1 a* Z" d+ z' _; `1 l$ f& {0 m' dlf.lfStrikeOut = false;
5 `( I, f! `, `4 \" w# p$ s2 w8 y+ v/ m
lf.lfCharSet = DEFAULT_CHARSET;, m" j( m) ^  [3 ]
; ~' k8 J( G: G3 |: j) \2 \2 L
strcpy(lf.lfFaceName, "Times New Roman"); // font style% T& X" [. f  V& Q0 v6 h+ R

  w1 W. F9 ~4 l6 f// Create a font and select that font with the device context.3 Q; R/ _* [1 m9 i5 y2 A/ D

1 q/ }) @% }1 L8 @3 a; xHFONT hFont;! @3 ]6 u3 v& p( h1 J; `
: u6 B1 l3 N' ?4 n9 _
HFONT hFontOld;4 J% A" U( z" W4 n

0 S' c" ^0 P) H5 `! G; `hFont = CreateFontIndirect(&lf);8 Q3 [6 W9 S/ _+ V
7 t  S# ]+ Q% T
hFontOld = (HFONT)SelectObject(hdc, hFont);4 q* A$ s8 }1 c3 {
( v. i' w3 _0 J! G9 O
// Create the 3D mesh of text.' Y' D4 @7 _+ l9 d
" ]; j4 g1 F" v# M/ c
ID3DXMesh* Text = 0;& k8 Q3 |' k2 {2 V, \- C

4 Z; D4 H/ Z! |0 `D3DXCreateText(_device, hdc, "Direct3D", 0.001f, 0.4f, &Text, 0, 0);
9 C6 _) {! x+ n0 u- O& a
  U0 u% y3 ~0 T! S% B  m3 z// Reselect the old font, and free resources.$ u1 r. A7 h8 [- ]/ y; y6 w! ^
8 y$ o7 P) q( S0 q2 C9 z' _
SelectObject(hdc, hFontOld);8 y! o$ l1 |, P( [# X, Z5 I1 |
) C0 Q, m3 J# U' m' p
DeleteObject( hFont );
  s" g& \, e  S: j% {, ]$ q9 @
9 s. p) w0 `' y% BDeleteDC( hdc );
) s# M/ M  _3 }8 a0 c' b' [ : w  h8 ?0 q1 Y! z$ q6 b/ ^
; h0 e6 V; F" ]& \' u2 a
这时,Mesh对象已经得到了。最后,直接使用DrawSubset方法渲染即可:0 ]( ~+ k. p7 z3 c5 ], g% A

7 L( M5 [; Z8 g2 C3 L) F1 hText->DrawSubset( 0 );
1 \4 s+ E! ?4 {; ] & R8 @  ~) C7 C( z! B
8 c8 x+ W( L, L* V
译者注:上面的例子代码,使用的是较早的DirectX 9.0 SDK,不是Summer 2004版本。
8 S1 j  Q6 o) ]; u# w1 s2 V  ~( B& q
9.4. 总结  _4 h8 F: ~0 [2 J/ q1 L8 m
l          如果需要渲染较复杂的字体和格式,使用ID3DXFont接口会很方便。但是该接口是使用GDI实现的,故效率较低。
" |3 y+ m1 M# O
! A9 C5 q0 x3 }( R; V- H/ h- [. [l          CD3DFont类可以快速的渲染简单的字体。该类实用D3D的纹理三角形渲染文字,故速度较ID3DXFont为快。
* E7 E7 z0 [. Q2 g! C5 x/ W6 {, g& s( g7 j
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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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