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

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

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

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

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

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

http://www.5178c.cn/article/6/2006/200605173892.html
9 K3 G, G2 B( t% R5 D1 K
6 @, g1 U  _- `; J- k* t在DirectX 9.0中渲染文字
0 u  _! H: v4 X/ U" Q) i, t6 s# N# t: G  B作者:佚名  来源:不详  发布时间:2006-5-17 12:27:04  发布人:admin 3 T3 B: S0 G' b
减小字体 增大字体
2 O( b3 j8 a& E/ m% ]0 y8 O, m# M- m4 h' `  B5 u/ ^

: J' n( e3 D& k- g+ K- z
7 v3 }% i9 L& w" W6 \2 J$ z  J: P  B# k# t8 S
  K) I1 n3 L+ Z0 e6 D
7 G, K2 m6 Q( K7 D; ?
9.   字体/ X: p6 ?" X! _( p
本文翻译自《Introduction to 3D Game Programming with DirectX 9.0》第九章“Fonts”,敬请斧正!XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />
+ d1 A' v+ i/ U& l$ v
! F5 S  o/ j$ r ! n) U) [7 h) }/ f+ n' P1 c

0 ?% N1 |) K+ ~: b* W, c在游戏中,文字信息的显示是必不可少的。本章将讨论在D3D中使用的三种显示字体的方法。同样,这里只列出每种方法的演示程序的主体框架。学完本章将达到如下目标:  G; L; _3 N; A" z  ^' W: D
( c; l5 k! U, v3 R  V+ f
l          学习如何使用ID3DXFont接口渲染文字
2 [" d6 v; P# n8 m' W$ E/ W1 z
% ~  t8 U7 T; R7 S4 vl          学习如何使用CD3DFont类渲染文字, L0 [- e7 R0 w5 W, ]* V0 z! P  ]7 U
& ~# z- s3 w$ v. ^* T; G
l          学习计算游戏帧速度的方法
+ |- n6 \8 i6 R* |: ^- k8 q1 f$ I4 ?* ^
l          学习使用D3DXCreateText函数创建3D文字
2 E! E+ L/ g$ M  H$ R- }' g! j& [! J6 R. i0 i. T. \
9.1. ID3DXFont
2 x" `) d$ y  I4 G! O6 \要在D3D程序输出文字,使用D3DX库提供的ID3DXFont接口很方便。其实该接口是使用GDI实现的,所以,其执行效率有所降低,但是它可以很方便地处理复杂的字体和格式。
2 _0 Z# S8 v  I: F8 ]0 g: @. |1 L7 A
) j" j, e, N- r; X, x9.1.1.    创建一个ID3DXFont+ `* P! O$ j; o8 p- W
可使用D3DXCreateFontIndirect函数创建ID3DXFont:
! Z- _/ N" `1 d9 R) M
3 \. R) Z+ w: M6 {$ N4 m7 jHRESULT WINAPI D3DXCreateFontIndirect(
& u  Z% ~; H  D
4 h. \( i$ Z5 L  ]5 I/ X    LPDIRECT3DDEVICE9 pDevice,6 ]- o2 j: j/ X* x% z5 O

+ ?6 w# R$ y, }& @6 K    CONST D3DXFONT_DESC *pDesc,
9 K4 b( ?% M+ d5 q- ^) p& ~
. n' \) V4 u0 c    LPD3DXFONT *ppFont
& R( T3 l; F+ h* P" ]  Y
% I& O, x. M( E: P' e. f$ P5 k6 E);
9 }. ^5 u. l! Z# y9 ~ " U9 J' |* L1 f" R
& X# I% X5 L- w( o
译者注:我所使用的DirectX SDK是Microsoft DirectX 9.0 SDK Update (Summer 2004),也就是使用DirectX 9.0c的那个版本,在较早的版本里,该函数的原型有所不同:第二个参数为CONST LOGFONT *pLogFont,它是GDI中的结构。以后,如无特别说明,将以DirectX 9.0 SDK Update (Summer 2004)中声明的函数原型为准,特此声明!- d4 F" p. j1 w- Y/ c
: I' B, p# ?+ D. J
使用这个函数时,需要一个D3DXFONT_DESC结构:
! Y8 u1 ~( w& ^" I" Q5 H3 y! M
; F5 n7 o* W7 x- N+ G' L9 CD3DXFONT_DESC d3dFont;5 q9 [0 h1 N3 |4 {

( x  B/ q9 S' Q( R$ v  Kmemset(&d3dFont,0,sizeof(d3dFont));1 C  S9 X: L. |$ c% Y9 i6 a

# t: O2 _) b* {+ V& ^d3dFont.Height=25; // in logical units6 j4 u9 P% ?: Q6 p+ f2 X/ X/ `' m

1 K0 `. X/ [( ed3dFont.Width=12;  // in logical units7 k0 p* ~" W) h4 h8 F4 P2 k
. x" m# T* n' M7 s7 X9 d0 F3 f
d3dFont.Weight=500;// boldness, range 0(light) - 1000(bold)
3 E  m- S8 J3 \! x1 e& \* L/ ~5 E- r% l, z2 y
d3dFont.Italic=FALSE;7 M2 Y2 a3 w. |, ^) E: a! O
$ d4 h. m. ?6 [* c+ [- R) K0 s
d3dFont.CharSet=DEFAULT_CHARSET;0 Z) ?( r; q) x
2 I, D* D0 S$ g# ]$ r
strcpy(d3dFont.FaceName,"Times New Roman");
1 I' }" B/ l& w- b5 n- F; l) D' @1 j2 L& {4 p4 {' |% {4 ^$ u
ID3DXFont* font=0;
% V4 e! ^( G& u& |7 o, L' C; O, L, x7 d* R
D3DXCreateFontIndirect(Device,&d3dFont,&font);
' `' {5 @, t: P; j: j # E- g) X5 c' c/ i) A& p

6 Q+ u# p2 c8 B6 K, v/ V$ s8 w如果你使用的是LOGFONT结构,则:
0 M$ T1 Y& V3 J; I4 u6 \  }" C( V8 S, Q( ]: t1 s9 W( h" D
LOGFONT lf;
, m( C! `) w1 k( F4 \% M
: z: ?. o( i& {4 C9 ?ZeroMemory(&lf, sizeof(LOGFONT));, Q( X3 r& E4 Q+ ~

; i. f/ m0 i- X4 slf.lfHeight = 25; // in logical units
! e: g0 M/ J$ M0 k# Y, c$ P# C; Q9 P; y; W, D3 M
lf.lfWidth = 12; // in logical units; A, a& ?) X% T$ T! `
1 o6 p+ A! @' b3 g6 M/ |
lf.lfWeight = 500; // boldness, range 0(light) - 1000(bold)
& P/ |+ w; `( R8 V
: U6 j0 _! N+ J. `; s7 r( Glf.lfItalic = false;3 e4 s' }+ M3 i* ]+ ]/ C" w2 ^

; I  g: V9 V% V9 jlf.lfUnderline = false;
8 T( i0 V+ }9 u8 Q. |- k/ q, W2 f" [6 r0 M- t( l7 g
lf.lfStrikeOut = false;0 ]. ~2 x% X! }. z! M- [; V

5 i2 }% {5 U, ^* G/ Blf.lfCharSet = DEFAULT_CHARSET;4 l3 m3 l/ X' x, w; f

' J5 ~9 t' p$ E0 ustrcpy(lf.lfFaceName, "Times New Roman"); // font style& L  |" m1 ^2 N3 K$ }7 u5 X9 E

! A0 u8 y5 ]6 CID3DXFont* font = 0;) [+ A( F4 ~4 @1 L4 x/ J

. R/ t8 ~* |& R$ _  bD3DXCreateFontIndirect(Device, &lf, &font);
+ W. s, L3 X# ] & s& B8 u5 Z* g4 j

, V$ b) K! d( H# O0 V/ h+ Q另外,还可以使用D3DXCreateFont函数创建ID3DXFont的对象。
* _5 Y$ Q$ u4 `2 y' x. r- |' q- e
9.1.2.    绘制文字
8 @8 \! d4 l! K# n$ X得到ID3DXFont接口后,绘制文字就很简单了,只需要调用ID3DXFont::DrawText方法:
% {5 {- r7 H' K9 i( p/ c2 ^9 G2 i8 S( ^( W
INT ID3DXFont::DrawText(
9 c4 }& E& v. P; l7 g3 N* S2 V; ^, g  H, R
    LPD3DXSPRITE pSprite,3 t) y6 k+ Q* ~- y; w
# F9 c8 v' {6 Q  T2 ~0 J. ]/ b
    LPCTSTR pString,: D* I- d: C& O
: X% Y8 _' ~, W% F! h) ~
    INT Count,
' j9 q9 j9 Q. o$ g# r. Z+ |. U9 E; U( b+ _6 n
    LPRECT pRect,
. o9 ^  f3 q* n" r; R. d8 @9 S8 w2 i* Y
    DWORD Format,
7 a2 G# k- ^& R( I2 o% x
, k$ q/ j  O, z# f7 C3 [/ D$ ?    D3DCOLOR Color  v+ d8 n9 C5 N

' u) b0 o' T% o  q);) K% [( o. ?7 a1 d7 ~% F
0 u( o2 _! J+ @& S- W7 b0 o

( O, B% }$ B7 `0 \  i; Kl          pSprite –输出目标,为ID3DXSprite对象指针,可以为NULL值,此时字符串输出到默认对象
9 l/ s% F. y: J1 e( f' C% g; F
$ }" f* h. T/ l& p7 m" il          pString –需要输出的字符串* F  L1 y- R5 s; `$ M- i/ q

. x0 ?6 w& U: Q( E/ W  Ml          Count –字符串的字符数,如果为-1,则以0字符为结束标志3 A5 }4 D" ^# X' F) M0 X
$ m) V7 D5 D1 v/ P
l          pRect –绘制字符串的区域
% ^& d" ^2 n0 D$ y6 N# x( d/ v  u+ P
. F( L7 J: C! ?( K4 h' S6 U4 Y/ P0 b3 Xl          Format –文字的输出格式/ H: c! _9 i4 |8 j

- c$ s2 u5 k$ b$ T7 d' [6 H+ zl          Color –文字颜色
8 l8 E+ K$ i( X# v) O: w8 D6 d1 x# K* _
例如,可以这样使用该方法:
5 ?( I' k* ?0 q& I6 F4 S6 P8 X3 O: V, y1 Q
Font->DrawText(NULL,
: Y% t# p0 w& `5 l$ Q2 ^1 j3 u
/ U' a5 u* l% T/ H% \    "Hello World", // String to draw.
  f, v- y+ ]+ U* }4 @- H2 I9 d( j0 V. w7 Q- y  \; Q* [: B$ Y
    -1, // Null terminating string.
, e$ s# J- E% ~* N1 q  B) E) o
5 o" Z' q$ R" P3 ~" H  Q8 [    &rect, // Rectangle to draw the string in., M( |# ]: d2 f4 {
$ Y, K: F* S& K2 Y7 ~0 e% S1 c
    DT_TOP | DT_LEFT, // Draw in top-left corner of rect.) H  v! p8 D9 W; l6 T" j
8 _3 g2 |, i; ]6 U
    0xff000000); // Black.
3 o2 e$ V% Y7 g" D; I* D5 C
* ~3 K+ E! J! L, n8 y) p
* @* Z2 m# w8 L; n. N9.1.3.    计算帧速率, q* E, U1 e# w4 j$ u3 ?, K$ z2 _
帧速率用FPS(Frame per Second)表示。首先声明三个全局变量:, O. J. \) u) m- J% B3 |
' B0 E4 _# T/ y$ H+ M) s! Q( G
DWORD FrameCnt; // The number of frames that have occurred., x8 T) a! x9 n& C: q

