【问题标题】:How to draw different geometries in DirectX?如何在 DirectX 中绘制不同的几何图形?
【发布时间】:2020-04-01 02:22:30
【问题描述】:

我想画许多立方体和许多线条。

我正在处理许多立方体,没关系。但是如果我还想绘制其他形状(不是三角形)怎么办?

我需要创建 2 个顶点和索引缓冲区吗?一个用于立方体,一个用于线?如果是,那么行顶点缓冲区如下所示?

Vertex vList[] =
{

{ 0.0f, 0.0f, 0.0f},
{ 1.0f, 0.0f, 0.0f}

}

另外,如果是,那么在UpdatePipeline() 中我应该检查是否要绘制三角形或直线,并重置 Input Assembler 的顶点缓冲区、索引缓冲区和图元拓扑?


我通常想要的是绘制粒子,由一条线连接(但不是所有相互连接)。所以我要画立方体(我不知道怎么画球),然后我画线。

【问题讨论】:

标签: directx


【解决方案1】:

在 DirectX 中绘制几何图形的方法有很多种,因为正确的解决方案取决于您要执行的操作。主要限制是您在一次调用 Draw 中绘制的所有内容都必须使用相同的状态/着色器——通常称为“材质”。出于性能原因,您希望在每个 Draw 调用中绘制数千或数万个顶点。

您可以使用一些技巧将不同的材质组合成一个绘图,但更容易将每个调用视为单个“材质”。

鉴于在 DirectX 中绘制几何图形有三种基本方法:

  • 静态提交 在这种情况下,您将顶点/索引数据复制到顶点/索引缓冲区并多次重复使用。这是最有效的渲染方式,因为数据只能放在 GPU 内存中。您可以使用转换、合并缓冲区和其他技巧来重用相同的顶点/索引数据。这通常是大多数场景中对象的绘制方式。

例如,请参阅DirectX 工具包中的GeometricPrimitiveModel类。

由于 DirectX 12 的数据上传模型,您必须通过 LoadStaticBuffers 方法将这些从 D3D12_HEAP_TYPE_UPLOAD 显式转换为 D3D12_HEAP_TYPE_DEFAULT,但它实现与 DirectX 11 的 D3D11_USAGE_DEFAULT 从 @ 复制相同的事情987654333@资源。

  • 动态提交 每次使用时都会建立顶点/索引缓冲区。这效率不高,因为缓冲区本身必须驻留在 CPU 和 GPU 之间共享的内存中,但对于处理每个渲染帧都在 CPU 上创建几何图形的情况,这是一种非常有用的方法。对于 DirectX 12,这是一个 D3D12_HEAP_UPLOAD 资源。有关在 DirectX 11 中使用 D3D11_USAGE_DYNAMIC 的信息,请参阅 DX11: How to: Use dynamic resources

有关这方面的示例,请参阅 DirectX 工具包中的 SpriteBatchPrimitiveBatch

  • 通常绘制一组相同形状的最有效方法(假设您使用相同的状态/着色器)是使用实例化。 请参阅 DX11DX12SimpleInstancing 示例。

如果您是 DirectX 新手,您应该强烈考虑首先使用 DirectX 11 而不是 DirectX 12。在任何情况下,请参阅 DirectX 工具包以获取DX11 / DX12。 p>

【讨论】:

  • 我写了不同的几何形状不同的形状。实例化需要,如果我理解正确的话,当一个人想要绘制相同几何图形的多个实例(即使是转换)时。但我想绘制甚至不同类型的拓扑
  • 你能分别回答我的要求吗?因为我什至写了我一般想做的事情。我不认为我的问题不清楚或类似的东西。我只是想了解一些事情
  • 如果让顶点缓冲区完全为空,并使用常量缓冲区发送整个数据呢?
  • 重要的是您向显卡发送了多少数据。常量缓冲区在任何特定方面都没有什么特别之处......它们只是设计为每帧都完全更新。
  • 我有新的相关问题stackoverflow.com/questions/60977148/… 如果您知道如何提供帮助,我将不胜感激
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多