首页 > 代码库 > Direct3D 10学习笔记(三)——文本输出

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

本篇将简单整理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 80010 #define FW_HEAVY 90011 12 #define FW_ULTRALIGHT    FW_EXTRALIGHT13 #define FW_REGULAR    FW_NORMAL14 #define FW_DEMIBOLD    FW_SEMIBOLD15 #define FW_ULTRABOLD    FW_EXTRABOLD16 #define FW_BLACK    FW_HEAVY

 

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

 

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

 

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

1 #define ANSI_CHARSET 02 #define DEFAULT_CHARSET 13 #define SYMBOL_CHARSET 24 #define SHIFTJIS_CHARSET 1285 #define HANGEUL_CHARSET 1296 #define HANGUL_CHARSET 1297 #define GB2312_CHARSET 1348 #define CHINESEBIG5_CHARSET 1369 #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 810 #define OUT_SCREEN_OUTLINE_PRECIS 911 #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 511 #define CLEARTYPE_NATURAL_QUALITY 612 #endif

 

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

1 #define DEFAULT_PITCH 02 #define FIXED_PITCH 13 #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 lpString4     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 0x0000004010 #define DT_TABSTOP 0x0000008011 #define DT_NOCLIP 0x0000010012 #define DT_EXTERNALLEADING 0x0000020013 #define DT_CALCRECT 0x0000040014 #define DT_NOPREFIX 0x0000080015 #define DT_INTERNAL 0x0000100016 17 #if(WINVER >= 0x0400)18 #define DT_EDITCONTROL 0x0000200019 #define DT_PATH_ELLIPSIS 0x0000400020 #define DT_END_ELLIPSIS 0x0000800021 #define DT_MODIFYSTRING 0x0001000022 #define DT_RTLREADING 0x0002000023 #define DT_WORD_ELLIPSIS 0x0004000024 #if(WINVER >= 0x0500)25 #define DT_NOFULLWIDTHCHARBREAK 0x0008000026 #if(_WIN32_WINNT >= 0x0500)27 #define DT_HIDEPREFIX 0x0010000028 #define DT_PREFIXONLY 0x0020000029 #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学习笔记(三)——文本输出