Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ DirectX字体教程,不使用';不要使用GDI_C++_Fonts_Directx - Fatal编程技术网

C++ DirectX字体教程,不使用';不要使用GDI

C++ DirectX字体教程,不使用';不要使用GDI,c++,fonts,directx,C++,Fonts,Directx,是否有人提供了在本机directx 9中创建和呈现不使用GDI的字体的教程/信息?(例如不使用ID3DXFont)。 我读到这不是最好的解决方案(由于访问GDI),但在dx中呈现字体的“正确”方法是什么?为什么这不是一个好的解决方案 将GDI渲染和D3D渲染混合到同一个窗口中是一个坏主意 但是,ID3DXFont不使用该选项。它使用GDI将图示符栅格化为纹理。并使用该纹理渲染实际文本 唯一的选择是使用另一个库(例如FreeType)将字形栅格化为纹理,但我不确定这是否会带来任何实质性的好处 当然

是否有人提供了在本机directx 9中创建和呈现不使用GDI的字体的教程/信息?(例如不使用ID3DXFont)。

我读到这不是最好的解决方案(由于访问GDI),但在dx中呈现字体的“正确”方法是什么?

为什么这不是一个好的解决方案

将GDI渲染和D3D渲染混合到同一个窗口中是一个坏主意

但是,ID3DXFont不使用该选项。它使用GDI将图示符栅格化为纹理。并使用该纹理渲染实际文本

唯一的选择是使用另一个库(例如FreeType)将字形栅格化为纹理,但我不确定这是否会带来任何实质性的好处


当然,对于简单(例如非亚洲)字体,您可以事先将所有字形栅格化为纹理,然后在运行时使用该纹理绘制文本。这样运行时就不需要使用任何字体渲染库,只需使用纹理绘制四边形。这种方法不能很好地适应大字体大小或包含大量字符的字体。也不能很好地处理复杂的排版(例如,必须连接字母的位置等)

使用DirectX,呈现标准字体的正确方法是使用GDI

然而,如果

  • 您希望支持跨平台字体呈现
  • 适当支持国际化-包括远东语言,在那里为字体中的每个字符维护字形是不切实际的
  • 和/或您希望分发自己的字体并在不“安装”它们的情况下呈现它们

那可能就是你要找的。我并不认为它简单:它比使用本机字体api复杂得多。

ID3DXFont对于易于使用的早期调试输出来说是一件很棒的事情。但是,它确实使用GDI进行字体光栅化(而不是硬件加速),而且性能受到了很大的影响(试试看,它实际上非常明显)。但是,从DirectX 11开始,字体将使用Direct2D呈现,并进行硬件加速


渲染文本的最快方法是使用所谓的“位图字体”。我将解释如何做到这一点,除了有许多不同的方法来实现这一技术,每种方法在复杂性和功能上都有所不同。它可以像加载预先创建的纹理并从中绘制字母的系统一样简单,也可以像在加载时向Windows静默注册字体并在内存中创建纹理的系统一样简单(我与一位朋友开发的引擎就是这样做的,它非常灵活)。无论哪种方式,您都应该看到位图字体的性能显著提高。

我个人认为ID3DXFont是一个不错的选择。 如果您真的想制作自己的字体例程,我建议您看看:

您可以使用它创建一个位图,其中所有字符都打印在上面。然后,它只是一个问题,或者加载纹理,并在屏幕上的正确位置点相应的字符。(这是XNA用于字体绘制的内容)

这需要更多的工作,但您不需要在目标PC上安装字体,而且您可以进入photoshop并在那里编辑字体外观