本篇将简单整理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:字体权重,即字体的粗细,其枚举以下列宏表示:

 #define FW_DONTCARE 0
#define FW_THIN 100
#define FW_EXTRALIGHT 200
#define FW_LIGHT 300
#define FW_NORMAL 400
#define FW_MEDIUM 500
#define FW_SEMIBOLD 600
#define FW_BOLD 700
#define FW_EXTRABOLD 800
#define FW_HEAVY 900 #define FW_ULTRALIGHT FW_EXTRALIGHT
#define FW_REGULAR FW_NORMAL
#define FW_DEMIBOLD FW_SEMIBOLD
#define FW_ULTRABOLD FW_EXTRABOLD
#define FW_BLACK FW_HEAVY

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

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

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

 #define ANSI_CHARSET 0
#define DEFAULT_CHARSET 1
#define SYMBOL_CHARSET 2
#define SHIFTJIS_CHARSET 128
#define HANGEUL_CHARSET 129
#define HANGUL_CHARSET 129
#define GB2312_CHARSET 134
#define CHINESEBIG5_CHARSET 136
#define OEM_CHARSET 255

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

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

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

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

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

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

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

D3DX10_FONT_DESC结构体填充示例:

 D3DX10_FONT_DESC fontDesc;
fontDesc.Height = ;
fontDesc.Width = ;
fontDesc.Weight = ;
fontDesc.MipLevels = ;
fontDesc.Italic = FALSE;
fontDesc.CharSet = DEFAULT_CHARSET;
fontDesc.OutputPrecision = OUT_DEFAULT_PRECIS;
fontDesc.Quality = DEFAULT_QUALITY;
fontDesc.PitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
strcpy(fontDesc.FaceName, "Times New Roman");

2.获取ID3DX10Font对象的指针

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

 HRESULT D3DX10CreateFontIndirectA(
ID3D10Device* pDevice,
CONST D3DX10_FONT_DESCA* pDesc,
LPD3DX10FONT* ppFont);

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

pDesc:指向D3DX10_FONT_DESC实例的指针。

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

获取ID3DX10Font指针示例:

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

3.显示文本

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

 INT ID3DX10Font::DrawText(
LPD3DX10SPRITE pSprite,
LPCTSTR lpString
INT Count,
LPRECT pRect,
UINT Format,
D3DXCOLOR Color);

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

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

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

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

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

 #define DT_TOP 0x00000000
#define DT_LEFT 0x00000000
#define DT_CENTER 0x00000001
#define DT_RIGHT 0x00000002
#define DT_VCENTER 0x00000004
#define DT_BOTTOM 0x00000008
#define DT_WORDBREAK 0x00000010
#define DT_SINGLELINE 0x00000020
#define DT_EXPANDTABS 0x00000040
#define DT_TABSTOP 0x00000080
#define DT_NOCLIP 0x00000100
#define DT_EXTERNALLEADING 0x00000200
#define DT_CALCRECT 0x00000400
#define DT_NOPREFIX 0x00000800
#define DT_INTERNAL 0x00001000 #if(WINVER >= 0x0400)
#define DT_EDITCONTROL 0x00002000
#define DT_PATH_ELLIPSIS 0x00004000
#define DT_END_ELLIPSIS 0x00008000
#define DT_MODIFYSTRING 0x00010000
#define DT_RTLREADING 0x00020000
#define DT_WORD_ELLIPSIS 0x00040000
#if(WINVER >= 0x0500)
#define DT_NOFULLWIDTHCHARBREAK 0x00080000
#if(_WIN32_WINNT >= 0x0500)
#define DT_HIDEPREFIX 0x00100000
#define DT_PREFIXONLY 0x00200000
#endif /* _WIN32_WINNT >= 0x0500 */
#endif /* WINVER >= 0x0500 */

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

文本输出示例:

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

