在游戏中,我们要向用户显示一些文本信息。而在Direct3D中生成和输出文本有3种形式。
一、ID3DFont接口
D3DX库提供接口ID3DXFont,该接口用于在DIrect3D应用程序中绘制文本。该接口内部使用GDI(图形设备接口)来绘制文本,因此该接口在性能上略有损失。但是可以处理一些复杂的字体和格式。
1.我们用D3DXCreateFontIndirect函数来创建一个ID3DXFont接口对象。为了对我们想要创建的字体进行描叙,必须先填充D3DXFONT_DESC结构。
2.一旦获取了ID3DXFont接口的指针,只需调用方法ID3DXFont::DrawText即可轻而易举地完成文本的绘制。
3.接着使用ID3DXFont和CFont计算并显示程序每秒绘制的帧数。
首先实例化3个全局变量:
DWORD FrameCnt = 0;
float TimeElapsed = 0;
float FPS= 0;
接下来我们每秒计算一次FPS,从而得到一个较准确的均值。此外该程序可将每秒得到的FPS均值在窗口中的显示保持一秒,保证了在该均值改变之前我们有足够的时间对其进行读取。所以,每当一帧绘制成功,我们对变量FrameCnt进行自增,并为变量TimeElapse增加一帧绘制结束时计算所经过的时间timeDelta。每一秒过后,我们可用如下公式计算出FPS:
FPS= (float)FrameCnt / TimeElapsed;
然后,我们再重设变量FrameCnt和TimeElapse,准备计算下一秒的FPS均值。
二、CD3DFont
CD3DFont类绘制文本时使用的是Direct3D而非GDI,所以其绘制的速度比ID3DXFont要快的多。但不支持ID3DFont所支持的那些复杂的字体和格式。
1.要想创建CD3DFont类的实例,我们只需要像普通C++对象那样进行实例化即可。当我们实例化一个CD3DFont类的对象后,必须调用如下方法对字体进行初始化:
Font = new CD3DFont("Times New Roman", 16, 0);
Font -> InitDeviceObject(Device);
Font -> RestoreDeviceObjects();
2.既然我们已经创建了一个CD3DFont对象并对其进行了初始化,现在我们可以绘制一些文本了。可用如下函数实现文本的绘制:
HRESULT CD3DFont::DrawText(FLOAT x, FLOAT y, DWORD dwColor, const TCHAR * strText, DWORD dwFlags=0)
3.在删除一个CD3DFont类的对象之前,我们必须首先调用一些清理函数,如下:
Font ->InvalidateDeviceObjects();
Font ->DeleteDeviceObjects();
delete Font;
三、D3DXCreateText函数
该函数用于创建文本的3D网格。该函数的原型为:
HRESULT D3DXCreateText(
LPDIRECT3DDEVICE9 pDevice,
HDC hDc,
LPCTSTR pText,
FLOAT Deviation,
FLOAT Extrusion,
LPD3DXMESH * ppMesh,
LPD3DXBUFFER *ppAdjacency,
LPGLYPHMETRICSFLOAT pGlyphMetrics);
如果调用成功,该函数返回D3D_OK。
接下来仅需调用网格的DrawSubset方法,就可以绘制出3D文本网格。