. w) T# ~- k3 z4 H6 q) Lfloat TimeElapsed; // The time that has elapsed so far.
4 X( D" V- L( [6 y' M2 K  G" R$ ^; `2 d, b0 w# L
float FPS; // The frames rendered per second.4 r& b  C! J8 \, W: b' W

+ c, O) c6 a$ N7 j/ h; j1 f" T  I* t2 U& u1 H3 i6 R1 f! M$ ^: s5 x
每秒计算一次FPS,这里计算的是平均值。我们也可以有足够的时间去读FPS值,而不至于因FPS的快速变化而产生较大误差。
. v8 V: V2 U7 Z" s0 p  Y
: n1 }  `9 O+ C0 L3 V9 W每渲染一帧,累加一次帧数和所用的时间值:6 W8 J' \1 P+ _& y' U

- Q* h  b3 j! U0 X8 T8 j3 JFrameCnt++;
( E1 }/ G4 j" i4 p! k. K: {
+ D3 j, S  `* C+ J& X3 mTimeElapsed += timeDelta;
: k* m7 |) I5 f% e& }6 H
6 I  m( b4 b# j# P# w
% Q0 C2 G/ y6 \% L- m这里的timeDelta表示两帧间的时间间隔。每过去一秒,就可以使用下面的公式计算FPS了:: ?" }$ C! E0 l9 x# f# G3 |% m0 L" F

, l5 k' \& Q& m/ Z9 e& @, IFPS = (float)FrameCnt / TimeElapsed;
9 n, A- B! k0 M  t% C0 t4 V9 u
  P  C" S$ w* ]/ z; F, b7 f" j2 q( K3 ~: |: a) d
计算完成后,需要将FrameCnt和TimeElapsed重新置0,这样下一次的计算结果才正确:
+ L! D# O9 Z, A) C+ d( J# L  L) T% T6 a5 O/ G) P( r8 H; j* ?
void CalcFPS(float timeDelta)' B; L$ X5 j. z/ b1 g: N2 p) Q

; Q; g) a1 _6 g+ z{
7 u  m& K1 Y# T0 e- r8 @+ L: F& |7 Y
    FrameCnt++;
6 W& [  w9 _) ~1 }9 l
% ?6 M1 j# H& Z0 M6 J: x+ [    TimeElapsed += timeDelta;
, t0 ?3 T: r2 L3 i) _+ W  ]" D* J) K
    if(TimeElapsed >= 1.0f)4 N/ r+ n0 r0 d0 C0 S6 x

6 U& n# x9 M' I- a- Y8 a$ {    {
' R1 N8 x( K2 a, X* R  N+ D  p/ L5 o) b. \' }, t4 H: J
        FPS = (float)FrameCnt / TimeElapsed;6 h$ O8 J$ y- c7 ?" b, y
0 w7 I. k$ n) U. L& Q. m' h8 |0 _
        TimeElapsed = 0.0f;
4 `% w! b# A6 t
# \& z6 W1 a" F$ d/ W        FrameCnt = 0;
5 f8 I3 p; S* U: p. |/ y; x- s* T" L/ j0 e1 J5 R. O
    }
