高效的 DirectX 渲染

本文关键字:渲染 DirectX 高效 | 更新日期: 2023-09-27 18:33:36

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

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

我真正需要的是某种方法来存储几个独特的形状(大约 100 个(,并在世界各地将它们印上 1,000 或 10,000+ 次。我还希望能够更改形状的单个实例的颜色。我不需要花哨的照明/纹理/或类似的东西。只是一个简单的颜色。

那么,实现此目的的典型 DirectX 方法是什么?

高效的 DirectX 渲染

您可以使用

一些技术来实现此目的;我将首先研究索引缓冲区,然后在场景变得更加复杂时转向实例化支持。

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

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

使用着色器而不是固定函数管道后,您可以随每个顶点一起传递信息(可能将其编码为 Z 值或纹理坐标(,告诉 GPU 当像素着色器最终栅格化到屏幕时在像素着色器中要做什么(例如,更改基元的颜色(。

无论哪种方式,您都旨在显着减少发送到 GPU 和从 GPU 发送的次数,因为每次使状态"不同步"(例如,当您更改转换时(都要支付罚款。通常,每帧向卡发送一次大块比在帧过程中发送大量小块要快。