使用Windows API在XNA中呈现任意文本?


9

在Andrew关于我的另一个问题的评论中,他指出可以使用Windows API将文本呈现到Texture2D,而不是直接使用SpriteBatch绘制文本。怎么做?我猜在将图像数据写入Texture2D之前有一个中间步骤。

我之所以问是因为,这将使我能够即时渲染Unicode字符,而不是需要使用SpriteFont预先渲染所有需要的字形(可悲的是,韩文和日文中的字形太多,以致于该路线不可行)。谢谢!

Answers:


4

使用一些反射,您可以从Texture2D获取Direct3D表面指针。从那里,您可以使用任何可以渲染到DX表面的API。我最近这样做是用WPF的D3DImage(具有Alpha通道支持)来托管XNA内容。DirectWrite可以渲染到DX表面,甚至可以使用托管API。该链接中的DirectX .NET包装仅支持Direct3D 10和11,而不支持Direct3D 9(XNA使用AFAIK)。但是,您仍然可以使它正常工作。另外,如果要渲染矢量图形,则可以使用类似的方法与Direct2D进行互操作。当然,除了Windows之外,这些都不能在任何XNA支持的平台上运行。


1
我只想指出,您还可以获取xna的窗口句柄,并告诉它渲染为类似win32面板的东西。然后,您可以使用任何要在游戏顶部渲染的方法,因为您只需将后缓冲区绘制到Win32控件即可。这很脏,但是当我将Tablet PC输入面板与XNA合并时,对我来说效果很好。结果是看起来像是标准的XNA窗口,但具有不可见的手写识别功能。我只是在xna上方显示笔画。当然,文本/标签/按钮也可以使用。但是,我还没有尝试使用WPF。
zfedoran 2010年

1
我认为您的方法会出现“空域”问题,Arriu。您是否可以在Alpha通道完整的情况下在XNA窗口顶部呈现内容?一般规则是,一个图形API只能“拥有”一个像素,这会导致透明或半透明内容出现问题。如果这同样适用于您的方法,那么将文本呈现在纯色背景之外的其他任何东西上都会有问题。
Mike Strobel

抱歉,我可能有点困惑。我描述的方法无非是告诉面板在背景上绘制纹理。类似于如何告诉imagebox绘制什么图像。但是,不是纹理/图像是文件,而是xna后缓冲区。我没有在面板/窗口上方或上方绘制。因此,“空域”没有任何问题。
zfedoran

知道了 因此,您的方法与我在WPF中(使用D3DImage)托管XNA内容的方式非常相似。图像源是XNA / Direct3D曲面,而不是典型的位图源。我同意这是给定可用选项的最佳方法-不存在空域问题,并且由于不需要进行不必要的复制/划线,因此性能非常好。
Mike Strobel,2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.