将 glDrawElements 性能与预期的 GPU 性能进行比较?

Compare glDrawElements performance against expected GPU performance?

我正在使用 OpenGL 4.5 在集成的 Intel UHD 630 GPU 上渲染一个非常大的网格(高度图),并试图了解我获得的性能是否符合预期(诚然较低级别)GPU,或者我是否在某处做错了什么。

网格是从 1024x1024 图像生成的,结果是一个大网格:

我使用的是设置了 GL_STATIC_DRAW 的 VBO,网格仅在程序启动时上传一次。它是用单个 glDrawElements 调用绘制的。

目前我的帧时间是9ms。如果我禁用网格的 glDrawElements 调用(只留下其他较小的网格和 UI 绘图),我的帧时间会下降到 1 毫秒以下。所以几乎所有绘制时间都花在了这一大型绘制调用上。

但是,即使在这个 GPU 上,我也期待更好的性能。网格在VBO中,它已经有数据,所以我不知道为什么要花9毫秒来绘制。

有没有办法知道这个 GPU 的实际能力,以及在绘制 400 万个以上的顶点时是否需要这个帧时间?

您的 GPU 每帧必须渲染超过 200 万个三角形,这对 4 年多前问世的集成卡来说要求很高。

如果您正在研究优化性能,那么我建议如下:

不是为每个高度图像素生成一个顶点,而是生成一个更稀疏的均匀顶点网格(比方说,相隔一个世界单位)并根据它们各自的高度图值提升它们。如果您在某些高度值变化很大的区域需要更高的精度,您可以镶嵌这些特定区域,同时保持顶点密度较低的平坦区域。您可以进一步折叠位于平面上的三角形,因此在地形细节方面不会提供太多,这应该会显着减少您的顶点数,具体取决于您使用的高度图。

另一种应该在帧率方面提供非常显着提升的方法是将大网格分解成较小的网格并实施各种剔除方法,以确保仅渲染相机可见的地形块。其中最重要的是截锥体剔除,它可以让您的 GPU 不必处理数十万个无论如何永远不可见的顶点。 here.

可以找到一个很好的关于视锥体剔除的资源,它对我个人帮助很大并且很容易实现