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

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

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

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

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

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

http://www.5178c.cn/article/6/2006/200605173892.html3 Q8 y; K& r$ h, d2 u* I: j9 z

0 v2 G( m* q% Z* w7 @在DirectX 9.0中渲染文字
- D" T  y) j# m) {' ]作者:佚名  来源:不详  发布时间:2006-5-17 12:27:04  发布人:admin ' D6 U- y6 P* L! }  d
减小字体 增大字体 & O& b$ g) p5 }7 O( t7 I
" s7 h1 N9 v3 ~. n
/ M$ I4 D) O: Q& r/ x% O

$ v& J/ Q6 z& C, s. g
2 r+ l3 E& r/ H! z) J7 B$ L* B& S: r5 O2 F. L
! t! a2 @: a- w* k  e. E; b9 F3 c
9.   字体
) J7 L8 ~9 {, g本文翻译自《Introduction to 3D Game Programming with DirectX 9.0》第九章“Fonts”,敬请斧正!XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />
# `) n" A& D: e: ^6 c2 x
7 P3 T7 n2 v( m% E# U5 K9 w : R+ [  b0 J7 F, i6 L. I
( U3 P& A/ v- }# }
在游戏中,文字信息的显示是必不可少的。本章将讨论在D3D中使用的三种显示字体的方法。同样,这里只列出每种方法的演示程序的主体框架。学完本章将达到如下目标:
8 Q% g6 m5 H7 m; A- g( [
1 C9 h8 m. b# d6 f& Gl          学习如何使用ID3DXFont接口渲染文字! [5 y5 L% ?) q

; y& o5 o/ W" h9 M+ gl          学习如何使用CD3DFont类渲染文字
# z9 R. S! S, R1 ^+ m2 P6 D$ R) W" d. v5 u
l          学习计算游戏帧速度的方法
% a; O1 }6 R( o" F" o/ v$ \  I, R- x
$ i( q5 I# Z7 Z0 u3 O3 Zl          学习使用D3DXCreateText函数创建3D文字
& }) u' R2 s1 a$ U$ Y/ E% Y  [- X; c. g* |& T. Z8 k" W6 x
9.1. ID3DXFont: Z% l4 T- y% ~$ C2 @
要在D3D程序输出文字,使用D3DX库提供的ID3DXFont接口很方便。其实该接口是使用GDI实现的,所以,其执行效率有所降低,但是它可以很方便地处理复杂的字体和格式。( `& P% d" r/ k, J: D9 d
" g4 m# J% p# t, j- q% [4 w$ j
9.1.1.    创建一个ID3DXFont
$ M6 p2 u3 |1 e: M- J可使用D3DXCreateFontIndirect函数创建ID3DXFont:2 q: `% X, v" n% u) K* y

- r4 q  `+ |6 J/ G- u0 kHRESULT WINAPI D3DXCreateFontIndirect(
: v3 i7 y' e% _1 d$ U( o0 q6 U0 ?7 h
    LPDIRECT3DDEVICE9 pDevice,3 D2 R6 _; I' r9 o
- s! T) x( `  \9 @! x
    CONST D3DXFONT_DESC *pDesc,! `& F( L" W0 y& {7 C2 _

5 [# E4 ?- t# @9 x    LPD3DXFONT *ppFont
( X0 I% A* u. ?" i1 Q" \6 ^
! G4 t# Y, c3 f% ^4 J);
7 u8 }: L9 G4 r3 _, }( {
0 v5 T. ^' V1 Z3 Y6 P+ ?' I+ r5 D7 c0 e. E% Q) n- F# 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)中声明的函数原型为准,特此声明!) p5 ~* K# U( G2 P8 k  J

7 |. z) a  ~' w/ C2 y( X: K使用这个函数时,需要一个D3DXFONT_DESC结构:
+ k7 `6 q- N  [6 ]9 r% [- ]- ~$ M( N4 Z' C4 V
D3DXFONT_DESC d3dFont;1 Y* n+ n# ^/ N$ G1 v: i
% }" P% O" U; h3 _9 C6 S' D6 `
memset(&d3dFont,0,sizeof(d3dFont));
6 c( f# X0 W/ c# u0 z! _4 F0 j1 H  v' w( i& M
d3dFont.Height=25; // in logical units
) p0 E6 I5 o& ]' g  O' U+ ^2 L& V8 i3 X6 L8 X; a
d3dFont.Width=12;  // in logical units4 t% g$ E' P: W
7 Q2 `6 p- l' @# y; T
d3dFont.Weight=500;// boldness, range 0(light) - 1000(bold)
' |- a  N3 |3 a/ J( w. M( [" o- ^; Z3 I; N9 J
d3dFont.Italic=FALSE;
% ^% B( g+ W1 G  q# o& w& c$ p
/ j) r  p1 z" b3 C' pd3dFont.CharSet=DEFAULT_CHARSET;- k# t! t; p( R1 u3 z
) a* w) \9 P( Q' [
strcpy(d3dFont.FaceName,"Times New Roman");; X) D  o& x$ V  I6 d  T0 E2 v
: Q% ]8 {$ e2 ~' ~4 @
ID3DXFont* font=0;
, b6 E& k" ]! d9 b/ l: {8 L/ b7 ]# u. @( b
D3DXCreateFontIndirect(Device,&d3dFont,&font);! T" c# z5 s- O" g
; R4 D9 t1 o  V$ D9 Y, H' t7 {2 `

% m1 B6 h& c, o. x如果你使用的是LOGFONT结构,则:
$ D5 A. l1 C; O# K: j. S5 g8 g% d. P4 S9 C- S+ t
LOGFONT lf;; o0 U/ i5 M; A+ B- U) ~( t; m
' }8 T6 _2 g% W; A) d
ZeroMemory(&lf, sizeof(LOGFONT));
2 [5 G' _1 l5 h0 i$ h3 G( e2 _
. E/ s4 d  O0 V3 Blf.lfHeight = 25; // in logical units" H; z! l- O, g1 r: `+ q. n( D' h6 g

7 O+ W& g+ U$ ?2 k( L7 Y5 [lf.lfWidth = 12; // in logical units
, [2 ?( e5 H& H; Q9 G, U, S
: R! g# P0 Q0 ?# j1 W4 plf.lfWeight = 500; // boldness, range 0(light) - 1000(bold)% `& b! J/ |5 s5 w3 n9 i( w

9 I4 Y: q$ R/ ]$ P4 V% ?lf.lfItalic = false;
5 F- x6 X) V) @9 _+ Z5 a
7 u0 }+ I+ U& \3 M- Olf.lfUnderline = false;
% R- e$ j$ ~% H) b1 z  z. L6 E# q6 K% `/ O# W+ P# L
lf.lfStrikeOut = false;! E* g, ^3 @' ]

6 I4 ]( o$ o& C1 K( N0 J5 }: U& plf.lfCharSet = DEFAULT_CHARSET;
% P# l, [! T) @8 {+ L& {; K6 F4 N: z# f5 d7 h3 Q  [% t  u: `
strcpy(lf.lfFaceName, "Times New Roman"); // font style
; D# x, h+ N( A4 p3 I% d* x) i
0 a7 [) R. u$ e0 O6 [$ ~ID3DXFont* font = 0;
9 S  e5 N8 E8 U* u. B% K2 a1 C+ z2 n% b9 t
D3DXCreateFontIndirect(Device, &lf, &font);" \; o# y; [+ Q
( f- P8 _0 u6 W# Y

9 e( ~5 H, ]+ V另外,还可以使用D3DXCreateFont函数创建ID3DXFont的对象。" M# k- M7 G7 L
- x3 i6 H& I: x1 Q, D' Q0 _
9.1.2.    绘制文字
: o% e& y& m6 N  v4 S得到ID3DXFont接口后,绘制文字就很简单了,只需要调用ID3DXFont::DrawText方法:* `! C3 z! q  `7 A+ f4 u, a, T

' p! S2 X) x2 a' o: l5 WINT ID3DXFont::DrawText(
9 Y( }9 a( M, Y8 |. S$ ]6 x" g2 h' l
    LPD3DXSPRITE pSprite,
1 T4 A$ m2 d) P0 M+ q9 G/ h8 i* R  l  X0 d  Y/ Q
    LPCTSTR pString,+ z2 E+ S5 n  Q, R  M) k# k

2 I" }. \8 E+ F9 y9 y! a7 E4 K2 \( z1 ^    INT Count,! ?) e" F( t1 q3 A" }, {- {: w
; k; |  {! \" p1 V) A) Q
    LPRECT pRect,
7 Q) F" \* l& v* p9 M; C; _. D" P- S) ?
    DWORD Format,( I/ }) g1 l5 Z) e8 {6 a0 ~

  B. p6 f+ l/ V    D3DCOLOR Color
' `1 v% C% k+ x' }# Q/ x; R# K. R  @  ?/ |
);
7 z6 z1 @# ~5 I! P! X
8 c/ w4 G4 d) U* A& Y6 g" I
+ a# [; W# a. t0 h6 gl          pSprite –输出目标,为ID3DXSprite对象指针,可以为NULL值,此时字符串输出到默认对象: v6 d/ T8 G' N( T( g* U+ P* O
% H4 C6 e; t8 @1 ]/ S' a3 g. ~
l          pString –需要输出的字符串0 o  M! p% F) t% p- t
! `3 U+ L- S3 q
l          Count –字符串的字符数,如果为-1,则以0字符为结束标志. x9 D7 L- e9 _% J" w
2 c& C( c* I0 Y" R
l          pRect –绘制字符串的区域7 _% [/ L6 o( {/ P, R% W( [' [$ G
% m5 U% w3 ?5 M0 w
l          Format –文字的输出格式& W0 u) S4 e# p' i9 x

& q- G5 \: R9 r0 z. G- O8 E6 c" xl          Color –文字颜色# m+ C3 H1 W# u) y8 @' ?
% @+ v- t% e0 |+ A- ^( G
例如,可以这样使用该方法:
. Q* g- P2 O: x: g* K1 z1 W1 l6 d4 X
! g% |0 S/ @9 @; T& \0 d/ i6 _Font->DrawText(NULL,
6 }) s; T& G1 T2 v2 R: t8 K1 u% ~5 G/ _& W  C& L
    "Hello World", // String to draw.; W- T6 p. v: p9 ^8 k

9 U) y) Y. ]3 ^* S7 e' @5 P' H" t    -1, // Null terminating string.
- I& j. U) V* R: q1 v7 U* A6 T% E. j2 T) @9 E3 I' j
    &rect, // Rectangle to draw the string in.
$ L# k  V0 J; c% a& V2 {; |% @7 }5 ^, G' Y& Z/ C) |' t: K; @
    DT_TOP | DT_LEFT, // Draw in top-left corner of rect.( ]! S; U- n6 K! f; v% ?  h6 q
1 R9 ~$ v* C2 R
    0xff000000); // Black.
8 `* P& x: `( W3 e8 Z  w
0 X9 e! k" t- g. O- _
' k; _- k0 m% W% Y+ Z3 Q9.1.3.    计算帧速率
" T) N8 C& j7 y3 n* i- D帧速率用FPS(Frame per Second)表示。首先声明三个全局变量:1 l0 x/ z3 s& q$ x1 r$ H
1 Y: _$ S) C! t7 u. ?" [
DWORD FrameCnt; // The number of frames that have occurred.' z9 c; [# p- X5 s6 V$ ?3 y, ?6 C
9 ~; N6 u; @# S( A& o/ T
float TimeElapsed; // The time that has elapsed so far.
  d0 l1 ?$ Q# N% E$ Q; ]
- R. T+ b& k$ i* J7 }" E3 ?5 Jfloat FPS; // The frames rendered per second.8 G; m; f1 ]  T0 r3 T$ O# P

; c: L0 b" Q$ b) C% W* U  L* z  p2 V
每秒计算一次FPS,这里计算的是平均值。我们也可以有足够的时间去读FPS值,而不至于因FPS的快速变化而产生较大误差。6 t" a7 H8 w1 l1 b
4 l9 z- L( b5 i1 N) b
每渲染一帧,累加一次帧数和所用的时间值:0 A: X9 C# S: I$ p9 n" z

7 t( z& q3 h- C( k' cFrameCnt++;
; D0 [0 ^  Z+ @$ ^2 V: j2 `4 X
4 u  p/ I% G2 i* ^TimeElapsed += timeDelta;
7 p9 m2 O. u+ o# N ; u0 u) `4 H1 m  _

