D3D9 Samples(10)--Text3D
打开Text3D项目。先编译运行下项目,看看效果:
这个例子演示各种字体的绘制,包括2D文字和3D立体文字。
1. 基本绘制
ID3DXFont* g_pStatsFont =NULL;
绘制上方黄色的两行字,显示:
在OnCreateDevice中创建字体D3DXCreateFont。
在OnResetDevice、OnLostDevice、OnDestroyDevice中响应Device状态的变化。
在OnFrameRender中绘制:
SetRect( &rc, 2, 0, 0, 0 );
g_pStatsFont->DrawText(NULL,DXUTGetFrameStats(DXUTIsVsyncEnabled() ), -1, &rc,DT_NOCLIP,
D3DXCOLOR( 1.0f, 1.0f, 0.0f, 1.0f ) );
SetRect( &rc, 2, 15, 0, 0 );
g_pStatsFont->DrawText(NULL,DXUTGetDeviceStats(), -1, &rc,DT_NOCLIP,
D3DXCOLOR( 1.0f, 1.0f, 0.0f, 1.0f ) );
下面看下ID3DXFont::DrawText 函数:
INT DrawText(
[in] LPD3DXSPRITE pSprite,
[in] LPCTSTR pString,
[in] INT Count,
[in] LPRECT pRect,
[in] DWORD Format,
[in] D3DCOLOR Color
);
pSprite指向ID3DXSprite接口,可以使用程序提供的,如下面的g_pFont2。也可以用自己内部的sprite对象(如果pSprite被赋值NULL)。
pString指向需要绘制的文字字符串。
Count上面字符串的字符个数。如果此值为-1,那么上面的pString必须指向一个以零结尾(\0)的字符串,这样DrawText可以计算出字符串的长度。
pRect绘制区域。
Format表明绘制格式。比如向左对齐,居中等。
Color指定文字的颜色。这个参数类型实际上是DWORD,来存放alpha、red、green、blue四个颜色值,每个值占8个字节。
2. 修改字体
ID3DXFont* g_pFont =NULL;
绘制中间红色的那行字:
可以通过
修改它的字体。
相比上面的g_pStatsFont,这里增加了修改字体的功能,实现代码在“Change Font”按钮的响应处:
OnGUIEvent
case IDC_CHANGEFONT:
这里调用一个Windows API ChooseFont,弹出选择字体标准对话框。
确认选择后通过D3DXCreateFont创建一个新的字体给g_pFont。
3. 三维字体
ID3DXMesh* g_pMesh3DText =NULL;
这里是D3DX提供的一个Mesh接口,管理网格模型。
1. 创建字体网格
CreateD3DXTextMesh
A. CreateCompatibleDC 创建一个和当前程序所在屏幕兼容的内存DC(device context)。
B. CreateFont 创建一个字体。
C. SelectObject为A中创建的hdc选择一个对象(即上面的字体对象)。并用hFontOld保存原先的对象
D. D3DXCreateText用上面的hdc创建D3D的文字网格ID3DXMesh对象。
E. SelectObject再用原先的hFontOld替换上面创建的字体对象hFont。
F. 删除对象和DC
这样就创建了一个字体网格对象。
4. 使用精灵对象绘制文字
ID3DXFont* g_pFont2 =NULL;
绘制上方粉红色的几行字以及下方白色的那几行字:
这个字体对象是演示使用程序创建的精灵对象来绘制文字。
ID3DXSprite* g_pTextSprite =NULL; // Sprite for batching draw text calls
从这个对象的方法中可以看到,实际上是封装了一个2D绘制矩形的接口,简化了直接使用vertex buffer的步骤。
在OnCreateDevice中D3DXCreateSprite创建精灵对象。
在OnFrameRender中绘制:
文字需要在ID3DXSprite的Begin和End之间绘制。
参考资料
http://msdn.microsoft.com/en-us/library/windows/desktop/bb173962(v=vs.85).aspx