ID3DXFont
ID3DXFont在绘制文字的时候使用的是GDI的API,DXUT提供了一个东西叫做CDXUTTextHelper,它封装了需要的ID3DXFont以及Sprite,并提高了工作效率。那就是它在内存中开辟了一块纹理,将绘制过的文字绘制在这上面,以后再次遇到这个字的时候就直接当做普通纹理处理了。这样做的代价就是内存的开销变大。
1. 创建一个ID3DXFont接口
HRESULT D3DXCreateFontIndirect(
__in LPDIRECT3DDEVICE9 pDevice,
__in const D3DXFONT_DESC *pDesc,
__out LPD3DXFONT *ppFont
);
字体结构:
typedef struct D3DXFONT_DESC {
INT Height;//Height, in logical units,指的是字体的高度,
UINT Width;//Width, in logical units
UINT Weight;//Weight of the font in the range from 0 through 1000.
UINT MipLevels;//文本的Miplevels
BOOL Italic;//是否斜体
BYTE CharSet;//字符集
BYTE OutputPrecision;// 指定Windows与期望字体大小的匹配方法
BYTE Quality;//输出质量
BYTE PitchAndFamily;//斜度和family索引
TCHAR FaceName;//字体类型名称
} D3DXFONT_DESC, *LPD3DXFONT_DESC;
例:填充字体结构
D3DXFONT_DESC font;
memset(&font,0,sizeof(font));
font.Height =22;
font.Width = 12;
font.Weight = 500;
font.Italic = FALSE;
font.MipLevels = 0;
font.OutputPrecision = OUT_DEFAULT_PRECIS;
font.PitchAndFamily = DEFAULT_PITCH;
font.Quality = DEFAULT_QUALITY;
font.CharSet = DEFAULT_CHARSET;
strcpy(font.FaceName,"Times New Roman");
ID3DXFont * pFont=0;
D3DXCreateFontIndirect(Device,&font,&pFont);
绘制文本:
使用ID3DXFONT::DrawText()函数
INT DrawText(
[in] LPD3DXSPRITE pSprite,//用来绘制文字的sprite对象
[in] LPCTSTR pString,//指向字符串的指针
[in] INT Count,//字数.假如字符是以null结束的字符串则可将其指定为-1
[in] LPRECT pRect,//指向一个RECT结构,它定义一个文字被绘制在屏幕上的范围。
[in] DWORD Format,//可选参数,指定文字怎样被格式化,具体可以查sdk文档
[in] D3DCOLOR Color//文字的颜色
);
RECT rect;
rect.bottom=200;
rect.right = 200;
rect.left =0;
rect.top=0;
pFont->DrawText(NULL,TEXT("xfate"),-1,&rect,DT_LEFT,0xffffffff);
计算每秒的渲染帧数:
void CalsFPS()
{
//每一帧增加FrameCnt并且把从上一帧到现在流逝的时间写进TimeElapsed
FrameCnt++;
timeElapsed +=timeDelta;//imeDelta 是两帧之间的时间
if(timeElapsed >=1.0f)
{
FPS =(float)FrameCnt/timeElapsed;//在一秒种结束以后,用下面的公式来计算FPS:
timeElapsed =0.0f;//重新设置FrameCnt和TimeElapsed为计算下一秒的FPS做准备
FrameCnt =0;
}
}
注意:在的新的DX SDK中,已经没有CD3DFront类了。
使用CD3DFront类
使用 CD3DFont 类,你需要添加下列文件到你的程序中:d3dfont.h, d3dfont.cpp, d3dutil.h,
d3dutil.cpp, dxutil.h 和dxutil.cpp。这些文件可以在刚才所说目录下的 Include 和 Src 目录下。
CD3DFont(const TCHAR* strFontName, DWORD dwHeight, DWORD dwFlags=0L);
strFontName — 以 null结束的字符串,它指定字体类型。
dwHeight — 字体的高度。
dwFlags — 可选参数;你能设置该参数为 0 或者用下面参数;D3DFONT_B
D3DFONT_ITALIC, D3DFONT_ZENABLE。
实例化一个CD3DFont对象以后,我们必须调用下面的方法来初始化字体:
Font = new CD3DFont("Times New Roman", 16, 0); // instantiate
Font->InitDeviceObjects( Device );
Font->RestoreDeviceObjects();
绘制文本
HRESULT CD3DFont::DrawText(FLOAT x, FLOAT y, DWORD dwColor,
const TCHAR* strText, DWORD dwFlags=0L);
x — 文字在屏幕上开始绘制的 x坐标。
y —文字在屏幕上开始绘制的 y坐标。
dwColor — 文字的颜色。
strText — 要绘制的文字。
dwFlags — 可选参数;你能设置该参数为 0 或者用下面参数;D3DFONT_CENTERED,
D3DFONT_TWOSIDED, D3DFONT_FILTERED。
清除
在删除一个CD3DFont对象之前,我们必须首先调用一些清除程序,就象下面列举的代码片段:
Font->InvalidateDeviceObjects();
Font->DeleteDeviceObjects();
delete Font;
D3DXCreateText :创建3D文字网格
HRESULT D3DXCreateText(
__in LPDIRECT3DDEVICE9 pDevice,//和mesh关联的device。
__in HDC hDC,//我们将要用来产生mesh的包含描述字体的设备环境句柄。
__in LPCTSTR pText,//指向以null结束的字符串的指针
__in FLOAT Deviation,//字型轮廓段数间距。该值必须大于等于0。当它为0时,段数等于字体原始设计单位(该值越接近0,那么字体就越光滑)。
__in FLOAT Extrusion,//文字在z轴方向的深度。
__out LPD3DXMESH *ppMesh,//返回创建的mesh。
__out LPD3DXBUFFER *ppAdjacency,//返回创建mesh的相关信息。假如你不需要它可以将其指定为null。
__out LPGLYPHMETRICSFLOAT pGlyphMetrics//一个指LPGLYPHMETRICSFLOAT 结构数组的指针,它包含了字型米数据。假如你不关心此数据,你可以把它设置为0。
);
例子:
//
// Get a handle to a device context.
//
HDC hdc = CreateCompatibleDC( 0 );
HFONT hFont;
HFONT hFontOld;
//
// Describe the font we want.
//
LOGFONT 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;
lf.lfPitchAndFamily = 0;
strcpy(lf.lfFaceName, "Times New Roman"); // font style
//
// Create the font and select it with the device context.
//
hFont = CreateFontIndirect(&lf);
hFontOld = (HFONT)SelectObject(hdc, hFont);
//
// Create the text mesh based on the selected font in the HDC.
//
D3DXCreateText(Device, hdc, "Xfatenet",
0.001f, 0.4f, &Text, 0, 0);
//
// Restore the old font and free the acquired HDC.
//
SelectObject(hdc, hFontOld);
DeleteObject( hFont );
DeleteDC( hdc );