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

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

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

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

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

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

http://www.5178c.cn/article/6/2006/200605173892.html
. O( f: b4 z" C2 u- p, c' H7 i' l1 q7 D
在DirectX 9.0中渲染文字
4 A) J2 R4 y+ n" w- B- Q# ^作者:佚名  来源:不详  发布时间:2006-5-17 12:27:04  发布人:admin
. c9 u# N5 m8 X& L! D% I8 J减小字体 增大字体 2 e; w+ O# A: |9 l% ^; w- O9 P
: S0 A' z1 q% C7 X+ x1 t+ M  _

3 T' a8 ]5 Q$ v( A  d* y1 u  x$ k0 O( D( E7 I, _5 }4 ]
4 _" d5 B/ ~$ K4 E$ t: w

- m: z1 A5 G4 t( v1 H/ d, M& p2 ^2 m
9.   字体4 S9 N4 f. [" s2 G' ~; A9 m2 c
本文翻译自《Introduction to 3D Game Programming with DirectX 9.0》第九章“Fonts”,敬请斧正!XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />
$ o% w5 `9 X6 S7 n; r; Q+ ?8 _  V, d' @+ x

$ F9 Q3 e* s! ^! _+ F: {. h5 l
在游戏中,文字信息的显示是必不可少的。本章将讨论在D3D中使用的三种显示字体的方法。同样,这里只列出每种方法的演示程序的主体框架。学完本章将达到如下目标:2 f. f/ W7 X3 [# j: p4 p, j

- D. ~4 R9 V; Q: r8 K. N* Bl          学习如何使用ID3DXFont接口渲染文字5 {3 c) v$ U3 u" C7 U. h
( ~- d$ [& x9 _+ X
l          学习如何使用CD3DFont类渲染文字
, ^* o8 K9 d& _# h3 j. E. V) x
5 h! t+ P/ J% A& pl          学习计算游戏帧速度的方法$ h1 I$ `) `4 c: l1 Z( r$ }. v) X
- P- s. P" @" E4 g
l          学习使用D3DXCreateText函数创建3D文字
* [5 O& K8 ^' t& K- l1 Y" }7 B& [: _. ?; `) p, T" d% Y0 A, o1 c
9.1. ID3DXFont
! B8 w  c" V3 x5 V要在D3D程序输出文字,使用D3DX库提供的ID3DXFont接口很方便。其实该接口是使用GDI实现的,所以,其执行效率有所降低,但是它可以很方便地处理复杂的字体和格式。
; S9 O7 d' }, u: n0 q/ O0 n0 U2 c& p  U: C& Y% c$ j/ J1 e1 _: t7 ?
9.1.1.    创建一个ID3DXFont7 @, Q9 X) S, J- w8 s9 K6 Z
可使用D3DXCreateFontIndirect函数创建ID3DXFont:( J7 _5 @% B1 `) _- X( r

1 `1 a1 a# V6 [) o; _$ f; T2 VHRESULT WINAPI D3DXCreateFontIndirect(
3 r! B) p4 q( [$ |4 h) D/ W5 Y
( S" A4 |+ \! r2 J% t* R    LPDIRECT3DDEVICE9 pDevice,
; g( ]! b! O! H/ W8 g3 m) V4 l5 p1 I+ F( A- v# ]/ [$ P- o
    CONST D3DXFONT_DESC *pDesc,6 m* K& n8 K5 [0 ~2 D- ~8 A7 g% z
' Z% k5 Y; s: L& L- c0 c2 r( z
    LPD3DXFONT *ppFont
0 S* S  ~6 n, }+ k" a* H& {5 K
. Z3 F# _3 ~" m. t' h);7 w: `4 e  _: N6 I  ]" w- [6 ~

0 v# [& U7 T' v1 |$ ?; d
( C" j+ ~  `5 ?5 G& m0 V- f! j- J译者注:我所使用的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 |5 C7 R0 V" m9 L- t4 y6 b

- V9 y2 j" ^" ?7 e% Q使用这个函数时,需要一个D3DXFONT_DESC结构:
# f2 M8 D+ Z, Q/ W
' ]9 y& {, e( K- W' zD3DXFONT_DESC d3dFont;
" M1 {! v6 L# s# M$ _0 n6 _5 Q  G6 y0 O% ?
memset(&d3dFont,0,sizeof(d3dFont));
5 A5 C( h3 w- ~: H/ V1 J) j! W& |! Y: m' }& o4 y' R9 E& A1 P
d3dFont.Height=25; // in logical units
. G: W) P( X" I. T% V  _6 ^0 [  O  Y. f9 l7 x: V
d3dFont.Width=12;  // in logical units
2 m5 v% ]8 ?4 z5 a
$ {" \- ?5 G/ P9 v  d. T+ rd3dFont.Weight=500;// boldness, range 0(light) - 1000(bold)
/ @' Q2 V" I3 ]3 y1 Y( O$ P
5 f: [7 W* P; kd3dFont.Italic=FALSE;
4 r: S5 n. g, i. v$ z: s: C; i/ W
8 R$ v' M) C* `) C, t6 m5 td3dFont.CharSet=DEFAULT_CHARSET;) `/ I+ L. O2 h! M+ J) e, o
* |& ^/ I' Y0 j5 i# l1 q8 H  ~; y$ q
strcpy(d3dFont.FaceName,"Times New Roman");
" z5 ^5 A0 r4 b8 D- [) U% j3 {  ~# }" F5 A. z( X
ID3DXFont* font=0;1 ~( {+ @/ @& O' E) x
- Q* j5 ~/ I1 L. M
D3DXCreateFontIndirect(Device,&d3dFont,&font);6 s5 Y  a6 K% _4 }/ L

$ k# P9 z! F; v! }0 v; b
0 u- N, X6 K7 S9 f如果你使用的是LOGFONT结构,则:
$ G5 Z2 z% y- H( F% l# `' Q2 j3 E& B9 f2 f$ j3 G$ p9 k
LOGFONT lf;# X4 c+ s" a  p; K  M
8 ~$ c/ {9 L; ~4 I5 o% F5 v
ZeroMemory(&lf, sizeof(LOGFONT));
# ^" }" x$ H( _2 V6 G. B. x: _
. _  M! g& |) n2 |lf.lfHeight = 25; // in logical units
% L* b3 b/ y# W8 {
# L6 w& [+ @: R8 [lf.lfWidth = 12; // in logical units
9 Z% ^, E2 o5 y% M& Y' t6 P  ^6 s0 N" U( p( x
lf.lfWeight = 500; // boldness, range 0(light) - 1000(bold)
% _: I* ~. M. Y2 X! I# Z; L  Y8 e9 q5 O; V" w1 x: K
lf.lfItalic = false;) g+ \. l( Z! _

( p" e5 T3 c+ L, b4 |9 _1 glf.lfUnderline = false;
0 b. Q2 t9 ]0 ]% R, g& ~9 B2 q5 d/ X" ~+ R
+ z* b1 a$ O$ |) g/ I! C4 O* Mlf.lfStrikeOut = false;
5 z2 {  N) Q' X' |+ D! R& x0 k( `+ ]3 E  F: m+ Y
lf.lfCharSet = DEFAULT_CHARSET;8 _/ M, t  G6 s- T- w! ^$ r2 U

. ^! j. z7 w$ W7 ^5 q4 Vstrcpy(lf.lfFaceName, "Times New Roman"); // font style' a, f1 m6 t3 P/ n# |

* Y1 c4 K& @+ g5 Z8 DID3DXFont* font = 0;
, {2 T6 ?* r; R9 @4 _
9 A  _) ^$ ]/ Y% OD3DXCreateFontIndirect(Device, &lf, &font);
3 h1 X. m( f" F * k$ ^( p( j( S# L  Y. W
8 y3 ]1 B0 I0 ^& T0 G* k8 @
另外,还可以使用D3DXCreateFont函数创建ID3DXFont的对象。
% N8 a! x+ Q( `& _4 q' {" e7 ~0 |( c, [0 N% ^. g% K' Y0 ?2 n
9.1.2.    绘制文字
& l& g3 M# I/ t* s3 L% Z得到ID3DXFont接口后,绘制文字就很简单了,只需要调用ID3DXFont::DrawText方法:
( r9 k! e" T( L" T, I. H( T* h* R7 L$ X7 A/ s
INT ID3DXFont::DrawText(
1 n& B. A5 f* P
; A! j9 Q; |5 _, M    LPD3DXSPRITE pSprite," R1 @& K8 H- U

# f+ i/ N( W3 c3 Z9 L( ~    LPCTSTR pString,
. z7 X; z# W* H: j& b
7 f# K' u4 a% V7 W1 i$ P1 L4 O    INT Count,5 f* q2 X) U, P& J$ p1 B5 h

# ]% v7 Q! V, [9 }    LPRECT pRect,; p  L: l8 F( u% ^' g! r7 W2 u

0 B7 [- O+ W) _    DWORD Format,
  h1 G2 x/ u: @9 }) U2 n- U3 I$ A, I* g$ D( T- _/ Q. T
    D3DCOLOR Color4 S% K3 S6 _0 I5 a
. A3 S8 N( \7 c
);6 S' `* o) {2 z9 O/ o

, ]5 N# S5 [) a8 u9 S' x  x5 j  `$ M2 d
l          pSprite –输出目标,为ID3DXSprite对象指针,可以为NULL值,此时字符串输出到默认对象
$ _' w  w: E, w8 x( g5 Y  b) _# w1 H- u* s' d
l          pString –需要输出的字符串; K' `( B7 u; v& B
; s6 f. R% x& u" p- |
l          Count –字符串的字符数,如果为-1,则以0字符为结束标志
) N4 I" ~1 w1 f) F. D3 l, I" S9 [% k1 J3 Z8 T% L6 G
l          pRect –绘制字符串的区域6 I7 J9 I- x* d8 p
$ `! v1 X  A; h  \
l          Format –文字的输出格式
- P2 D1 c6 R( M- {& I4 g5 i
! G, x0 S; y$ [" f! }' z/ F  ~l          Color –文字颜色
* ?8 X/ O! _; O" ]
8 q" R( @2 P9 V% M0 U例如,可以这样使用该方法:
- c  G( r1 u: C6 X
& Y* L) v+ Q/ q* _  }Font->DrawText(NULL,$ W& |/ g! k2 s, ^  l8 o
( a* L: F9 C# l. Z* a, c! F
    "Hello World", // String to draw.
6 U' H  H& ^6 v/ a9 \
% V% f1 M+ ~9 Z/ g' A    -1, // Null terminating string.
2 B" h$ A3 X9 q9 ^% ?& |
2 Z7 }* I+ p1 k8 b0 Z    &rect, // Rectangle to draw the string in.
9 o! G  J; u- h, P; f' h8 X* {, p, A/ |$ T; c# T; w9 n/ m4 }, r
    DT_TOP | DT_LEFT, // Draw in top-left corner of rect.
) k. h8 V  l2 ]' n- S% d( C, g) A* r9 M2 k2 C4 M( o
    0xff000000); // Black.$ [6 o" {3 U4 ~2 l3 c, U( [2 ^+ F( m

# H0 k7 `3 Z$ y7 T$ z
7 ?$ a+ Q6 @' T) t# `  H4 D9.1.3.    计算帧速率
1 t) f; a: k7 S' H帧速率用FPS(Frame per Second)表示。首先声明三个全局变量:3 ]0 j9 S/ Z# X5 Y* H2 V' P% m

3 G  Q5 G+ m' F3 ?' D: K. h8 @DWORD FrameCnt; // The number of frames that have occurred.0 W9 _4 e- P$ W

2 Y0 z' W& v! f/ |9 v7 `. t$ Ufloat TimeElapsed; // The time that has elapsed so far.
& G5 `8 d9 I$ T/ ]" A0 [2 x) W# f% Q* Q8 T5 f
float FPS; // The frames rendered per second.( h1 ^5 y6 m2 t7 B( \

7 m- a7 }; G, c) p# O; J  L, {9 \. h% E2 ?* R5 E8 F  E8 A6 m3 U8 s
每秒计算一次FPS,这里计算的是平均值。我们也可以有足够的时间去读FPS值,而不至于因FPS的快速变化而产生较大误差。& M7 `5 h) h) H$ p

* F" _1 T0 k9 d1 R每渲染一帧,累加一次帧数和所用的时间值:
- E# j1 T6 Q2 v$ E
9 C! F4 S3 O0 K! E; N* KFrameCnt++;
8 W/ S# }! Y& J! @+ a* E/ l  J) J- |0 Y/ N7 P& F
TimeElapsed += timeDelta;
7 F4 z6 r8 Y+ h0 D( g+ }: y5 w : [/ S( l. \0 ?: j; u: p

; T- L6 X0 r1 o9 `, m& o这里的timeDelta表示两帧间的时间间隔。每过去一秒,就可以使用下面的公式计算FPS了:
0 h# G1 u. q4 c" V6 `# y# g* E) y" ~4 I  T, Q# G
FPS = (float)FrameCnt / TimeElapsed;, A/ G3 r# {2 e
" [0 ]% r  A4 Y

5 P/ c* o' g: Y1 k计算完成后,需要将FrameCnt和TimeElapsed重新置0,这样下一次的计算结果才正确:. S) n' E6 }. t# x3 X4 S
! ]7 o( _% `* ?, j/ w
void CalcFPS(float timeDelta)/ Q" h# J: W7 p4 }4 u: U) _

2 _5 c, b* W) ?8 w{0 t2 V/ Q8 k" o: [, v5 a
" a! K  M# O- e7 w
    FrameCnt++;
: U+ K( B2 C9 o1 F1 n/ x; {) n5 e9 B! B- R9 e- D2 F
    TimeElapsed += timeDelta;
2 G8 O3 z0 O* ?$ \
4 x4 |% v) n1 V' _5 D, j% s: y    if(TimeElapsed >= 1.0f)! Y8 A3 |" [3 Q: K' s  r

+ x! \7 @& t4 }! j* L! m    {, t7 ~3 a; l# Q. ]
# S! {  d; u' Q% V1 ]1 C
        FPS = (float)FrameCnt / TimeElapsed;
7 o* Q( l5 \6 X, E
# n' _6 Y- A8 h" p, ^+ H1 L        TimeElapsed = 0.0f;
# I7 C" j/ I% N( ?) \0 I5 \
+ A  B; _0 G5 b  H. X7 w        FrameCnt = 0;( `# D4 @  ?) l) i6 G

. k: ~" r/ `. [& j7 z( [) t3 z( U    }) k. v' s4 F2 R8 K7 x- N1 s5 L' w8 ~
1 Q# U; e9 q/ U. X  S% p
}0 t9 Q+ i1 k& |( L1 A: u
! L' q+ K# V" z& M

! s- ?4 S4 K& z' y9.2. CD3DFont
2 D; ?; C# m' x8 v  q/ Y3 m8 J在DirectX SDK的安装目录下,提供了很多有用的代码CD3DFont类就位于其中。该类使用纹理三角形和Direct3D渲染文字,而不是通过GDI渲染,所以,其效率高于ID3DXFont。但是,CD3DFont不支持复杂的字体和文本格式,如果只需要高速渲染简单的字体,CD3DFont应是首选。. P& a( f" f: k. x6 x- x

6 V6 I/ s$ Q( y使用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版本!0 ^# m; ^$ J6 z0 V( A  p

8 V; U6 y% l9 Y9.2.1.    创建CD3DFont对象
- b3 v" b) ^* y创建CD3DFont的对象,就像创建一个普通的C++对象一样,其构造函数如下:
2 Y6 x6 f: Q' ?
1 i5 I; L# d. J& a8 fCD3DFont(const TCHAR* strFontName, DWORD dwHeight, DWORD dwFlags=0L);- t- |0 W  N, E7 l7 q

1 c. f" y+ E8 Q, O$ e6 k' e/ D& [9 I- t& u5 d: e6 ?  v# x# |
l          strFontName –所使用的字体名称
- ^- ], Z$ u0 d0 k( N& y* n7 ^  @1 z0 M* j# H2 {: L
l          dwHeight –字体高度6 n* h0 t7 X2 G: E( H
, g! }. Z2 [7 l- P
l          dwFlags –可选的标志,如D3DFONT_BOLD、D3DFONT_ITALIC、D3DFONT_ZENABLE等。
5 N$ b9 n8 P5 _! @; C$ d! l0 Y# ?& ~" R, V) B
得到CD3DFont对象后,还需按顺序进行初始化,如:. h' _0 ?" X6 x! F4 A/ ^
7 v' @* k% z0 ^" L7 W
Font = new CD3DFont("Times New Roman", 16, 0); // instantiate
! n7 W% X, @. A: D, n, X) {6 e9 H% T7 y6 O. M& E9 G
Font->InitDeviceObjects( Device );- E" x7 b  w7 ^( ~7 X

- e$ j5 m1 h$ xFont->RestoreDeviceObjects();; a" ~( ?* [4 s1 u0 l6 c2 t
$ \2 k& u: K3 a2 e

. A+ H: P; u' }' ]; f: b3 d9.2.2.    绘制文字
5 g) z8 @- }. s( Y! }( S4 J使用CD3DFont对象的如下方法渲染文字:) Y8 e( j7 F& L) D( m

! M$ b$ n' b$ v6 i, EHRESULT CD3DFont::DrawText(FLOAT x, FLOAT y, DWORD dwColor,* S; Z8 g+ g# L$ D

5 }0 e4 m% i8 E0 B0 }) B+ J. E    const TCHAR* strText, DWORD dwFlags=0L);& k* q" `" q9 e
+ w' W8 e2 |  p6 j. ]5 Z
# H, D; B  L, n" I
l          x –屏幕的x坐标0 s# r+ L* k0 x2 B

. M' ]4 W* u. h! b. Y% ^l          y –屏幕的y坐标0 x0 q8 c, Q; k: {

3 R5 _. a. u) e* C+ A( tl          dwColor –文字的颜色
& x# g6 d0 ^$ [. ^6 k2 n$ ~4 q1 s& @
5 ^, @5 O8 C% J3 E& F7 U8 d3 O, fl          strText –要绘制的字符串
. q! |8 a( Q/ F3 d' Y; i/ j% p" y! Z' e  @! j' z0 c6 u
l          dwFlags –可选的渲染标志,可为0或下面的值:D3DFONT_CENTERED、D3DFONT_TWOSIDED、D3DFONT_FILTERED。# z& F' {4 @8 U; y1 J
' @. V3 b5 Z7 a! l
例如:# E) T: p7 ~7 I
+ z: E0 v5 i0 M4 |
Font->DrawText(20, 20, 0xff000000, “Hello, World”);; k5 \" y8 E, V) Z
: P$ u4 u2 ?& ^' q4 E7 m3 L( {8 i
( ?+ H. Z! M& r: ?+ G4 q
9.2.3.    资源清除
/ R) Y$ q8 p9 ^3 b1 E& j在删除CD3DFont对象前,还需作一些清除的工作:( F, h% p# v5 m% d/ E6 U; I" |: Q' J7 L
' p7 G- ?1 H8 v' }3 I  H- M; [' k
Font->InvalidateDeviceObjects();
1 b2 t" D, }# b& U9 t' m) A, Z, Z0 G$ O/ ~, S8 M! W
Font->DeleteDeviceObjects();
% m9 f0 P8 |( C7 K- d, Y1 i5 f+ v; z, V
delete Font;
9 e# Q$ Y* Z7 P
. h0 l6 j* P# k  X/ ~
5 H2 G8 p6 ]* y9 i7 u9.3. 函数D3DXCreateText
4 v/ {8 z* G: e: b* e该函数用于创建3D文字Mesh,原型如下:3 U. v+ @: k8 A# d" S( u
" a( P# O: t: O
HRESULT WINAPI D3DXCreateText(
& h& z, Y5 _  {4 n1 x" T
: s$ r( T) W5 o. I    LPDIRECT3DDEVICE9 pDevice,! U0 S$ c* H3 J# V0 f" |
; [( t' V7 B& p+ {% y! `4 Y0 W( k5 M" \$ P
    HDC hDC,
% s3 F' F! [8 c2 P: l1 Z
$ Q) C8 `! C) y: l    LPCTSTR pText," E% L( T& O2 A4 K. ^) Z

8 c8 g- q7 t5 c: H. I3 s1 m' f    FLOAT Deviation,
( ~- Y, V% d: {: A) h7 P! o' r! K: j) P5 N! P4 ^. [
    FLOAT Extrusion,
; b' g% v$ M  B# s% F) l8 Y% [& j* ^1 T; y1 G
    LPD3DXMESH *ppMesh,
: f4 g* X) J2 c" ~' t$ @7 i, B+ D4 d7 }; a
    LPD3DXBUFFER *ppAdjacency,% P0 V6 Y6 W. ~. j0 n- D
% V- s! r  n  P- |/ s# ~* z5 ^
    LPGLYPHMETRICSFLOAT pGlyphMetrics6 [) b5 X- W& N, C, C0 d
1 i. |* A8 ]$ N
);
6 N; B! {+ X% W% ] , F3 r/ H* x4 D

, S" M; ]1 t- H) ql          pDevice –D3D设备
8 Q5 N3 i( F: x' x  [; W! z7 L* G6 s% [3 c& \
l          hDC –描述字体的设备上下文句柄4 m2 u+ P7 @/ X

& b+ ^6 {  H9 E6 {6 nl          pText –要渲染的字符串
; a" s7 r5 M7 Z) f
; ?. E1 g" y/ t/ zl          Deviation –TrueType字体的一个属性,该值不能小于0。如果为0,则使用字体的默认值
% Z" }  p* y2 _5 ]( H0 y3 J$ h* R0 x. a$ c7 u
l          Extrusion –字体的深度,相对于Z坐标轴
( a6 ^( L# I4 D* J3 i. W4 q( ~
. m$ V, a4 a4 D8 t2 O0 F8 Fl          ppMesh –返回生成的Mesh对象指针& {" X( g( I7 ?& @
0 z$ I' j2 i( P# P& a1 j, k
l          ppAdjacency –返回邻接信息。如果不需要该信息,可使用NULL指针
5 R8 r& s* R- u! ^0 m% X2 Y' Q; V5 G! m
l          pGlyphMetrics –结构GLYPHMETRICSFLOAT的数组,返回轮廓矩阵数据。如果不需要该数据,可以设该参数为NULL
/ Q) s) t9 V: Q+ [: T$ V- h8 q/ F; @0 e# N0 G
下面就举例说明如何使用该函数创建3D文字的Mesh对象。
, u4 u% Z4 {& o* U+ @  B
: z$ ?8 O5 g, l  K// Obtain a handle to a device context.8 n8 R4 F' J3 A3 M3 v$ ^6 S# q

1 G) A7 |+ r# X% `3 c5 ?& H1 QHDC hdc = CreateCompatibleDC( 0 );/ U: s: J7 x4 R! O8 }
2 |6 P, I% \, a3 Z
// Fill out a LOGFONT structure that describes the font’s properties.
* P" R# s% f$ r6 k& G) g) f+ f  D, _0 Z7 i
LOGFONT lf;, s+ D/ {3 m5 u- V1 M( t

# W6 F* ^' k/ I( M9 ~! ]3 wZeroMemory(&lf, sizeof(LOGFONT));: F5 v' N4 G' X" ?6 [2 j
# D5 c* R5 s5 ?
lf.lfHeight = 25; // in logical units
" ?0 c! d. @- K% i
# _& {; U& i4 Q( M- c- Plf.lfWidth = 12; // in logical units
' B3 U4 N# A2 ?$ I4 y" Y  a3 c+ l
lf.lfWeight = 500; // boldness, range 0(light) - 1000(bold)
& k( b# X) e0 l% S& }5 H* ~5 F. Q& E0 j+ a
lf.lfItalic = false;
' P5 x  P- R/ F% N8 f! O+ S8 @5 h
# G- V6 M2 p2 c+ s3 y4 s6 C- c7 mlf.lfUnderline = false;
$ b# u1 K- H: R* u8 d9 N3 A" n: ^. O  C' L% |. W" [
lf.lfStrikeOut = false;# T* P  z  T6 [, `1 ^) e0 H; b% M7 s2 a
+ n' r3 s' S% i! w3 I6 G1 }" F
lf.lfCharSet = DEFAULT_CHARSET;9 o( N8 `( x9 t9 \" k
3 p4 x6 E% E9 E& u* s
strcpy(lf.lfFaceName, "Times New Roman"); // font style6 h6 e! i/ l, Y: T% Y3 ^. K& H
7 U1 S1 U- ]- U5 M* M) O( d
// Create a font and select that font with the device context.1 p6 v( t! @" v) u- `
* }2 Q( b/ A+ O4 s% t/ Q
HFONT hFont;7 I& z2 p' a/ s, a

! b( r! H+ }1 W- U" ]: XHFONT hFontOld;
( ?8 Z) ~/ \2 P
, z3 E: Q2 o/ o  khFont = CreateFontIndirect(&lf);8 u2 E9 L2 h; X8 I. V4 I$ S& w! f

8 D, s  e% b+ U9 N' \4 w7 b6 KhFontOld = (HFONT)SelectObject(hdc, hFont);" F; b. m$ I% @# J0 n2 k6 r
4 p# F( g6 j0 }, p$ P* ~
// Create the 3D mesh of text.4 \: V# Y7 q/ M' b3 x# Z

5 D: i2 I8 O0 |: J$ gID3DXMesh* Text = 0;7 g/ j# v3 t* w( ~0 @  c( ~7 W
) y1 G$ _. b( Y9 l+ L6 o
D3DXCreateText(_device, hdc, "Direct3D", 0.001f, 0.4f, &Text, 0, 0);3 c. r; A8 T( I- [( {6 c3 Y
9 k$ r! X6 j7 N
// Reselect the old font, and free resources.( e3 v( s/ z# O) i$ \  S( ?# f
7 L8 E5 h& s3 D! r; U0 d1 u
SelectObject(hdc, hFontOld);  k  `$ E9 y) e6 `0 w1 R
0 c4 V2 ^  Q+ b: o
DeleteObject( hFont );
3 F; s. q- m; Y' Q0 y7 n- I; t7 F7 r7 o. ]) w) B' A9 d
DeleteDC( hdc );
7 |% l1 R2 T2 u8 P+ i 4 r0 |8 U) Y6 E# _4 u& p* d
! O( x1 U, O+ x# c# C8 f' h
这时,Mesh对象已经得到了。最后,直接使用DrawSubset方法渲染即可:
& c! n) p+ c. k. y) N2 I! \! `' D( I: M+ O7 c
Text->DrawSubset( 0 );
1 Z) R6 z; R  b , w2 H' g; }% ]; ^

! y- C# S+ G4 k6 D8 |4 I译者注:上面的例子代码,使用的是较早的DirectX 9.0 SDK,不是Summer 2004版本。
2 p0 z" q* [# U9 j' _
) O% n- G5 E0 g; _, e4 a0 Q9.4. 总结8 z, H4 a2 h7 o" u' K
l          如果需要渲染较复杂的字体和格式,使用ID3DXFont接口会很方便。但是该接口是使用GDI实现的,故效率较低。1 a! N6 h; A# ^% g! f# `# v5 p
# r4 X" T+ K1 Y7 y
l          CD3DFont类可以快速的渲染简单的字体。该类实用D3D的纹理三角形渲染文字,故速度较ID3DXFont为快。6 A3 k; D  Y9 d6 o! @( p
0 f% R/ l" r( Z; C- n; S5 i$ j! W
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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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