- M, w3 J1 l, I6 J
9 M" z) A2 r/ d7 O; E$ `1 Q0 W}
6 L. ?& T6 Q7 Q( I4 P, }# D 6 }& ]5 Y( P* N. ~

6 e! o/ _1 P9 R6 F5 b9.2. CD3DFont. ~2 s0 o4 z# A1 }: b+ x
在DirectX SDK的安装目录下,提供了很多有用的代码CD3DFont类就位于其中。该类使用纹理三角形和Direct3D渲染文字,而不是通过GDI渲染,所以,其效率高于ID3DXFont。但是,CD3DFont不支持复杂的字体和文本格式,如果只需要高速渲染简单的字体,CD3DFont应是首选。
* g8 {: R: }4 w" e# e# Z
8 h3 v5 F- @9 g使用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版本!, A$ q" y/ w# S7 ^) \
8 [$ s) H+ \" c& N! E
9.2.1.    创建CD3DFont对象% G0 p0 l% M& H
创建CD3DFont的对象,就像创建一个普通的C++对象一样,其构造函数如下:3 g7 v3 Z" F& k7 U

$ Z( @9 z) s$ w+ I+ YCD3DFont(const TCHAR* strFontName, DWORD dwHeight, DWORD dwFlags=0L);
- O  I- H$ N- E% O 5 L+ T: R! N8 I9 `$ P% q8 V

4 [# Q. I" L) w7 S1 F$ f8 |l          strFontName –所使用的字体名称5 C) t: v! g6 k) G
/ H  E' D5 C: t8 f; M* h( \
l          dwHeight –字体高度
9 Z) f+ r. V" O& j1 {+ K2 l# K; x4 f4 \8 d/ S
l          dwFlags –可选的标志,如D3DFONT_BOLD、D3DFONT_ITALIC、D3DFONT_ZENABLE等。$ Z+ m4 F+ E! O8 c  [' G
( s! P: R+ p) C' X" T7 w
得到CD3DFont对象后,还需按顺序进行初始化,如:
$ H9 a& s$ R$ H8 a  a& f! Q' ]8 {4 s3 U* v9 |
Font = new CD3DFont("Times New Roman", 16, 0); // instantiate* D3 Q* ^: u9 `1 O
0 d" @4 D) ~+ A! x8 x
Font->InitDeviceObjects( Device );5 g. \% r5 k# B1 p2 Z& v5 c
3 e% ]; Z+ f0 t) l9 x
Font->RestoreDeviceObjects();, ]0 J  [& y8 Q0 n6 V& ]# _

) ?2 ?: I3 g! {
2 }! O: I+ m8 t- i' }4 R( g, B9.2.2.    绘制文字
* I% q: \3 I8 Z4 @使用CD3DFont对象的如下方法渲染文字:
' r8 }/ s  m9 v/ B+ F1 t2 o0 G& ^6 M1 s2 V% Q
HRESULT CD3DFont::DrawText(FLOAT x, FLOAT y, DWORD dwColor,3 t( ~, J" \+ Z

9 j3 A8 t4 [& {    const TCHAR* strText, DWORD dwFlags=0L);
% x) E6 v( |& M5 T7 z* d 3 j7 U! y: r3 v/ {

' b, B  J; o+ v) zl          x –屏幕的x坐标
9 P( d! c! {0 n: f6 Y  v6 a" [" ~5 T
l          y –屏幕的y坐标$ @8 s* N: ~7 a- L# ]& ?) ^, i

7 d# ]+ Y# V. B0 R/ q+ y' e9 B  ~l          dwColor –文字的颜色- K* d# O2 l6 S& f# x9 N2 y  @
" \% r4 g3 c/ X  _, D
l          strText –要绘制的字符串
9 P: U6 W2 w1 Z4 e) `/ T4 y0 ~' w# v, k$ N
l          dwFlags –可选的渲染标志,可为0或下面的值:D3DFONT_CENTERED、D3DFONT_TWOSIDED、D3DFONT_FILTERED。
$ R# p, v' z, X; P9 X8 H% G# w4 y$ T4 s# n
例如:
5 [* }6 X- r- J" j3 W7 [9 c9 j
+ \- k; a9 R( @Font->DrawText(20, 20, 0xff000000, “Hello, World”);- B3 ?& \4 w: |- O; ^
4 c! i# _- S+ U: @

& S; L  N* T/ k. |( a: ]7 F9.2.3.    资源清除
: [& W- \6 [* l8 E在删除CD3DFont对象前,还需作一些清除的工作:
5 \& f! e* R) m& y8 K( ~
! e7 n8 ^7 ?$ q8 G+ `2 D9 kFont->InvalidateDeviceObjects();
0 L9 K1 V( v! x4 N4 A7 N
& X8 ^6 U* @% t. ?0 A7 s9 yFont->DeleteDeviceObjects();
7 v1 B: O( J1 J6 ~# f; q
  d2 L2 L5 {8 f, Pdelete Font;; [+ E# D6 N  C0 ^& [5 J5 r" @

% A6 e3 l6 ^% ~* V" v$ P+ ]6 Q$ y# f
9.3. 函数D3DXCreateText
/ `% @# C. `7 M$ H8 F该函数用于创建3D文字Mesh,原型如下:
9 J3 s% n5 ]6 y% {7 l% c: |0 z" d/ ~8 Q! `
HRESULT WINAPI D3DXCreateText(
, |% c( K5 Y& n9 D  H: X+ B9 _9 D( n# C, R
    LPDIRECT3DDEVICE9 pDevice,. T1 R2 }* i- z, @, K
2 r1 T, {9 o+ O
    HDC hDC,; M# J) a# O, x

; R6 A0 ?$ J! G+ O7 K    LPCTSTR pText,+ m, A7 \7 Y5 A" ]1 f: r1 x
) I# I) S  C, _# V6 x
    FLOAT Deviation,
( X/ F# U6 p# b4 ]% j' u. p6 b
) Q5 ]: N8 [. I/ |( H2 k& x    FLOAT Extrusion,2 w9 O# w6 s2 X5 \# z
2 r" p$ V+ T; b4 ]5 K$ \( b9 j
    LPD3DXMESH *ppMesh,- p1 r# y" b& t
4 R) {3 ]2 K) S' {( @1 S' _* r
    LPD3DXBUFFER *ppAdjacency,
0 G8 T7 _. u+ Q( A4 f
3 ~( W$ Q' Q: M9 x0 a/ y    LPGLYPHMETRICSFLOAT pGlyphMetrics
: b- J- w2 e* u# l& x& @
+ g$ U6 o% ^- x8 C+ o);
  c! b3 ?6 N! T6 ] - N( r" g) ~& y# r: [% k, i

7 H2 n% p2 R1 Ml          pDevice –D3D设备
5 m3 D6 r3 \$ i  ?" g" r
1 E3 v1 b/ W: ]- Dl          hDC –描述字体的设备上下文句柄
4 V4 q- I: S0 j2 t. D
! F, ?3 s  q; L& zl          pText –要渲染的字符串
3 F. r& ?( L+ O4 S! D1 P9 C
( h! Y$ @. S* O  }l          Deviation –TrueType字体的一个属性,该值不能小于0。如果为0,则使用字体的默认值- r, j) U8 F8 j% z+ Z

/ m, w# j8 N" H& o( j, \l          Extrusion –字体的深度,相对于Z坐标轴
4 q( v, U) z- n$ v8 O
% l) C' I9 f% B) k0 o* w3 p! Wl          ppMesh –返回生成的Mesh对象指针1 |" `: i6 H, H1 ]# H9 R* B# v' F1 P

7 x* Z4 c0 n, W$ S  Ql          ppAdjacency –返回邻接信息。如果不需要该信息,可使用NULL指针
: F% z6 o0 p! r5 L3 n$ V0 s. K+ ^
l          pGlyphMetrics –结构GLYPHMETRICSFLOAT的数组,返回轮廓矩阵数据。如果不需要该数据,可以设该参数为NULL
& k. v' i% W" y8 j! |' A6 \( r- S& {" w6 _) q: F
下面就举例说明如何使用该函数创建3D文字的Mesh对象。. E- U- ~& q- ?% e# \6 b
$ v4 p  \( n8 F% Q/ S
// Obtain a handle to a device context.
/ ]% |' V; i: W& U/ ^6 i' t
5 E( w" P5 [; j8 T! I, NHDC hdc = CreateCompatibleDC( 0 );
9 O# s/ j0 E$ o2 O4 f! q8 j( s5 F8 D4 r) \% r
// Fill out a LOGFONT structure that describes the font’s properties.# R3 @, r. C' C+ R" [8 f
& H" l# ~( m) P1 ]- M3 G, [  h
LOGFONT lf;% F8 _* g8 g) Y$ V7 ^

& T6 O2 k: i7 ]; X' o, f, {ZeroMemory(&lf, sizeof(LOGFONT));+ r1 C/ j7 ^2 w

9 T) q$ D4 k( F* F$ }+ Vlf.lfHeight = 25; // in logical units0 x2 Z0 x! g( P

7 @$ V( u1 q1 U6 V7 N* @lf.lfWidth = 12; // in logical units) z: Q  x+ Y. L9 T

4 A# H. g6 h6 t* C7 Clf.lfWeight = 500; // boldness, range 0(light) - 1000(bold)
7 F7 ^9 d- a) E; J+ Q3 [
5 i7 B) t. Q2 s7 F% O/ D' i6 Alf.lfItalic = false;: ]& p3 S; b- G, i# @' w" T

  ]3 _$ m6 J5 q% G6 W' Xlf.lfUnderline = false;8 Q5 P+ z1 v* n- J
" |% K# P- t* k; Z# ?% L% C% d3 N
lf.lfStrikeOut = false;9 h* j8 B, A8 R
1 Z1 ]  V0 C# F7 D' {- ]
lf.lfCharSet = DEFAULT_CHARSET;
) [8 V! G* p. h9 E. q$ d! Z
1 N8 T# r7 N; q* h$ Nstrcpy(lf.lfFaceName, "Times New Roman"); // font style( Q- J0 o6 `8 |" }) U- T3 r

3 G  ?0 X- q% ?( c% D- y% h// Create a font and select that font with the device context.5 c7 n& o# C- b5 L& O2 e
) p/ j" E8 K+ G- W3 _6 p
HFONT hFont;
5 w/ l0 o# l% W6 z) a7 D( L( i$ N  P) l) j7 |
HFONT hFontOld;
5 ~2 }" r! U! L& O+ j! D4 J/ s- `) \/ ?
hFont = CreateFontIndirect(&lf);
" [. V+ b6 G, j( t# y* r. m+ H$ i# ~  w" j9 N- e- H
hFontOld = (HFONT)SelectObject(hdc, hFont);9 `+ Z3 I( {8 e0 O7 a
7 U4 U% x1 g- B9 J
// Create the 3D mesh of text.( b) O) Y& v( u) r! `8 A

; J2 R! Y: N) {( |) B2 Y2 O& gID3DXMesh* Text = 0;
# j, n) c3 S# |+ {4 a7 B3 @1 Z9 ^' K# Q. k! s3 M8 e4 z3 f
D3DXCreateText(_device, hdc, "Direct3D", 0.001f, 0.4f, &Text, 0, 0);% X2 _5 |2 f; J7 I6 u
# n( c' l! m% R7 \6 S3 B8 V3 v/ V, R
// Reselect the old font, and free resources.4 x& C3 m5 `% q) f9 n

' u3 d. S" {& f% G+ n9 ^SelectObject(hdc, hFontOld);% D2 Z/ B. o  Z$ b" M+ K
$ c' w; @& }4 b$ }0 ]1 z# C; Y
DeleteObject( hFont );8 C$ e- \! [6 T0 {8 I3 G
) i0 x. B6 O+ Q5 Z$ H- M
DeleteDC( hdc );8 n8 m' k: g2 H# j  L/ V

) N8 `) u0 F; x* d
. z, t6 G* P. J) W2 p这时,Mesh对象已经得到了。最后,直接使用DrawSubset方法渲染即可:$ q/ ]5 f/ y" U, k- g6 T

: p9 y6 X! `) M: U, oText->DrawSubset( 0 );
5 H- C8 t, @! A" B0 ^
" C8 D8 Q% f% F" ^( U
2 p+ E4 @- y8 k1 E译者注:上面的例子代码,使用的是较早的DirectX 9.0 SDK,不是Summer 2004版本。4 S, l( u0 t# q+ d5 `/ L

- D; U: ~- O+ B, `9.4. 总结% P9 |7 j8 l* Z# L" Y: L9 E
l          如果需要渲染较复杂的字体和格式,使用ID3DXFont接口会很方便。但是该接口是使用GDI实现的,故效率较低。) h( g% J1 {: u6 W$ b1 e0 d. \

+ E& c2 S" ~' x. vl          CD3DFont类可以快速的渲染简单的字体。该类实用D3D的纹理三角形渲染文字,故速度较ID3DXFont为快。
5 V7 x0 D4 o; [; R' \. R/ M" j4 l% N9 @; f$ R
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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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