1

我正在尝试编写一个 DirectX 9.0 控件,该控件将多个 2-D 形状呈现到表面上并允许用户与这些形状进行交互。到目前为止,我已经能够将一百万个不同颜色的三角形渲染到一个网格上,然后用户可以使用鼠标在这个网格周围平移和缩放。但是,我相信,等不及了。我知道我这样做的效率很低……

目前,我为每个三角形都有一个顶点缓冲区,并且在每次渲染时,我都设置了流源并在一个巨人中绘制了图元-环形。对于一个实验,我尝试制作一个包含单个三角形的顶点缓冲区,并在另一个 for 循环中更改世界变换并绘制图元。表现很糟糕。

我真正需要的是某种方式来存储几个独特的形状(大约 100 个),并在世界各地对它们进行 1,000 或 10,000 多次标记。我还希望能够更改形状的单个实例的颜色。我不需要花哨的灯光/纹理/或类似的东西。只是一个简单的颜色。

那么,完成此任务的典型 DirectX 方式是什么?

4

1 回答 1

1

您可以使用一些技术来做到这一点;我会先查看索引缓冲区,然后随着场景变得更加复杂,转向支持实例化。

生成一个巨大的顶点和索引缓冲区,并使用索引缓冲区告诉它要使用缓冲区中的哪些顶点。您甚至可以优化以减少顶点缓冲区中重复顶点的数量(如果您有很多重叠),但即使是简单的实现也应该更快。

如果您想渲染大量变换的形状,使用顶点着色器是将处理挑战转移到设计用于并行处理它的设备的好方法。

一旦你使用着色器而不是固定功能管道,你可以将信息与每个顶点一起传递(可能在 Z 值或纹理坐标中对其进行编码)告诉 GPU 当像素着色器最终被光栅化为时要在像素着色器中做什么屏幕(例如更改图元的颜色)。

无论哪种方式,您的目标都是显着减少发送到 GPU 和从 GPU 发送的次数,因为每次使状态“不同步”时都要付出代价 - 例如,当您更改转换时。通常,每帧向卡发送一次大块比在整个帧过程中发送大量小块更快。

于 2012-05-07T22:44:05.560 回答