码迷,mamicode.com
首页 > 其他好文 > 详细

Direct3D 10学习笔记(三)——文本输出

时间:2015-01-25 15:14:53      阅读:320      评论:0      收藏:0      [点我收藏+]

标签:

本篇将简单整理Direct3D 10的文本输出的实现,具体内容参照《 Introduction to 3D Game Programming with DirectX 10》(中文版有汤毅翻译的电子书《DirectX 10 3D游戏编程入门》)。

 

1.填充D3DX10_FONT_DESC结构体

 

D3DX库提供了用于显示文本的ID3DX10Font接口。而要获取一个指向ID3DX10Font对象的指针,需要先填充一个D3DX10_FONT_DESC结构体,该结构体用于描述所创建的字体特征。该结构体定义如下:

 

typedef struct D3DXFONT_DESC
{
    INT   Height;
    UINT  Width;
    UINT  Weight;
    UINT  MipLevels;
    BOOL  Italic;
    BYTE  CharSet;
    BYTE  OutputPrecision;
    BYTE  Quality;
    BYTE  PitchAndFamily;
    TCHAR FaceName;
}D3DXFONT_DESC, *LPD3DXFONT_DESC;

 

Height:字体高度。

 

Width:字体宽度。

 

Weight:字体权重,即字体的粗细,其枚举以下列宏表示:

 1 #define FW_DONTCARE 0
 2 #define FW_THIN 100
 3 #define FW_EXTRALIGHT 200
 4 #define FW_LIGHT 300
 5 #define FW_NORMAL 400
 6 #define FW_MEDIUM 500
 7 #define FW_SEMIBOLD 600
 8 #define FW_BOLD 700
 9 #define FW_EXTRABOLD 800
10 #define FW_HEAVY 900
11 
12 #define FW_ULTRALIGHT    FW_EXTRALIGHT
13 #define FW_REGULAR    FW_NORMAL
14 #define FW_DEMIBOLD    FW_SEMIBOLD
15 #define FW_ULTRABOLD    FW_EXTRABOLD
16 #define FW_BLACK    FW_HEAVY

 

MipLevels:过滤属性。当取值为0或者D3DX_DEFAULT时,创建完全Mipmap链。当取值为1时,将纹理空间映射到屏幕空间。

 

Italic:斜体字。当取值为TRUE时,将字体设置为斜体。

 

CharSet:指定字符集。通常设置为DEFAULT_CHARSET,表示使用默认字符集,其枚举以下列宏表示:

1 #define ANSI_CHARSET 0
2 #define DEFAULT_CHARSET 1
3 #define SYMBOL_CHARSET 2
4 #define SHIFTJIS_CHARSET 128
5 #define HANGEUL_CHARSET 129
6 #define HANGUL_CHARSET 129
7 #define GB2312_CHARSET 134
8 #define CHINESEBIG5_CHARSET 136
9 #define OEM_CHARSET 255

 

OutputPrecision:文本输出精度。指定Windows如何把指定的字体大小和实际的字体相配。通常设置为OUT_DEFAULT_PRECIS,其枚举以下列宏表示:

 1 #define OUT_DEFAULT_PRECIS 0
 2 #define OUT_STRING_PRECIS 1
 3 #define OUT_CHARACTER_PRECIS 2
 4 #define OUT_STROKE_PRECIS 3
 5 #define OUT_TT_PRECIS 4
 6 #define OUT_DEVICE_PRECIS 5
 7 #define OUT_RASTER_PRECIS 6
 8 #define OUT_TT_ONLY_PRECIS 7
 9 #define OUT_OUTLINE_PRECIS 8
10 #define OUT_SCREEN_OUTLINE_PRECIS 9
11 #define OUT_PS_ONLY_PRECIS 10

 

Quality:字符输出质量。通常设置为DEFAULT_QUALITY,其枚举以下列宏表示:

 1 #define DEFAULT_QUALITY 0
 2 #define DRAFT_QUALITY 1
 3 #define PROOF_QUALITY 2
 4 #if(WINVER >= 0x0400)
 5 #define NONANTIALIASED_QUALITY 3
 6 #define ANTIALIASED_QUALITY 4
 7 #endif /* WINVER >= 0x0400 */
 8 
 9 #if (_WIN32_WINNT >= _WIN32_WINNT_WINXP)
10 #define CLEARTYPE_QUALITY 5
11 #define CLEARTYPE_NATURAL_QUALITY 6
12 #endif

 

PitchAndFamily:指定字体间距及字体族。低二位指定字体的字符间距,四位指定字体族,它们分别可取下列值,并用位或符连接:

1 #define DEFAULT_PITCH 0
2 #define FIXED_PITCH 1
3 #define VARIABLE_PITCH 2
1 #define FF_DONTCARE (0<<4)
2 #define FF_ROMAN (1<<4)
3 #define FF_SWISS (2<<4)                            
4 #define FF_MODERN (3<<4)
5 #define FF_SCRIPT (4<<4)
6 #define FF_DECORATIVE (5<<4)

 

