Direct3D中的字体
1. 在游戏中,我们常常要向用户显示一些文字信息。Direct3D有3中生成和输出文本的方式。本章学习目标如下:
1) 了解如何用ID3DXFont接口绘制文本;
2) 了解如何使用CD3DFont类绘制文本;
3) 了解如何计算应用程序每秒所绘制的帧数;
4) 了解如何用D3DXCreateText函数创建并绘制3D文本;
2. ID3DXFont接口
1)创建接口对象
运用D3DXCreateFontIndirect函数创建一个ID3DXFont接口对象。在创建之前,需要填充一个D3DXFONT _DESC的一个结构。这个结构中包含了您要创建的字体一些描述信息,包括高度,宽度等。
2)绘制文本
一旦获取了D3DXFont接口对象的指针,只需调用ID3DXFont::DrawText即可完成文本绘制。函数原型如下:
//
INT ID3DXFont::DrawText(
LPD3DXSPRITE pSprite, //指定字符串所属的ID3DXSprite对象接口
//可设为默认0或者NULL,表示在当前窗口中绘制字符串
LPCSTR pString, //指定将要绘制的字符串的指针
INT Count, //字符串中字符个数,若该值为-1,则认为pString指向一个以NULL结尾的字符串
LPRECT pRect, //指定字符串绘制的矩形区域的位置
DWORD Format, //指定字符串在矩形区域格式化方法
D3DCOLOR Color //文本颜色
);
3)计算每秒绘制的帧数
下面详细讲解如何计算程序每秒绘制帧数FPS。如下:
//
// 1.首先初始化3个全局变量
DWORD FrameCnt = 0;
float TimeElapsed = 0;
float FPS = 0;
// 2.计算FPS函数如下
void CalcFPS(float timeDelta) //timeDelta为相邻帧之间的时间差
{
FrameCnt++;
TimeElapsed += timeDelta;
if(TimeElapsed >= 1.0f)
{
FPS = (float)FrameCnt/TimeElapsed;
TimeElapsed = 0 ;
FrameCnt = 0;
}
}
3. CD3DFont类
CD3DFont也用于绘制文本,但是CD3DFont绘制文本时借助的是Direct3D而非GDI,所以其绘制速度比ID3DXFont要快得多。但是该类也有缺陷,CD3DFont不能支持那些复杂的字体和格式。使用者可以视具体情况选择使用。
1)创建CD3DFont类
创建CD3DFont类,只需要像普通C++对象那样进行实例化即可。该类的构造函数原型如下:
CD3DFont(const TCHAR * strFontName, //一个以NULL结尾的字符串,指定字体的名称
DWORD dwHeight, //字体高度
DWORD dwFlags = 0L //创建标记,可选。可设为0或者以下标记的组合
//D3DFONT_BOLD, D3DFONT_ITALIC, D3DFONT_ZENABLE
);
创建好该类对象之后,需要初始化,如下:
Font = new CD3DFont("Times New Roman", 16, 0);
Font->InitDeviceObject(Device);
Font->RestoreDeviceObject();
2)绘制文本
创建并且初始化之后,就可以用函数CD3DFont::DrawText绘制文本了。
3)清理工作
在删除一个CD3DFont类对象之前,需要调用一些清理函数,如下面代码段所示:
Font->InvalidateDeviceObject();
Font->DeleteDeviceObject();
delete Font;
4. D3DXCreateText函数
该函数用于创建文本的3D网格。该函数原型如下:
HRESULT D3DXCreateText(
LPDIRECT3DDEVICE9 pDevice, //指向于网格相关的设备
HDC hDc, //设备环境句柄
LPCTSTR pText, //指向文本的指针
FLOAT Deviation, //TrueType字体轮廓的最大弦偏差
FLOAT Extrusion, //沿Z轴负方向度量的字体深度
LPD3DXMESH * ppMesh, //返回所创建的网格
LPD3DXBUFFER * ppAdjacency, //返回所创建的网格临接信息,如果不需要,指定为NULL
LPGLYPHMETRICSFLOAT pGlyphMetrics
);
5. 示例
下面示例显示了创建文本的3D网格的代码。
HDC hdc = CreateCompatibleDC(0);
HFONT hFont;
HFONT hFontOld;
//填充LONFONT结构描述要创建字体的信息
LONFONT lf;
ZeroMemory(&lf, sizeof(LOGFONT));
lf.lfHeight = 25; // in logical units
lf.lfWidth = 12; // in logical units
lf.lfEscapement = 0;
lf.lfOrientation = 0;
lf.lfWeight = 500; // boldness, range 0(light) - 1000(bold)
lf.lfItalic = false;
lf.lfUnderline = false;
lf.lfStrikeOut = false;
lf.lfCharSet = DEFAULT_CHARSET;
lf.lfOutPrecision = 0;
lf.lfClipPrecision = 0;
lf.lfQuality = 0;
strcpy(lf.lfFaceName, "Times New Roman"); // font style
//创建ID3DXFont接口对象
hFont = CreateFontIndirect(&lf);
hFontOld = (HFONT)SelectObject(hdc, hFont);
//创建文本的3D网格
D3DXCreateText(Device, hdc, "Direct3D", 0.001f, 0.4f, &Text, 0, 0);
//释放资源
SelectObject(hdc, hFontOld);
DeleteObject(hFont);
DeleteDC(hdc);
Text->DrawSubset(0);
本章完
————Josh 2012年11月6日