C++ 在DirectX 11中将文本绘制为二维纹理?

C++ 在DirectX 11中将文本绘制为二维纹理?,c++,directx,directx-11,C++,Directx,Directx 11,我希望能够将透明纹理应用于简单3D立方体的每个面。每个纹理都只是面部的名称,例如“前”、“后”、“左”等。通常我只需在paint应用程序中创建一个图像,然后保存它,并在运行时将图像作为纹理加载。然而,问题是,我希望本文使用多种(且不断增长的)不同语言,尽管为每种语言创建六个新图像是一种方法,但最好是从翻译的字符串动态生成纹理 因此理想的解决方案是能够在运行时将文本字符串渲染为2D纹理(使用我选择的任何字体和颜色),然后将每个曲面上的合成纹理渲染为透明覆盖这样做相对容易吗? e、 g.这种过程:

我希望能够将透明纹理应用于简单3D立方体的每个面。每个纹理都只是面部的名称,例如“前”、“后”、“左”等。通常我只需在paint应用程序中创建一个图像,然后保存它,并在运行时将图像作为纹理加载。然而,问题是,我希望本文使用多种(且不断增长的)不同语言,尽管为每种语言创建六个新图像是一种方法,但最好是从翻译的字符串动态生成纹理

因此理想的解决方案是能够在运行时将文本字符串渲染为2D纹理(使用我选择的任何字体和颜色),然后将每个曲面上的合成纹理渲染为透明覆盖这样做相对容易吗?

e、 g.这种过程:


将纹理添加到立方体上非常简单。将文本(字符串)渲染为纹理(ID3D11Texture2D)是一个棘手的部分。似乎它应该是非常有能力的。这方面非常新,因此尽可能使用初学者友好的语言进行解释。

我想立方体纹理不会经常更改,因为用户不应该经常切换到该语言。在本例中,我将使用像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();

另一种解决方案是使用。要执行此操作,您需要先将此文本渲染到纹理(渲染到纹理),然后将其应用到立方体。

您需要。原理很简单:您可以进行常规绘制,但可以将常规纹理而不是后缓冲区设置为渲染目标。但我相信,商业应用程序(如游戏)更愿意离线生成本地化纹理,以避免运行时成本(通过使用或编写一些小的纹理生成器工具)。通过使用或使用经典字体库(如FreeType),您可以稍微简化字体渲染。请看一下的教程,特别是关于
SpriteFont
的课程以及涉及渲染到纹理的课程。我认为DirectXTK的绘图文本仅支持二维曲面中的SpriteBatch。我们无法将字体纹理渲染更改为3D模式。