繁体   English   中英

在DirectX 9中如何在没有D3DX9的情况下绘制线条和字体?

[英]How to draw line and font without D3DX9 in DirectX 9?

我看到Microsoft不推荐D3DX9,Windows SDK也不附带D3DX9。 我想采用。

我缺少线条画工具。

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

通常,线条和字体是精灵。 ID3DXLineID3DXFontID3DXFont使用ID3DXSprite接口。 (当然,还有其他选择,但最常用的是精灵方法)

绘制精灵

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

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

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

画线

然后,对于直线,您只需绘制一个细的矩形精灵即可。 用户将输入诸如线条的开始,结束和粗细之类的值,并且您将需要做一些简单的数学运算来计算此子画面的位置和旋转。 Sprite可以仅是彩色的,也可以具有纹理的:对于虚线,带状线,带有粉红色蓬松小猫的线等。然后,您可以将曲线实现为一组直线。 您可以选择将精灵添加到行尾,例如箭头。

绘图文字

对于文本,事情可能会非常复杂(我将仅在此介绍精灵字体):

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

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

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

...或者只是不打扰

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

希望能帮助到你。 编码愉快!

为什么不尝试使用DirectX 11?

几乎所有平台都支持Oterhwise OpenGL。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM