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

C++ 如何在DirectX 9中不使用D3DX9绘制线条和字体?,c++,directx,directx-9,C++,Directx,Directx 9,我发现D3DX9不是微软推荐的,也不是Windows SDK附带的。 我想领养 我缺少我的线条绘制工具 如何在“新建”DirectX9中替换ID3DXLine和ID3DXFont?为什么不尝试使用DirectX 11 Oterhwise OpenGL几乎在任何平台上都受支持 我建议您尝试SDL,它为您所能想象的大多数2D内容提供了帮助方法。一般来说,线条和字体都是精灵ID3DXLine和ID3DXFont使用ID3DXSprite引擎盖下的界面。(当然,也有其他选择,但sprite方法使用最广泛

我发现D3DX9不是微软推荐的,也不是Windows SDK附带的。 我想领养

我缺少我的线条绘制工具


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

为什么不尝试使用DirectX 11

Oterhwise OpenGL几乎在任何平台上都受支持


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

一般来说,线条和字体都是精灵
ID3DXLine
ID3DXFont
使用
ID3DXSprite
引擎盖下的界面。(当然,也有其他选择,但sprite方法使用最广泛)

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

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

画线 然后,对于直线,您只需绘制一个薄矩形精灵。用户将输入诸如线的起点、终点和厚度等值,您需要做一些简单的数学运算来计算该精灵的位置和旋转。Sprite可以是彩色的,也可以是纹理的:对于虚线、剥线、有粉色毛茸茸的小猫的线等等。然后,您可以将曲线实现为一组直线。您可以选择将精灵添加到线的端点,例如箭头

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

  • 每个角色都是一个小精灵
  • 你在上面画一个字母的纹理
  • 你有一个带有这些字母的纹理,并使用字典对其进行采样。字典是将字符(或字符代码)映射到图片所在的纹理坐标,以及其他信息,如间距、字距等
  • 您可以拥有预烘焙(脱机)纹理图集,其中包含所需字体大小的所有字体的所有字母以及字典。显然,您的资源缓存中不可能有一个星球上所有语言的所有字母
  • 您可以根据需要在运行时烘焙每个字符,并将其添加到缓存(纹理图集+字典)
要从字体文件(如
.ttf
)中获取字符到位图(图像),可以使用库。FreeType是我所知道的最好的开源软件。自己分析字体可以。。。复杂

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

…或者干脆不麻烦 如果您仍然使用DirectX 9,您真的需要为Windows SDK而烦恼吗,删除D3DX的东西?如果DirectSDK和D3DX适合您,您可以继续使用它们进行开发吗?请注意,如果出于某种原因,您决定迁移到DX11,则会有,它会部分替换D3DX11的内容。不过,您自己或第三方的解决方案可能会更灵活,更适合您。Sprite在3D图形中还有许多其他应用,如广告牌、GUI、粒子等。一如既往,重新发明轮子是一种非常有趣和积极的体验;)


希望能有帮助。快乐编码

因为我的应用程序不需要它。我仍然不知道如何在DX11中画线。你应该试试SDL,如果你想画线,它有你需要的支持。我想使用DirecX9,我想画线。我不想要SDL、OpenGL或其他任何东西。如果您不需要3D,那么Direct2D和DirectWrite是可选的。Windows SDK中不再包含D3DX,但为什么不使用最新的独立DirectX SDK: