OpenGL-更新模型信息的最有效方法(例如模型矩阵)
OpenGL - Most efficient way to update model info (e.g. model matrix)
所以可以说我已经将OpenGL的常规缓冲器对象工作流程化为模型类。我需要做的是要在OpenGL上下文中出现3D模型,就是初始化模型对象,将其添加到容器中,并将所有模型绘制到渲染循环中的所有模型中。可以说,我的场景中有1000个型号。我现在设置模型的全局坐标的方式变得非常重要。
我知道有几种方法可以更新模型信息,例如其模型矩阵。一个人将为每个型号共享一个着色器程序,并使用GluniformMatrix4Fv在渲染循环中绘制每个模型之前,在绘制每个模型之前,为着色器设置模型矩阵。另一种方法是使每个模型对象都包含自己的着色器程序,并且该阴暗器的模型矩阵是在模型对象初始化时设置的。然后,在渲染循环中,在绘制其绘制之前的每个型号阴影程序程序中使用GluSeprogragr图。
更新模型信息(例如模型矩阵)的最有效方法是什么(我觉得我当前已知的方法极低效率)?
由于您的问题有些一般,我也会保持答案一般。
通常,在OpenGL呼叫之间发生变化的状态是昂贵的,因此通过最大程度地减少状态变化来实现最佳性能。但是,并非所有状态变化都是平等的。详尽的状态变化比其他状态更为昂贵的列表是不可能的更好的。阅读NVIDIA和AMD演示文稿(来自GDC,Siggraph等)也确实很有帮助。
对于您提出的特定问题,使用每个装有自己的矩阵的不同着色器与共享单个着色器并将矩阵设置为均匀值之前,在每个绘制呼叫之前,都将速度要慢得多。更改活动着色器需要驱动程序重新配置GPU管道的更多工作,而不是简单地将16个浮子写入GPU内存。还有其他技术可以使您可以将所有矩阵存储在一个缓冲区中,并在所有型号中使用同一着色器,并与所有型号发出单一的拉动调用。
一种方法是将所有矩阵在单个SSBO或UBO中的数组中放置。然后每个网格都有一个索引,指示其应使用哪个矩阵。该索引可能来自顶点属性(例如顶点位置的W组成部分)。
- 欧拉项目#8答案是大以获得有效答案
- 调整大小后指向元素值的指针unordered_map有效?
- 为什么是0;C++中的有效语句
- 最高有效数字侧的第N位
- QTableView:endMoveRows在模型中重置水平页眉大小
- GCC对可能有效的代码抛出init list生存期警告
- 有效地使用std::unordered_map来插入或增加键的值
- c++中O(n^(1/3))中一个数的除数的有效计数
- 使用无符号字符数组有效存储内存
- 将IBM Rhapsody模型集成到VS 2019中
- 自定义先决条件对移动分配运算符有效吗
- 旋转模型矩阵时的形状失真
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 有哪些有效的方法可以消除一组 100 万个字符串>重复数据?
- 成员函数调用和C++对象模型
- 为什么这种直接初始化有效?(C++17)
- 连接 dockerized 模型和 dockerized 数据库时出现"无法 SQLConnect"错误
- 打印 ONNXRUNTIME::图形没有模型
- OpenGL-更新模型信息的最有效方法(例如模型矩阵)
- Tensorflow模型在Python中有效,但在C++中无效