高效的DirectX渲染

时间:2012-05-07 20:03:16

标签: c# graphics directx sharpdx

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

目前,我有一个用于EACH三角形的顶点缓冲区,在每个渲染中我设置了流源并在巨型for循环中绘制基元。对于实验,我尝试制作一个包含单个三角形的顶点缓冲区,而在另一个for循环中,我将改变世界变换并绘制基元。表现太可怕了。

我真正需要的是一些方法来存储几个独特的形状(大约100个),并在全世界标记几千或10,000多次。我还希望能够改变单个形状实例的颜色。我不需要花哨的灯光/纹理/或类似的东西。只是一个简单的颜色。

那么,实现这一目标的典型DirectX方法是什么?

1 个答案:

答案 0 :(得分:1)

你可以使用一些技巧;我首先调查index buffers,然后转向instancing支持,因为你的场景变得更加复杂。

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

如果要渲染大量变换后的形状,使用顶点着色器是将处理挑战卸载到设计为并行处理它的设备的好方法。

一旦使用着色器而不是固定功能管道,您可以将信息与每个顶点一起传递(可能在Z值或纹理坐标中对其进行编码),告诉GPU在像素着色器中如何处理最后栅格化为屏幕(例如,更改基元的颜色)。

无论哪种方式,您都希望显着减少发送到GPU和从GPU发送的次数,因为每次使状态“不同步”时都要支付罚金 - 例如,当您更改了转换时。通常,每帧发送一次巨大的肿块比在框架上发送大量的小块更快。