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

时间:2022-09-03 09:01:42

本篇将简单整理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. &lbrack;C语言学习笔记三&rsqb;格式化输出和输入

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

  5. angular学习笔记&lpar;三十&rpar;-指令&lpar;10&rpar;-require和controller

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

  6. 学习笔记&lpar;三&rpar;---&gt&semi;《Java 8编程官方参考教程(第9版)&period;pdf》&colon;第十章到十二章学习笔记

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

  7. VSTO学习笔记&lpar;三&rpar; 开发Office 2010 64位COM加载项

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

  8. ES6学习笔记&lt&semi;三&gt&semi; 生成器函数与yield

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

  9. Java IO学习笔记三

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

随机推荐

  1. MAT Memory Analyzer Tool 插件安装&lpar;图解&rpar;

    MAT Memory Analyzer Tool 插件安装(图解) 原文地址 @author YHC 前段时间做了一个项目,Exception in thread "main" j ...

  2. 【转】读取android根目录下的文件或文件夹

    原文网址:http://my.oschina.net/Ccx371161810/blog/287823 读取android根目录下的文件或文件夹 SDK的操作 读取android根目录下的文件或文件夹 ...

  3. 【English】十一、一般疑问句

    一.一般疑问句定义 参考:英语语法中的一般疑问句和特殊疑问句的区别   英语一般疑问句句型结构 能用yes / no(或相当于yes / no)回答的问句. 二.一般疑问句的句子结构,三种 be动词: ...

  4. js 单行注释

    不可以: var a = 1;//这是注释 应当: var a = 1; //这是注释 1

  5. scrapy之日志等级

    scrapy之日志等级 在settings.py中配置如下项: LOG_LEVEL = 'ERROR' # 当LOG_LEVEL设置为ERROR时,在进行日志打印时,只是打印ERROR级别的日志 这样 ...

  6. docker overlay

    http://blog.csdn.net/jiangshouzhuang/article/details/52822125

  7. Socket网络编程--聊天程序&lpar;3&rpar;

    上一小节,已经讲到可以每个人多说话,而且还没有限制,简单的来说,我们已经完成了聊天的功能了,那么接下来我们要实现什么功能呢?一个聊天程序至少应该支持一对多的通讯吧,接下来就实现多个客户端往服务器发送数 ...

  8. day15&lpar;mysql 的多表查询,事务&rpar;

    mysql之多表查询 1.合并结果集 作用:合并结果集就是把两个select语句查询的结果连接到一起! /*创建表t1*/ CREATE TABLE t1( a INT PRIMARY KEY , b ...

  9. CentOS oracle Client客户端安装

    CentOS客户端安装方法如下: 1.安装客户端 rpm -ivh /当前目录/oracle-instantclient12.1-basic-12.1.0.2.0-1.x86_64.rpm rpm - ...

  10. 删除 mac 垃圾桶内清除不掉的文件

    命令行 内 $ sudo rm -rf ~/.Trash/