OpenGL-更新模型信息的最有效方法(例如模型矩阵)

OpenGL - Most efficient way to update model info (e.g. model matrix)

本文关键字:模型 有效 信息 更新 OpenGL- 方法      更新时间:2023-10-16

所以可以说我已经将OpenGL的常规缓冲器对象工作流程化为模型类。我需要做的是要在OpenGL上下文中出现3D模型,就是初始化模型对象,将其添加到容器中,并将所有模型绘制到渲染循环中的所有模型中。可以说,我的场景中有1000个型号。我现在设置模型的全局坐标的方式变得非常重要。

我知道有几种方法可以更新模型信息,例如其模型矩阵。一个人将为每个型号共享一个着色器程序,并使用GluniformMatrix4Fv在渲染循环中绘制每个模型之前,在绘制每个模型之前,为着色器设置模型矩阵。另一种方法是使每个模型对象都包含自己的着色器程序,并且该阴暗器的模型矩阵是在模型对象初始化时设置的。然后,在渲染循环中,在绘制其绘制之前的每个型号阴影程序程序中使用GluSeprogragr图。

更新模型信息(例如模型矩阵)的最有效方法是什么(我觉得我当前已知的方法极低效率)?

由于您的问题有些一般,我也会保持答案一般。

通常,在OpenGL呼叫之间发生变化的状态是昂贵的,因此通过最大程度地减少状态变化来实现最佳性能。但是,并非所有状态变化都是平等的。详尽的状态变化比其他状态更为昂贵的列表是不可能的更好的。阅读NVIDIA和AMD演示文稿(来自GDC,Siggraph等)也确实很有帮助。

对于您提出的特定问题,使用每个装有自己的矩阵的不同着色器与共享单个着色器并将矩阵设置为均匀值之前,在每个绘制呼叫之前,都将速度要慢得多。更改活动着色器需要驱动程序重新配置GPU管道的更多工作,而不是简单地将16个浮子写入GPU内存。还有其他技术可以使您可以将所有矩阵存储在一个缓冲区中,并在所有型号中使用同一着色器,并与所有型号发出单一的拉动调用。

一种方法是将所有矩阵在单个SSBO或UBO中的数组中放置。然后每个网格都有一个索引,指示其应使用哪个矩阵。该索引可能来自顶点属性(例如顶点位置的W组成部分)。