gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:27:16 24 4
gpt4 key购买 nike

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

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

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

最佳答案

由于您的问题有些笼统,我也会保持笼统的回答。

一般来说,在 OpenGL 绘图调用之间更改状态的成本很高,因此通过尽量减少状态更改来实现最佳性能。然而,并非所有的状态变化都是平等的。详尽列出哪些状态更改比其他状态更改成本更高是不可能的,因为它们的成本在供应商、驱动程序版本等之间变化。对完整的 OpenGL 管道和计算机硬件的工作方式的良好理解可以提供哪些代码路径的直觉。更好的。阅读专注于优化图形引擎性能的 Nvidia 和 AMD 演示文稿(来自 GDC、Siggraph 等)也非常有帮助。

对于您提出的具体问题,使用不同的着色器(每个着色器都包含自己的矩阵)很可能比共享单个着色器并在每次绘制调用之前将矩阵设置为统一值要慢得多。更改事件着色器需要驱动程序做更多的工作来重新配置 GPU 管道,而不是简单地将 16 个 float 写入 GPU 内存。还有其他技术可以让您将所有矩阵存储在单个缓冲区中,并在所有模型使用相同着色器的情况下对它们发出单个绘制调用。

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

关于c++ - OpenGL - 更新模型信息的最有效方式(例如模型矩阵),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47520391/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com