Directx字体

在游戏中,我们要向用户显示一些文本信息。而在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文本网格。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值