FaceName:指定字体名称的字符串。类型为TCHAR,即当没有定义_UNICODE宏时,TCHAR = char;当定义了_UNICODE宏时,TCHAR = wchar_t。中文游戏开发使用宽字符类型。若在Visual Studio下使用,可以在项目属性中将字符集改为多字节字符集,这样便能直接使用strcpy等函数,而不必使用对应于宽字符的wcscpy等函数以及使用L""进行包裹的字符串。

 

D3DX10_FONT_DESC结构体填充示例:

 1 D3DX10_FONT_DESC fontDesc;
 2 fontDesc.Height = 24;
 3 fontDesc.Width = 0;
 4 fontDesc.Weight = 0;
 5 fontDesc.MipLevels = 1;
 6 fontDesc.Italic = FALSE;
 7 fontDesc.CharSet = DEFAULT_CHARSET;
 8 fontDesc.OutputPrecision = OUT_DEFAULT_PRECIS;
 9 fontDesc.Quality = DEFAULT_QUALITY;
10 fontDesc.PitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
11 strcpy(fontDesc.FaceName, "Times New Roman");

 

2.获取ID3DX10Font对象的指针

 

使用D3DX10CreateFontIndirect函数获取ID3DX10Font对象的指针。该函数如下:

1 HRESULT D3DX10CreateFontIndirectA( 
2     ID3D10Device* pDevice,  
3     CONST D3DX10_FONT_DESCA* pDesc, 
4     LPD3DX10FONT* ppFont);

 

pDevice:指向一个有效的ID3D10Device对象的指针。

 

pDesc:指向D3DX10_FONT_DESC实例的指针。

 

ppFont:用于返回创建后的字体对象的指针。

 

获取ID3DX10Font指针示例:

1 ID3DX10Font* pFont;
2 D3DX10CreateFontIndirect(pd3dDevice, &fontDesc, &pFont);

 

3.显示文本

 

使用ID3DX10Font::DrawText方法,其原型如下:

1 INT ID3DX10Font::DrawText(
2     LPD3DX10SPRITE pSprite,
3     LPCTSTR lpString
4     INT Count,
5     LPRECT pRect,
6     UINT Format,
7     D3DXCOLOR Color);

 

pSprite:一个指向ID3DX10Sprite接口的指针。该参数可设为空值,但当每帧绘制的文本数量较多时,更高效的做法是提供自己的sprite接口。

 

pString:所要绘制的字符串的指针。

 

Count:字符串中的字符数量。当字符串以空字符(\0)结尾时,该参数可设为−1。

 

pRect:一个指向RECT结构体的指针,该结构体定义了文本相对于窗口客户区的绘制区域。

 

Format:绘制文字的格式。其可用格式用下列宏表示:

 1 #define DT_TOP 0x00000000
 2 #define DT_LEFT 0x00000000
 3 #define DT_CENTER 0x00000001
 4 #define DT_RIGHT 0x00000002
 5 #define DT_VCENTER 0x00000004
 6 #define DT_BOTTOM 0x00000008
 7 #define DT_WORDBREAK 0x00000010
 8 #define DT_SINGLELINE 0x00000020
 9 #define DT_EXPANDTABS 0x00000040
10 #define DT_TABSTOP 0x00000080
11 #define DT_NOCLIP 0x00000100
12 #define DT_EXTERNALLEADING 0x00000200
13 #define DT_CALCRECT 0x00000400
14 #define DT_NOPREFIX 0x00000800
15 #define DT_INTERNAL 0x00001000
16 
17 #if(WINVER >= 0x0400)
18 #define DT_EDITCONTROL 0x00002000
19 #define DT_PATH_ELLIPSIS 0x00004000
20 #define DT_END_ELLIPSIS 0x00008000
21 #define DT_MODIFYSTRING 0x00010000
22 #define DT_RTLREADING 0x00020000
23 #define DT_WORD_ELLIPSIS 0x00040000
24 #if(WINVER >= 0x0500)
25 #define DT_NOFULLWIDTHCHARBREAK 0x00080000
26 #if(_WIN32_WINNT >= 0x0500)
27 #define DT_HIDEPREFIX 0x00100000
28 #define DT_PREFIXONLY 0x00200000
29 #endif /* _WIN32_WINNT >= 0x0500 */
30 #endif /* WINVER >= 0x0500 */

 

Color:文本颜色。使用D3DXCOLOR结构体表示颜色,包含4个浮点数成员,分别描述颜色的红、绿、蓝和透明度分量。

 

文本输出示例:

1 const D3DXCOLOR BLACK(0.0f, 0.0f, 0.0f, 1.0f);
2 RECT R = { 5, 5, 0, 0 };
3 pFont->DrawText(0, "Hello, Direct3D!", -1, &R, DT_NOCLIP, BLACK);

 

Direct3D 10学习笔记(三)——文本输出

标签:

原文地址:http://www.cnblogs.com/taixihuase/p/4248168.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!