在DirectX 11中将文本绘制到2D纹理?

时间:2015-12-04 12:46:14

标签: c++ directx directx-11

我希望能够在一个简单的3D立方体的每个面上应用透明纹理。每个纹理只是面部的名称,例如, “Front”,“Back”,“Left”等。通常我只是在绘画应用程序中创建一个图像,然后保存它,并在运行时将图像作为纹理加载。然而,扭曲的是我希望这个文本有多种(并且正在增长)不同的语言,虽然为每种语言创建六个新图像是一种方法,但最好是从翻译的字符串动态生成纹理。

所以理想的解决方案是能够在运行时将文本字符串渲染为2D纹理(使用我选择的任何字体和颜色),然后将每个表面上的结果纹理渲染为透明覆盖。 这可以相对容易地完成吗?

e.g。这种过程:

text-to-texture-to-cube

将纹理放到立方体上很容易。这是将文本(字符串)渲染到纹理(ID3D11Texture2D),这是一个棘手的部分。好像它应该是非常可行的。这是非常新的,所以尽可能在初学者友好的语言中保留任何解释。

1 个答案:

答案 0 :(得分:0)

我想立方体纹理不会太频繁地改变,因为用户不应经常切换语言。在这种情况下,我会使用像Qt这样的工具包来生成纹理 - 类似这样:

  QImage image(width,height,QImage::Format_ARGB32);
  image.fill(Qt::transparent);

  QPainter painter;
  painter.begin(&image);
  painter.setRenderHints(QPainter::HighQualityAntialiasing
                 | QPainter::TextAntialiasing);
  painter.setFont(font);
  painter.setPen(Qt::black);

  painter.drawText(0, metric.ascent(), QString(c));
  painter.end();

访问纹理数据:

auto* data = image.data();

另一种解决方案是使用Signed Distance Text Rendering。这样做,您需要先将此文本渲染到纹理(渲染到纹理),然后将其应用到多维数据集。