在一个游戏成品中,我们组成游戏界面的不仅仅是图形,还需要的有文字。在我们调试游戏过程中,也需要时刻获取游戏画面FPS桢数,我们需要了解在D3D应用程序中如何绘制文字。

在D3DX库中,为我们提供了一个ID3DXFont接口,我们可以使用这个接口来控制GUI来绘制文字。但我们需要明白的是,我们的文字绘制其实就是一个格式化字体然后平面贴图的原理。

D3D设备先将我们的文字按照适当的格式绘制好,制作成为适当的纹理图片,之后,D3D设备又会默认的设置一些三角带,使之构成一些平面,再将格式化后的文字图片纹理贴在相应的平面上。

原理清楚了之后,我们开始绘制文字的流程。

  1. 首先,创建一个装载FONT字体的结构。
LOGFONT lf;
ZeroMemory( &lf, sizeof( LOGFONT ) );   //清空相应的内存区
lf.lfHeight = 100;  //文字高度
lf.lfWidth = 25;  //单位文字的宽度
lf.lfWeight =  500; //字体权重值
lf.lfItalic = false;   //是否斜体
lf.lfUnderline = false;   //是否带下划线
lf.lfCharSet = DEFAULT_CHARSET;  //使用的字体库
strcpy( lf.lfFaceName, "Times New Roman" ); //字体的风格,当然可以填写“宋体”“华文彩云”之类
  1. 设置好字体的结构后,我们将需要获得一个ID3DXFont指针。
ID3DXFont* font  = 0;
D3DXCreateFontIndirect( D3DDevice, &lf, &font );

其中第一个参数为D3D设备,第二个参数是LOGFONT结构,第三个参数是将要传出的我们需要获得ID3DFONT的指针。

  1. 开始绘制文本 我们使用接口指针去调用现有函数进行绘制文本就可以了

DrawText方法的声明如下

INT DrawText{
  LPCSTR pString,
  INT Count,
  LPRECT pRect,
  DWORD Format,
  D3DCOLOR Color
};
  • pString 指向要绘制的文字
  • Count 字符串中特征字符的数量,当字符串是以null结束时则可将其指定为-1
  • pRect是一个RECT的结构,它定义着一个文字在屏幕上被绘制的范围
  • Format是指定文字如何格式化为纹理贴图,一般使用DT_TOP | DT_LEFT代表从左上开始绘制
  • Color文字绘制的颜色

其实就这样,我们就已经完成了文字在ID3DXFont中的绘制。

我们除了使用ID3DXFont接口来绘制文字外,还可以使用CD3DFont来进行文字的绘制,不过它不是通过GDI进行渲染,它使用D3D代替GDI进行渲染,这将比ID3DXFont快的多,但是CD3DFont无法联合字体句柄来格式化文字。如果我们仅追求速度或仅仅需要一些简单的文字,CD3DFont就足够了

  1. 使用CD3DFont我们首先需要实例化它的一个对象,用这个对象来调用相关的方法。

Font = new CD3DFont( "宋体", 32, 0 );

其中,第一个参数是字体的风格,第二个参数是字体的高度,第三个参数设置为0则代表普通字体,还有可选项为D3DFONT_BLOD,D3DFONT_ITALIC,D3DFONT_ZENABLE分别代表粗体,斜体,下划线格式的字体。

  1. 在我们获得了字体对象后,我们需要对其进行初始化。
Font->InitDeviceObjects( D3DDevice );
Font->RestoreDeviceObjects();
  1. 绘制文字

依旧是DrawText方法,参数依次是文字绘制起始点x坐标,y坐标,文字颜色,要绘制的文字,以及可选风格参数(一般为0则可)。

Font->DrawText( 100, 100, 0xff000000, "Duzhi", 0 );

  1. 释放销毁对象 在销毁对象之前,我们需要和初始化一样先注销一些程序
Font->InvalidateDeviceObjects();
Font->DeleteDeviceObjects();
delete Font;

恩,上面两个方法都是进行2D文字渲染的,而3D立体文字网格的渲染,则需要增加使用D3DXCreateText函数来进行创建,这个并不常用,某志也很困了,所以就不说了,有兴趣的朋友可以从DX自带的案例中看下相关代码,非常简单。呵呵,休息了~~安安。