【问题标题】:How to draw line and font without D3DX9 in DirectX 9?在 DirectX 9 中如何在没有 D3DX9 的情况下绘制线条和字体?
【发布时间】:2013-12-21 16:07:02
【问题描述】:

我看到 D3DX9 不是 Microsoft 推荐的,也没有随 Windows SDK 一起提供。 我愿意领养。

我的画线工具不见了。

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

【问题讨论】:

标签: c++ directx directx-9


【解决方案1】:

一般来说,线条和字体都是精灵。 ID3DXLineID3DXFont 在后台使用 ID3DXSprite 接口。 (当然也有其他的选择,但是 sprite 方式是使用最广泛的)

绘制精灵

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

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

您可以选择在哪个阶段停止。稍后,您可以返回并继续。

画线

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

绘制文字

对于文本,事情可能会非常复杂(这里我只介绍精灵字体):

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

要从字体文件(例如.ttf)获取字符到位图(图像),您可以使用 library. FreeType 是我所知道的最好的开源软件。自己解析字体可能……很复杂。

然后您可以将所有内容混合在一起并使用文本纹理绘制线条。或绘制由线条框包围的文本。或者上面有文字的精灵。或图形用户界面。所有这些东西都将成为精灵。

...或者只是不打扰

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

希望对您有所帮助。编码愉快!

【讨论】:

    【解决方案2】:

    为什么不尝试使用 DirectX 11?

    几乎所有平台都支持 OpenGL。

    我建议尝试 SDL,它为您可以想象的大多数 2D 内容提供了辅助方法。

    【讨论】:

    • 因为我的应用程序不需要它。而且DX11还是不知道怎么画线。
    • 你应该试试 SDL,如果你想画一条线,它有你需要的支持。
    • 我想用DirecX9,我想画线。我不想要 SDL、OpenGL 或其他任何东西。
    猜你喜欢
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 2013-03-26
    • 2021-12-14
    • 1970-01-01
    相关资源
    最近更新 更多