如何在DirectX 9中不使用D3DX9绘制线条和字体?

时间:2013-12-21 16:07:02

标签: c++ directx directx-9

我发现Microsoft不推荐使用D3DX9,Windows SDK不附带。 我想采纳。

我错过了我的画线工具。

如何在“新”DirectX9中替换ID3DXLine和ID3DXFont?

2 个答案:

答案 0 :(得分:4)

通常,线条和字体都是精灵。 ID3DXLineID3DXFont使用ID3DXSprite界面。 (当然,还有其他选项,但精灵方法是最广泛使用的)

绘制精灵

因此,首先,您需要第三方或您自己的精灵渲染器。通常,开发“卧室”精灵引擎,包括阶段:

  • 绘制一堆简单的彩色四边形(两个三角形形成矩形)。有不同的技术,但即使是最简单的“一体化顶点缓冲”方法也不是那么糟糕。更高级的技术包括实例化,点精灵,几何着色器和曲面细分技巧(最后两个不适用于DX9)。但是,甚至不要尝试用百万个绘制调用来绘制百万精灵;)
  • 纹理这些四边形。您将需要位图加载器。如果您根本不想使用D3DX,您可以选择开源FreeImage库,例如编写自己的加载器。
  • 使用批处理优化渲染。对精灵进行排序,以最小化绘制调用次数和/或最小化上下文状态更改。
  • 使用纹理图集优化纹理。你需要解决矩形打包算法(在网上已有很多实现,或者拿起你的数学书)并推出某种纹理图集格式。

您可以选择停止的舞台。之后,你可以回去继续。

画线

然后,对于直线,您只需绘制一个细矩形精灵。用户将输入行的开始,结束和粗细等值,您需要进行一些简单的数学运算来计算该精灵的位置和旋转。精灵可以是彩色的或具有纹理:用于虚线,剥线,粉红色蓬松小猫等等。然后,您可以将曲线实现为一组直线。您可以选择将精灵添加到行的末尾,例如箭头。

绘图文字

对于文本,事情可能非常复杂(我将在这里仅讲述精灵字体):

  • 每个角色都是一个小精灵
  • 你在上面画一个字母的纹理
  • 你有这些字母的纹理,并使用字典对其进行采样。字典是字符(或字符代码)到纹理坐标的地图,它的图片位于其中,还有其他信息,例如间距,字距等。
  • 您可以使用预先烘焙(离线)纹理图集,其中包含您需要的所有字体大小的所有字体,以及字典。显然,你不能在资源缓存中拥有所有语言的所有字母。
  • 您可以在运行时根据需要烘焙每个角色并将其添加到缓存中(纹理图集+词典)

要将字体文件中的字符(例如.ttf)添加到位图(图像),您可以使用库。 FreeType是我所知道的最好的开源。自己解析字体可能很复杂。

然后,您可以将所有内容混合在一起,并使用文本纹理绘制线条。或者绘制由线框包围的文本。或者上面有文字的精灵。或GUI。所有这些都是精灵。

...或者只是不打扰

如果你仍然使用DirectX 9,你真的需要打扰Windows SDK,删除D3DX的东西吗?也许你可以继续开发Direct SDK和D3DX,如果它适合你?请注意,如果由于某种原因,您决定转移到DX11,则会DirectXTK,它会部分取代D3DX11的内容。不过,您自己的或第三方解决方案可能会更灵活,更适合您。在3D图形中还有许多精灵应用,例如广告牌,GUI,粒子等。而且一如既往,重新发明轮子是一种非常有趣和积极的体验;)

希望它有所帮助。快乐的编码!

答案 1 :(得分:-2)

为什么不尝试使用DirectX 11?

几乎任何平台都支持OTERhwise OpenGL。

我建议尝试使用SDL,它有大多数可以想象的2D东西的辅助方法。