标签:
本篇将简单整理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);
标签:
原文地址:http://www.cnblogs.com/taixihuase/p/4248168.html