【问题标题】:Advanced Text Rendering with Direct3D使用 Direct3D 进行高级文本渲染
【发布时间】:2013-03-30 02:12:35
【问题描述】:

让我描述一下我的任务的“战场”:

  • 与超过 100 万用户的多房间音频/视频聊天;
  • 自定义 Direct3D 渲染器;

我需要实现的是 TextOverVideo 功能。文本本身通过网络传输,并将使用 Direct3D 渲染器在接收方进行渲染。 AFAIK,它通常用于游戏开发中,用字母/数字创建自己的纹理并绘制这些项目。因为我们的应用程序必须支持多种语言,所以我们应该使用一个标准。这就是为什么我一直在使用 ID3DXFont 界面,但我发现了一些不满意的限制。

我面临的是缺乏可扩展性。例如。如果用户正在调整视频窗口的大小,我必须在他这样做时使用新的 D3DXFONT_DESC 重新创建 D3DXFont。我认为这是不可接受的。 这就是为什么我看到的唯一解决方案(由于我的技能)是以某种方式将文本渲染为纹理,因此通过缩放、平移等绘制精灵。

所以,我不确定我是否朝着正确的方向前进。请提供建议、经验、文献、资源...

【问题讨论】:

    标签: direct3d fonts render-to-texture


    【解决方案1】:

    你的问题有点不清楚。据我了解,您需要易于缩放的字体。

    我认为这是不可接受的

    据我所知,这是字体的标准行为——即使是系统字体也​​是如此。它们不应该很容易扩展。

    可能的解决方案:

    1. 使用 ID3DXRenderTarget 将文本渲染到纹理上。当您将其放大太多时,字体将被过滤。有些人会认为它看起来很丑。
    2. 编写支持矢量字体的自定义库。 IE。 - 它应该能够从字体中提取字体轮廓,并从中构建文本。它会比 ID3DXFont 慢得多(它已经比传统的“纹理”字体慢)。文本将很容易扩展。使用这种方式,您很可能会看到小文本的可见伪影(“噪音”)。除非您想要大字母(40+ 像素),否则我不会使用这种方法。 Freetype 库可能具有处理字体轮廓的功能。
    3. 或者您可以尝试使用 D3DXCreateText。这将为一个字符串创建 3D 文本。不会很快。

    我会忘记的。只要用户对整体性能感到满意,改进字体渲染例程(因此他们的行为看起来对你来说很好)是不值得的。

    --编辑--

    关于 ID3DXRenderTarget。
    即使你使用 ID3DXRenderTarget,你也需要 ID3DXFont。 IE。您使用 ID3DXFont 将文本渲染到纹理上,然后使用纹理将文本 blit 到屏幕上。
    因为您说性能至关重要,您可以延迟创建新 ID3DXFont 直到用户停止调整视频大小。 IE。当用户开始调整视频大小时,您使用旧字体,但使用纹理对其进行放大。当然会有过滤。一旦用户停止调整大小,您将在有时间时创建新字体。您可能可以在单独的线程中执行此操作,但我不确定。或者,您可以简单地始终以与视频相同的分辨率呈现文本。这样您就不必担心调整它的大小(它仍然会与视频一起被过滤)。一些视频播放器以这种方式工作。
    关于 ID3DXFont 的更多信息。 ID3DXFont 有一个问题——在需要大量文本的情况下它很慢(但你仍然需要它,因为它支持 unicode,并且用 unicode 支持编写 texturefont 很痛苦)。上次我使用它时,我通过在纹理中缓存常用字符串来优化事物。 IE。在行中绘制超过 3 帧的任何字符串都被渲染到 D3DFMT_A8R8G8B8 纹理/渲染目标上,然后我一直从纹理复制该字符串而不是使用 ID3DXFont。一段时间未渲染的字符串已从纹理中移除。这给了一些严重的推动。然而,这个解决方案很棘手——监视纹理中的空白空间、删除未使用的字符串以及对纹理进行碎片整理并非易事(没有什么特别复杂的,但很容易出错)。除非您的屏幕完全被文字覆盖,否则您将不需要如此复杂的系统。

    【讨论】:

    • 非常感谢您的回复! “不可接受” - 我的意思是创建 D3DXFont 需要大量资源和性能对我们的软件至关重要。但如果我理解正确,可能的解决方案 2 和 3 会更糟。 ID3DXRenderTarget-是的,我是这么想的。但我找不到足够的例子来说明如何使用它。我害怕 - 有人会告诉我“嘿,不要使用 D3DXFont!它的性能是最差的!ID3DXRenderTarget 是解决方案!”那么请告诉我,我应该继续使用 D3DXFont 方法还是深入研究 ID3DXRenderTarget 技术?
    • 再次感谢!如果您能给我一个如何将 ID3DXFont 渲染到纹理的示例,我将不胜感激。SCRATCH 关于 ID3DXRenderTarget 的信息太少。提前致谢!顺便说一句,我尝试在调整大小期间动态重新创建字体,是的 - 调整大小时的 CPU 使用率相对较高..
    【解决方案2】:

    ID3DXFont 字体是扁平的,始终与屏幕平行。 D3DXCreateText 是可以缩放和旋转的网格。

    纹理字体模糊,看起来不太清晰。不适合使用大量小文本的应用。

    我正在编写一个可以创建 500 个文本网格的应用程序,每个网格平均有 3,000-5,000 个顶点。文本网格创建一次,然后是静态的。我在 GeForce 8800 上获得 700 fps。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-12
      • 2017-08-29
      • 1970-01-01
      • 2021-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-08
      相关资源
      最近更新 更多