" w: Y( H" ^9 f8 p这里的timeDelta表示两帧间的时间间隔。每过去一秒,就可以使用下面的公式计算FPS了:5 n. _1 T4 \* C$ w0 h

' K: ?+ u+ J! B# ]7 }FPS = (float)FrameCnt / TimeElapsed;
( N; m& ], w8 i$ o: z ! M  y- {$ e3 X; K) n% z4 o3 h5 S
" T2 d! P- V. ~3 o5 r1 _
计算完成后,需要将FrameCnt和TimeElapsed重新置0,这样下一次的计算结果才正确:  l4 m/ [. q" w; L. F4 A5 Q& T+ w

1 A; U% H# K+ L4 @. r  o1 z( E8 yvoid CalcFPS(float timeDelta)+ q/ x& q3 D0 K5 P$ [& _
) j' E5 T! J' E$ z3 }1 C1 Q9 [
{
! I& b. z' o" h8 M" @9 Y  R4 O# f
    FrameCnt++;
( O! \% e4 A3 \$ y; u) n) L" {( g7 s: p6 Q( w- G* p: ?7 S1 d& J
    TimeElapsed += timeDelta;; I4 ?5 t7 Y6 E) |% Z* i% s
1 A: }8 Z. X- S3 ~
    if(TimeElapsed >= 1.0f)
  E1 b& \9 M/ r' v0 O2 T
