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

标签 c++ directx directx-11

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

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

例如这种过程:

text-to-texture-to-cube

将纹理添加到立方体上非常简单。这是将文本(字符串)呈现为纹理(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();

另一种解决方案是使用 Signed Distance Text Rendering .为此,您需要先将此文本渲染到纹理(渲染到纹理),然后将其应用到立方体。

关于c++ - 在 DirectX 11 中将文本绘制为二维纹理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34088765/

相关文章:

c++ - 转换已弃用的 D3DXMATRIX 时出现问题

c++ - 使用 Directx11 在基于高度图的地形上打洞

c++ - 如何确保 TCP 文件传输完成(c++)

c++ - 找到最接近给定素数列表的因素的数字

c++ - 相当于 DirectX 渲染状态的 OpenGL

c# - 使用 DX11 渲染文本

c++ - 如何组织并行程序的正确输出?

c++ - 为什么 enable_if<>* = nullptr 有效而 enable_if<> = void 无效?

directx - 使用结构化缓冲区的 Direct3D 10 硬件实例

c++ - DirectX 11 正面方向