【问题标题】:Best 2D integration with Direct3D 10?与 Direct3D 10 的最佳 2D 集成?
【发布时间】:2011-11-12 12:54:48
【问题描述】:

到目前为止,我有一个应用程序主要是 DirectX 10 3D 图形。现在我们想要生成一些实时 2D 图像以显示在屏幕的一部分上。 2D 图形将使用来自外部硬件的原始数据生成 - 每个值都将转换为像素颜色和位置。

我查看了 Direct2D 集成选项,但我没有看到一种直接的方式来逐个像素地绘制到表面,而只是常见的线条和形状。

我相信仅使用 Direct3D(不使用 Direct2D)也可以做到这一点,并且只需为每个像素设置一个简单的顶点并在正交视图中绘制它。

在生成实时 2D 图形时,使用 Direct2D 是否能提高效率?我不想使用形状工具,所以这对我来说并不是一个真正的卖点。在 Direct3D 应用程序中生成 2D 图形是否有任何其他常用做法会更好?

任何指针将不胜感激。谢谢。

【问题讨论】:

    标签: direct3d directx-10 direct2d


    【解决方案1】:

    在 D3D 应用程序中绘制 2D 图形(UI 等)的常规方法是将您需要的任何位图图像数据存储在纹理中,然后绘制带纹理的 2D 四边形来显示它。这为您提供了免费的缩放、旋转、过滤等硬件加速。

    如果您希望源图像的像素精确再现,您需要确保将屏幕分辨率考虑在内,并使用正确的顶点位置绘制四边形。这在Direct3D 10 中比在Direct3D 9 中更容易。

    【讨论】:

    • 感谢您的 cmets。我仍在寻找有关如何绘制 2D 纹理的更明确的解释。例如,由于我想通过逐个像素设置颜色进行绘制,我的第一个想法是为每个像素创建一个简单的顶点,将它们加载到顶点缓冲区中,然后将缓冲区绘制到纹理中作为 D3D10_PRIMITIVE_TOPOLOGY_POINTLIST。我将使用正交透视图并绘制到大小与我正在绘制的顶点数相匹配的纹理。这听起来像是合适的绘图方法吗?
    • 如果我正确理解您的用例,您最好的选择是直接在纹理中设置纹素值,然后渲染纹理四边形。您需要使用 D3D10_USAGE_DYNAMIC 标志创建纹理,以指示您将使用 CPU 对其进行写入,然后在需要写入时使用 D3D10_MAP_WRITE 标志调用 ID3D10Texture2D::Map()。这为您提供了一个指向纹理子资源数据的指针,您可以直接为需要更新的值设置纹素值。然后你可以调用 Unmap() 并渲染你的纹理四边形。
    【解决方案2】:

    您的问题的答案是带纹理的 2D 四边形

    只需使用以下顶点创建一个顶点着色器:

    (0.0f, 0.0f, 0.0f, 0.0f, 1.0f),
    (0.0f, 1.0f, 0.0f, 0.0f, 0.0f),
    (1.0f, 1.0f, 0.0f, 1.0f, 0.0f),
    (1.0f, 0.0f, 0.0f, 1.0f, 1.0f)
    

    顶点布局 (位置 x,位置 y,位置 z,纹理坐标 x,纹理坐标 y)。

    以及适当的索引缓冲区。

    然后简单地将适当的纹理绑定为着色器资源和矩阵,以根据需要平移/旋转/缩放四边形。在顶点着色器中使用矩阵变换顶点位置,在像素着色器中采样着色器资源配置纹理。

    如果你想简单地更新纹理 Map() 它,更新你想要的任何像素,Unmap() 它并再次将它绑定到像素着色器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-12
      • 2010-10-24
      • 2012-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-16
      • 2011-09-12
      相关资源
      最近更新 更多