( f+ x" [4 X, ~2 I    {
5 M& ~$ p# W2 n5 N8 c, T& k# @7 r) f) `* t7 k3 Z* e
        FPS = (float)FrameCnt / TimeElapsed;7 ?5 y+ F8 K& c8 t) K/ l
- D; `( ^2 s2 l7 \" _9 W0 C
        TimeElapsed = 0.0f;! [# p4 a# t( N0 [  E, ]+ e

' Y! Z6 _3 c% s        FrameCnt = 0;8 Q* ]/ \: X6 u) n/ S7 m( b

: o; U& [/ S' @& U2 B4 A    }
2 z9 A  ~/ y5 Z$ S  t$ |  C( O0 J. \! b. f, t' }* K
}" Y8 `/ {! x& @% c7 z0 W
) }( ^4 q( _" t' f7 S# r

# l) g: V4 \: _' H( y8 l9.2. CD3DFont9 h6 M) C- T8 ~1 c6 m8 P" U) Y
在DirectX SDK的安装目录下,提供了很多有用的代码CD3DFont类就位于其中。该类使用纹理三角形和Direct3D渲染文字,而不是通过GDI渲染,所以,其效率高于ID3DXFont。但是,CD3DFont不支持复杂的字体和文本格式,如果只需要高速渲染简单的字体,CD3DFont应是首选。
! n& ?7 Y* m5 i2 Z% b
6 j  W# ^( q) q" c4 [$ _# H使用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版本!
/ N: [( M7 R# G# _7 ^1 e* E) \; d7 b* T; ~" Z: y
9.2.1.    创建CD3DFont对象* z8 K* O9 U( K$ H
创建CD3DFont的对象,就像创建一个普通的C++对象一样,其构造函数如下:4 I  a" `6 N- \9 x
5 B' [2 _) S: {: M
CD3DFont(const TCHAR* strFontName, DWORD dwHeight, DWORD dwFlags=0L);
: g# a* T* ~$ d# C * ^& t& v; g! U% i% }5 ^9 w& r7 u

8 F9 }3 V+ A: |% I+ @9 l: Fl          strFontName –所使用的字体名称
1 w( ]; Z& X, h* Y6 j
" N9 S6 [) I/ G- f  dl          dwHeight –字体高度
1 m# l5 L" ?2 b8 l+ ?8 ?, E# Q" c5 \5 `% ?4 v7 B: z& P: f) q4 b: z! }
l          dwFlags –可选的标志,如D3DFONT_BOLD、D3DFONT_ITALIC、D3DFONT_ZENABLE等。1 ]; A2 \1 `& S; [
& }  m8 \+ _- {5 T1 {9 Y
得到CD3DFont对象后,还需按顺序进行初始化,如:
6 H  Y# e8 k. l7 A
/ H  i+ N% S0 J# ~Font = new CD3DFont("Times New Roman", 16, 0); // instantiate, k+ [  M; I; b3 n* V9 D

: v* @0 Q5 E  y4 K# d7 U7 CFont->InitDeviceObjects( Device );  ~  K- ]4 C. d
6 b2 |+ Z5 Z9 l" _4 I2 [1 ~7 |+ E
Font->RestoreDeviceObjects();4 J1 c& u1 Q6 ]' `

; R& F0 G2 a+ h" v  w9 F' G, W7 e, ~0 E2 X6 N# ~3 [
9.2.2.    绘制文字
- G' z( E# {0 H使用CD3DFont对象的如下方法渲染文字:: l  K+ W) ~) _# R! s
8 ]/ w* J" z. o; n
HRESULT CD3DFont::DrawText(FLOAT x, FLOAT y, DWORD dwColor,
% j1 z( N/ h/ w' |
- d) d7 f# n5 o    const TCHAR* strText, DWORD dwFlags=0L);# h1 ]& O5 q$ X- a& ?* ^
+ t/ Y4 ^; Q$ U: l* z; u

- G6 l+ {6 r0 \5 M- n) \l          x –屏幕的x坐标
! ^3 a: v2 _: l) D% x( W1 c- |0 {  I6 C6 }, u; x. Q
l          y –屏幕的y坐标8 i  o0 i, k0 s' s! [* o' X

7 f0 S2 P8 _' jl          dwColor –文字的颜色
& I* i7 m& @' X1 i: ?3 m$ i& M8 B8 e1 X+ ^- q" e
l          strText –要绘制的字符串
( u/ p  z" `6 Q0 m7 o, l1 R# S
9 w: Y/ Y% Q. ~8 \& a0 l- gl          dwFlags –可选的渲染标志,可为0或下面的值:D3DFONT_CENTERED、D3DFONT_TWOSIDED、D3DFONT_FILTERED。
  e% v! V& u  P5 F$ E
. U& ?7 j5 I! ?8 Q1 C4 f2 G# ?例如:
7 _4 j0 N- w% N$ ~8 R3 B9 x
2 n  n3 @. u/ jFont->DrawText(20, 20, 0xff000000, “Hello, World”);
( u* a0 H! j$ \0 P4 |) o $ q" L4 e1 _9 J) H  w5 N
, m6 A! I9 {/ X9 \7 U/ j  \( t. g
9.2.3.    资源清除4 h+ \( V1 B3 K7 d3 |. r* C# O
在删除CD3DFont对象前,还需作一些清除的工作:
: c2 s) ~5 y, r# i
! s" h' u1 V7 ]- \0 sFont->InvalidateDeviceObjects();: ]9 G. o+ Z$ |% S
  Q2 m" A/ r8 H: i, l; n# T
Font->DeleteDeviceObjects();
8 n( D# G. Y7 M, H9 _9 Q: S
3 H! |) \8 G0 R/ y  V* Y" bdelete Font;: |' R8 C4 i: m1 T: T
$ m, ?' C5 l8 s6 Q* S

6 y7 ?4 f" S6 \5 Y3 K9.3. 函数D3DXCreateText
) x3 f) j5 s- h$ O该函数用于创建3D文字Mesh,原型如下:
+ ]( y4 V% ?. l& D0 `$ w/ e9 O! {* w8 N6 p9 r- H) F3 ]4 z3 p
HRESULT WINAPI D3DXCreateText(% R8 k2 y9 \! {8 F
: O4 ~; K( v/ ?! x3 E3 \
    LPDIRECT3DDEVICE9 pDevice,. @' E- \/ `9 S- K1 e
6 F# V1 @; u: {0 \5 v4 i  ]
    HDC hDC,* G1 R2 Q: d$ r7 T5 B7 T2 }- a3 W

5 J1 x9 ~; `: l" M( B7 z    LPCTSTR pText,
5 e  ~6 \) ^! ~& X# E! g
2 o6 K2 l0 h5 R8 u0 Q7 }2 q    FLOAT Deviation,
, ~( z" w! O2 I! k2 h# k3 `
4 O0 U: C/ x3 p6 m    FLOAT Extrusion,
4 c2 N$ m1 A7 T5 y5 C# R3 W5 U
" _1 U, D+ N( Y  b/ m4 o    LPD3DXMESH *ppMesh,0 d% G( L2 x) T, z1 L% U

, ?  _, `- O. O4 }  x" h+ F    LPD3DXBUFFER *ppAdjacency,
4 z* i) U, d# s( W# ^% p$ p: f+ e8 e& D
    LPGLYPHMETRICSFLOAT pGlyphMetrics* _! M$ I0 E# S5 o+ f
' T6 Z& r. D0 {0 b
);
7 C6 @  O3 P/ u$ Y' h : N7 \9 N6 n/ R% w

) w- Y. Y1 F) ul          pDevice –D3D设备& y" q( _7 \/ j- i1 q7 {! U2 W' O
( P, ]9 O( q1 W' {
l          hDC –描述字体的设备上下文句柄9 u* S) P6 [7 t1 O' n4 R* c) G& d
' Q: V* ^, K1 M& d3 U* [/ F, M# @5 e
l          pText –要渲染的字符串7 T# m0 H1 M' Z$ `3 p) ~
$ b$ G; W* X. M4 m6 }! T
l          Deviation –TrueType字体的一个属性,该值不能小于0。如果为0,则使用字体的默认值
: Q7 D$ S3 c( T5 R; x& N
5 x) E! G2 z6 W) o% i; l/ _& M+ P$ Hl          Extrusion –字体的深度,相对于Z坐标轴
; u; @! q5 G$ b$ `: k% V+ Z* s" Z3 ?9 B) y* E
l          ppMesh –返回生成的Mesh对象指针
! _( c6 i" p. u6 l/ D5 x" |) [
9 y( X7 ~! O4 m0 ]* L6 m# D- ]l          ppAdjacency –返回邻接信息。如果不需要该信息,可使用NULL指针
- r/ T0 B1 _$ _  `& l4 j6 Z+ h9 ?; a+ a& V
l          pGlyphMetrics –结构GLYPHMETRICSFLOAT的数组,返回轮廓矩阵数据。如果不需要该数据,可以设该参数为NULL
8 N* A0 X# @. K' O; y
7 f8 h6 [' z6 ^! x3 I下面就举例说明如何使用该函数创建3D文字的Mesh对象。& _  D2 ^) w! H, b/ i7 n& s% Z

5 e+ |) N- f( ^7 \( f; u// Obtain a handle to a device context.
# ]) E/ r7 U7 p  e, O% U; C9 `& Z) K8 F3 q3 t8 l+ x
HDC hdc = CreateCompatibleDC( 0 );
: G' Z' A& @) w$ L2 v5 ^. ?& E, ?0 I5 \; O; c
// Fill out a LOGFONT structure that describes the font’s properties.
% f6 }5 ^- v1 p( K) Z3 S  x$ U+ `6 v
LOGFONT lf;. R  [) O/ f7 j$ q; q9 ?* V+ c* D

9 _' U% H7 J+ }9 VZeroMemory(&lf, sizeof(LOGFONT));
- S1 h7 N3 A# [, d+ f" |& ?5 Z& U& d2 W8 b9 T* V3 V8 J3 J3 T
lf.lfHeight = 25; // in logical units/ ]) l% e! M' K1 h- J) f3 M
* i" ]3 K6 }  {0 B! }/ N
lf.lfWidth = 12; // in logical units5 u# U+ l7 d1 c% r' l" m* \8 S( @+ m6 s
9 y2 ]0 g& Q7 N3 \7 v% W  X
lf.lfWeight = 500; // boldness, range 0(light) - 1000(bold)
2 Y' E# _* z/ ]1 ?: C) O* ^1 R
* m3 K+ t" `: p2 `lf.lfItalic = false;
+ h3 I  Z9 F6 R; o( E& ^0 X
" q3 H1 y: N* c2 Hlf.lfUnderline = false;
/ B5 V, q& i) J7 h# P- s" f' ]' a" m) y! \% ^" i
lf.lfStrikeOut = false;. i: m. `( Q1 B% V

' ], e  a' u: X: j, m9 O7 [! Zlf.lfCharSet = DEFAULT_CHARSET;
( O; C& u/ G# h& @9 x: z1 J: x0 r% c1 G: \- Q
strcpy(lf.lfFaceName, "Times New Roman"); // font style
6 b! p, ~5 W: C$ ^
4 s2 [& r6 `$ I! v6 Z// Create a font and select that font with the device context.
/ m, l" U7 t( \: K/ h8 t. n& p% o. y' y$ m
HFONT hFont;4 X3 L' G, X9 v& V2 ]
% _7 g9 h6 E) }9 C: {6 K
HFONT hFontOld;+ s; }: z6 P; y2 D2 o, N$ M* F

2 r: _9 U/ `- a# g3 ahFont = CreateFontIndirect(&lf);
4 M) _& {9 G; R; ]7 m& b3 b7 ^3 Z# q+ N6 O) z0 V* {& h
hFontOld = (HFONT)SelectObject(hdc, hFont);) c# E& ^" c: T$ J. t

8 p6 G4 i: v# |; g% O// Create the 3D mesh of text.
% p5 ?) [& @6 y6 R+ p
. u. b- o; U; e# T% m4 k: S5 |' hID3DXMesh* Text = 0;  m. H0 h, b6 _, m" @# ~

) U3 |! A$ p2 tD3DXCreateText(_device, hdc, "Direct3D", 0.001f, 0.4f, &Text, 0, 0);
( E& b' }7 _! i' n* u7 [3 D  ~! b4 A! x
// Reselect the old font, and free resources.) P' L  ?. n* m

6 K% W! ]+ N# P9 [. u  T* i) JSelectObject(hdc, hFontOld);/ u" X! o, D7 N. b( w
# x. |3 n6 E  b) W/ M
DeleteObject( hFont );
# C! {# o- K1 b& a4 a5 ?" l
2 B/ ~8 j' z" q7 DDeleteDC( hdc );
% Y" W" F6 J. U
4 g& H$ p, H  M, W9 Y( `- h5 M1 Q1 _& `: d2 R/ T3 S1 \
这时,Mesh对象已经得到了。最后,直接使用DrawSubset方法渲染即可:) t& z0 {; Z  q
6 \$ J+ M4 h" k& i2 L" V! D% l- l
Text->DrawSubset( 0 );, E* ]( P- F" }$ Z8 k
: V1 o5 D* Y) ]. Z' o6 W

! [! r# G) v- Z译者注:上面的例子代码,使用的是较早的DirectX 9.0 SDK,不是Summer 2004版本。
: ?7 `$ I; v# c, S' P7 y
  s& K) ]2 y+ `- z; X! Q9.4. 总结
3 H8 p& Z: K( l+ d8 Ql          如果需要渲染较复杂的字体和格式,使用ID3DXFont接口会很方便。但是该接口是使用GDI实现的,故效率较低。
8 p$ i$ O* s- w
- U) A6 ?$ |) z- \' c8 ?l          CD3DFont类可以快速的渲染简单的字体。该类实用D3D的纹理三角形渲染文字,故速度较ID3DXFont为快。3 k& s: b  E0 |  N0 v' S

! k: k0 D9 @" X: \5 C3 r/ l4 U! hl          使用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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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