gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:10:15 27 4
gpt4 key购买 nike

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

我缺少画线工具。

如何在"new"DirectX9 中替换 ID3DXLine 和 ID3DXFont?

最佳答案

一般来说,线条和字体都是 Sprite 。 ID3DXLineID3DXFont 在底层使用 ID3DXSprite 接口(interface)。 (当然,也有其他的选择,但使用最广泛的是sprite方法)

绘制 Sprite

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

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

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

画线

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

绘图文字

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

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

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

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

...或者只是不打扰

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

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

关于c++ - 如何在 DirectX 9 中不使用 D3DX9 绘制线条和字体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20720882/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com