DirectX11 绘制字体
1. DirectX中如何实现绘制字体?
由于Direct3D11中微软移除了ID3DXFont这个在Direct3D 9中非常好用的字体接口,这样导致了目前的Direct3D11中竟然没有一个官方的字体解决方案。所以如果要绘制字体,必须要采取手动绘制文本的方式。
我们这里介绍一种图形贴图的方式来绘制字体,即将游戏中要绘制的字体做成一副图片(见下图),然后在游戏里面切开一个个字符图片,按字符串所需字符来绘制。
2. 如何将一幅字体纹理切开每一个字符图片?
其实我们并没有真正的切开一幅字体纹理,而是通过修改UV来选中不同的字符。实际上,我们只需要增加一些代码来将之前 Demo 中的顶点缓存修改为动态缓存,和增加一个函数来将我们的贴图精灵填充到缓存中即可。 动态缓存对于我们需要修改一块缓存中的内容的这种情况来说是很合适的。 不推荐多次创建和销毁静态缓存块,特别是逐帧这样做,你应该使用动态缓存来做这样的任务(上一节已经介绍过如何创建动态缓存)。
也就是说我们就修改动态顶点缓存中的顶点位置(字符的位置)和UV(字符的纹理)就可以了。
3. 如何修改动态顶点缓存的数据?
想修改动态缓存,首先要调用D3D设备的Map函数,来获得子资源的指针(ID3D11Buffer继承自 ID3D11Resource,所以缓存也是一种资源)。
Map函数的原型如下:
HRESULT Map( [in] ID3D11Resource *pResource, [in] UINT Subresource, [in] D3D11_MAP MapType, [in] UINT MapFlags, [out, optional] D3D11_MAPPED_SUBRESOURCE *pMappedResource );
第一个参数p