【问题标题】:How to draw text in D3D9 apart ID3DXFont::DrawText?如何在 D3D9 中除 ID3DXFont::DrawText 之外绘制文本?
【发布时间】:2015-02-16 12:42:48
【问题描述】:

我通过在使用 D3D9 的游戏中挂钩 ID3DXFont::DrawText() 进行了测试(我在 LOTRO 上进行了测试,登录到服务器后开始时的第一个加载屏幕和字符面板)但它从未被调用(钩子有效,我自己测试了这个API来绘制文本),尽管屏幕上绘制了很多文本。

在 D3D9 中绘制文本的其他方法是什么?

谢谢。

【问题讨论】:

  • Direct3D 9 应用程序不要求使用 D3DX。 D3DX 是一个完全可选的——现在已被弃用的——库。

标签: directx direct3d drawtext direct3d9


【解决方案1】:

最终只有一种方法可以使用 Direct3D 9 呈现文本,那就是使用 IDirect3D9::Draw* 方法之一绘制包含文本的纹理。这就是ID3DXFont 在后台绘制文本的方式。对于永不改变的文本(例如“Game Over”),可以使用包含文本的静态纹理。对于动态文本(例如玩家姓名),文本可以由 CPU 渲染成动态纹理(可能使用 GDI),或者可以从包含完整字母表的静态纹理中挑选出单个字母。

这意味着做任何你想做的事情都不是一件容易的事。在 Direct3D 9 中,文本的绘制方式与其他所有内容相同。如果您只拦截绘图调用,您将不知道游戏是在渲染文本还是场景的一部分。如果您拦截所有 Direct3D 9 调用并跟踪设备的当前状态,您应该能够区分游戏在何时渲染 UI 元素和何时渲染场景,但您仍然不知道正在呈现什么文本(如果有)除非您查看纹理,否则渲染。一般情况下,这意味着您需要对纹理进行 OCR(光学字符识别)。

因此,随心所欲地让它适用于所有游戏可能是不切实际的。如果您只需要它来处理一个特定的游戏,事情会变得更容易,因为它只需要处理游戏用来呈现文本的特定方法(或多个方法)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    相关资源
    最近更新 更多