我通过使用D3D9在游戏中挂钩ID3DXFont :: DrawText()进行了测试(我在LOTRO上测试,在登录到服务器之后的第一个加载屏幕和字符面板)但它从未被调用(挂钩工作,我通过自己使用此API测试来绘制文本),尽管在屏幕上绘制了许多文本。
在D3D9中绘制文本的其他方法是什么?
感谢。
答案 0 :(得分:1)
最终,实际上只有一种方法可以使用Direct3D 9来渲染文本,并且通过使用IDirect3D9::Draw*
方法之一绘制包含文本的纹理。这就是ID3DXFont
在引擎盖下绘制文本的方式。对于永不改变的文本(例如," Game Over"),可以使用包含文本的静态纹理。对于动态文本(例如播放器的名称),文本可以由CPU(可能使用GDI)渲染为动态纹理,或者可以从包含完整字符字符的静态纹理中挑选单个字母
这意味着做任何你想做的事都不容易。在Direct3D 9中,文本的绘制方式与其他所有内容相同。如果您只截取绘制调用,则您不知道游戏是渲染文本还是场景的一部分。如果您拦截所有Direct3D 9调用并跟踪设备的当前状态,您应该能够区分游戏正在渲染UI元素以及渲染场景时,但您仍然不知道文本是什么(如果有的话)正在渲染,除非你看纹理。一般情况下,这意味着您需要对纹理进行OCR(光学字符识别)。
因此,无论您想做什么,并且让它适用于所有游戏,它可能都不实用。如果你只需要这个来处理一个特定的游戏,事情会变得更容易,因为它只需要用工作游戏用来呈现文本的特定方法(或方法)。