繁体   English   中英

在Direct3D应用程序中渲染格式化的文本

[英]Rendering formatted text in a direct3d application

我需要渲染一些格式化的文本(颜色,不同的字体大小,下划线,粗体等),但是我不确定该怎么做。 D3DXFont只允许一次渲染单个字体/大小/粗细/颜色/等的文本,而我看不到“组合”对ID3DXFont :: DrawText的多次调用来执行此类操作的实用方法...

我环顾四周,似乎没有现成的库可以做这些事情,但是我不知道如何实现这样的文本渲染器,甚至找不到关于这种文本渲染如何工作的文档,仅呈现简单的固定宽度的ASCII位图字体,这可能是一种完全不同的方法,仅适合呈现Unicode不重要的简单文本块。

如果没有Direct3d字体渲染器能够执行此操作,那么是否还有其他渲染器(例如,用于在普通窗口中渲染富文本格式),并将其渲染到RAM中的纹理,然后将其上载到视频卡以渲染到后台缓冲区产生合理的性能?

您用Direct3D标记了它,因此我将假定这是目标环境。 否则,GDI可以处理所有这些事情。

实际上,查看GDI是一个不错的起点,因为它可以支持目前的情况。 使用GDI,一次只能选择一种字体来绘制文本。 同样,一次只能选择一种文本颜色。 因此,要绘制一行包含多种颜色和/或字体的字符的文本行,您必须将行划分为全部具有相同渲染状态的字符块。 您可以为该块设置状态(文本前景色/背景色,文本字体,文本间距等),然后为该文本块调用::TextOut ,然后为下一个块设置状态并进行绘制,如此-上。

Direct3D中应用了相同的原理。 每个文本块可能需要自己的ID3DXFont (如果ID3DXFont不够,则需要您自己的字体机制)和颜色等。您可以设置状态,绘制文本,设置状态,绘制文本等。

现在,如果您想进行自己的文本渲染,则可以使用着色器进行更奇特的操作,但是除非您需要真正高质量的排版,否则这样做可能不值得。

在Windows 7中(Windows 7发行后将回填为Vista),您将能够在Direct3D渲染上下文(D3D10及更高版本)中使用DirectWrite进行高质量排版。

如果使用Direct3D9或更早版本,您确实会遇到很大的问题:1.您总是可以使用GDI,在HDC中渲染文本,将其复制到Direct3D动态纹理中,并使用着色器通过例如颜色键将背景替换为透明度。 2.看一下FreeType库,也许您会发现它比GDI更适合您,但是确实不容易。

无论如何,即使您找到了一种很好的文本呈现方式,但由于ClearType Microsoft技术,遗忘的字体都会出现小字体问题。 起初,您将不能仅制作一个由小符号组成的矩阵来输入文本(因为使用此子像素渲染来渲染符号)。 您可能需要一些特殊的着色器...或者您将被强制拒绝使用ClearType,但是正如我之前所说的,它对小字体具有不良的后效应。 第二,这项技术已获得 Microsoft的专利


但是,如果您不需要Windows XP的支持,则可以尝试将Direct2D与DirectWrite和DirectX10一起使用(我没有尝试11)。 我尝试了它们,并显示出良好的效果,您只应避免经常在Direct2D和Direct3D上下文之间切换,因为这可能会严重降低性能。 要渲染某些东西到您的纹理,您可以使用ID2D1Factory :: CreateDxgiSurfaceRenderTarget函数

我建议测量渲染到位图并上传到纹理的性能。 我怀疑无论如何D3DXFont都必须这样做。 如果需要,您可能会缓存字母/词组等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM