Directx ID3DXFont使用的缩放算法是什么?

Directx ID3DXFont使用的缩放算法是什么?,directx,direct3d,direct3d9,Directx,Direct3d,Direct3d9,我试图补充ID3DXFont功能,将文本渲染到纹理,然后ID3DXSprite.Draw()-根据需要对其进行编辑 旧(直接)方式: 新(优化)方式: 无论在直接渲染时缩放比例如何,文本都很好且可读,但在渲染到纹理然后缩放为纹理时,文本会变得难看 请参见:第一行是通过纹理缩放渲染的,第二行是ID3DXFont缩放 为了确保没有双重缩放,我将(假定未缩放)纹理保存到一个文件中。它是(甚至在BMP中只有$000和$FFF像素,所以没有平滑) 我错过什么了吗?我一直认为ID3DXFont也会做同样的事

我试图补充ID3DXFont功能,将文本渲染到纹理,然后ID3DXSprite.Draw()-根据需要对其进行编辑

旧(直接)方式:

新(优化)方式:

无论在直接渲染时缩放比例如何,文本都很好且可读,但在渲染到纹理然后缩放为纹理时,文本会变得难看

请参见:第一行是通过纹理缩放渲染的,第二行是ID3DXFont缩放

为了确保没有双重缩放,我将(假定未缩放)纹理保存到一个文件中。它是(甚至在BMP中只有$000和$FFF像素,所以没有平滑)


我错过什么了吗?我一直认为ID3DXFont也会做同样的事情,将字形渲染成纹理,然后使用Sprite.Draw()将其快速渲染到视图中。为什么它能更好地缩放文本?

ID3DXFont的工作原理是直接从字体的字形数据AFAIK渲染文本数据。如果您尝试对任何纹理进行下采样,您所看到的是不可避免的。

看起来您在错误(非整数)坐标处绘制纹理,这会导致失真。在绘图之前尝试四舍五入坐标。@real4x:no,绘图到整数坐标(当然在缩放之前)D3DXFont无法“直接”呈现文本:不在Direct3D中。它必须将其渲染到纹理上,然后将该纹理放置在四边形上。和我一样。事实上,它受到缩放的影响,只是我的文本受到更严重的影响(检查样本)。@他自己说“:为什么它不能出于兴趣直接渲染它们?我有一个字体系统,使用FreeType直接从字形数据构建三角形,所以我不明白D3DXFont为什么不这样做。公平地说,虽然我知道D3DXFont可以将文本缓存到纹理中,以节省以后的渲染时间!你是说3d字体?我放弃了,有可能。。。但要像D3DXFont那样支持GDI DrawText的每一个特性都是非常复杂和痛苦的。你会丢失一些东西,比如抗锯齿,cleartype等等,据我所知,所有这些都发生在像素级。无论如何,在DirectX调试器的帮助下,我发现当我用D3DXFont绘制文本线时,会创建一个纹理,其中包含所有必需的字形;我不知道他们是怎么让它的规模这么大的。它是mipmapped,可能不是默认的缩放。。。此外,它在$00000000上呈现为$FF000000(仅限alpha通道)。
ID3DXSprite *sprite;
ID3DXFont *font;
sprite->SetTransform(mw);
font->DrawText(sprite, ...);
RenderTextToATexture(texture, ...);
sprite->SetTransform(mw);
sprite->Draw(texture, ...);