Direct3D 10学习笔记(三)——文本输出的更多相关文章

  1. Direct3D 10学习笔记(一)——初始化

    本篇将简单整理Direct3D 10的初始化,具体内容参照< Introduction to 3D Game Programming with DirectX 10>(中文版有汤毅翻译的电 ...

  2. Direct3D 10学习笔记(四)——Windows编程

    本篇将简单整理基本的Windows应用程序的实现,并作为创建Direct3D 10应用程序的铺垫.具体内容参照< Introduction to 3D Game Programming with ...

  3. Direct3D 10学习笔记(二)——计时器

    本篇将简单整理Direct3D 10的计时器实现,具体内容参照< Introduction to 3D Game Programming with DirectX 10>(中文版有汤毅翻译 ...

  4. [C语言学习笔记三]格式化输出和输入

    使用 printf 函数来输出,使用 scanf 函数来输入 在 printf 函数中使用变量,需要使用占位符代替. int 型一般存储整数,使用 %d 代替 long long int 型一般存储长 ...

  5. angular学习笔记(三十)-指令(10)-require和controller

    本篇介绍指令的最后两个属性,require和controller 当一个指令需要和父元素指令进行通信的时候,它们就会用到这两个属性,什么意思还是要看栗子: html: <outer‐direct ...

  6. 学习笔记(三)--->《Java 8编程官方参考教程(第9版).pdf》:第十章到十二章学习笔记

    回到顶部 注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法 ...

  7. VSTO学习笔记(三) 开发Office 2010 64位COM加载项

    原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...

  8. ES6学习笔记<三> 生成器函数与yield

    为什么要把这个内容拿出来单独做一篇学习笔记? 生成器函数比较重要,相对不是很容易理解,单独做一篇笔记详细聊一聊生成器函数. 标题为什么是生成器函数与yield? 生成器函数类似其他服务器端语音中的接口 ...

  9. Java IO学习笔记三

    Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...

随机推荐

  1. window内容

    window parent top location.href location.reload location.replace

  2. Lyft押重注于苹果编程语言Swift

    Lyft押重注于苹果编程语言Swift 1年后获得丰厚回报BI中文站 8月22日报道 一年多以前,打车应用Lyft做出重大决定,决心押重注于苹果开发的编程语言Swift,用这种编程语言重写其所有iPh ...

  3. Git 分支

    Git 保存的不是文件的变化或者差异,而是一系列不同时刻的文件快照,某一次的提交指向这处时刻的文件快照,看起来就像每次提交都保存了当时的文件,连续的提交形成一条长链 分支 指向某一个特定的提交,不同的 ...

  4. 如何快速掌握一款新的MCU? (转)

      发布时间:2013-12-15 10:27:51 技术类别:单片机     个人分类:话题思考       任何一款MCU,其基本原理和功能都是大同小异,所不同的只是其外围功能模块的配置及数量.指 ...

  5. μC/OS-Ⅲ系统的中断管理

    一.典型的μC/OS-Ⅲ中断服务程序解析 μC/OS-Ⅲ系统中典型有内核参与中断服务程序示例如下: MyISR:                                             ...

  6. Android下载压缩文件与解压案例

    ackage com.example.jsontest.biz; import java.io.BufferedInputStream; import java.io.BufferedOutputSt ...

  7. 高性能javascript(记录三)

    DOM(文档对象模型)是一个独立的语言,用于操作XML和HTML文档的程序接口(API).在游览器中,主要用来与HTML文档打交道,同样也用在Web程序中获取XML文档,并使用DOM API用来访问文 ...

  8. VS+VAssistX自动添加注释

    在VC6.0里边,C++函数头注释是使用一个宏完成的,VS系列中C#在函数头输入三个反斜杠也会自动生成XML格式的函数头注释. 又懒得在VS2008中写类似于添加函数头的注释,只能依靠一些工具了,今天 ...

  9. 【转】查看java类是从哪个包加载

    Java的类装载器使用的是优先策略,加载类的时候先找到哪个就加载哪个.有时候我们做一个系统,当类库非常庞大的时候,类可能会出现冲突,也就是类路径中存在不同版本的两个相同的类,这往往给调试带来非常大的麻 ...

  10. nginx url重定向

    nginx内部支持url rewrite,内部编译进去了rewrite模块,nginx的rewrite模块类似于apache的rewriterule功能:支持多种规则和正则表达式: 详细介绍如下: N ...