这是绘制许多不同的动态 3D 模型的最优化和正确的方法(它们是动画的并且每一帧都会改变)

Posted

技术标签:

【中文标题】这是绘制许多不同的动态 3D 模型的最优化和正确的方法(它们是动画的并且每一帧都会改变)【英文标题】:which is the most optimal and correct way to drawing many different dynamic 3D models (they are animated and change every frame) 【发布时间】:2013-10-31 22:38:40 【问题描述】:

我需要知道如何渲染许多不同的 3D 模型,这些模型将它们的几何形状更改为每一帧(动画模型),不要重复模型和纹理。

我携带所有模型,并为每个模型创建了一个“对象”模型类。

渲染它们的最佳方式是什么?

    为每个 3D 模型使用 1 个 VBO 为所有模型使用一个 VBO(完全不同,我认为这个选项是不可能的)

我在 Windows 上使用 OpenGL 3.x 或更高版本、C++。

【问题讨论】:

【参考方案1】:

TL; DR - 在渲染性能方面没有灵丹妙药

这是为什么呢?这取决于获取数据、转换数据、将数据推送到 GPU 以及使屏幕上的像素闪烁的复杂过程。因此,出现了一些通常可能会提高性能的指南,而不是“一种最佳方法”。

将所有必要的数据保存在 GPU 上(因为离屏幕越近,电子必须走的路越短:) 在帧之间向 GPU 发送尽可能少的数据 不要在 CPU 和 GPU 之间进行不必要的同步 (这就像试图在平行轨道上运行两列高速列车,但坚持要让它们减慢到你可以在一个而)

现在,很明显,如果你想要一个会改变的模型,你不能吃掉蛋糕。你必须做出权衡。简而言之,动态对象永远不会像静态对象那样快速渲染。那么,你应该怎么做呢?

向 GPU 提示数据使用情况(GL_STREAM_DRAWGL_DYNAMIC_DRAW)——这应该可以保证最佳的内存安排。 不要使用交错缓冲区将静态顶点属性与动态属性混合在一起 - 例如,如果您划分内存,您可以批量更新几何图形而保持纹理坐标不变。 尽量只在 GPU 上做 - 使用计算着色器和变换反馈,很可能将整个动画数据存储为缓冲区本身并在 GPU 上计算,避免昂贵的同步。

最后但同样重要的是,始终仔细衡量您的更改对性能的影响。盲目地去是没有用的。准确且彻底测量(甚至像着色器编译时间这样的东西有时也很重要!)。然后,即使您通过反复试验,也有希望到达某个地方。


特别是解决您的一个观点;是否是一个大的 VBO 和几个小的 VBO 并不重要,但一个巨大的 VBO 可能无法适应内存。你仍然可以更新它的一部分,最重要的是它内部的内存安排。

【讨论】:

感谢您的回复,也许我没有正确表达我的问题对于静态几何来说听起来“更笼统”我使用一个大 vbo(顶点缓冲区对象)并获得完美的绘图(性能),但不能找到一种我不知道如何将动态几何与 3d 模型动画(改变每一帧)一样的方法。 就OpenGL而言,我实际上为世界上的每个3D模型使用一个vbo,然后使用一个渲染函数: //indexed drawing glDrawElements(GL_TRIANGLES, m_totalVertex, GL_UNSIGNED_INT, 0);但我认为这不是最好或正确的方法......所以我问,有没有办法使用更少的 vbo'S 或其他技术来渲染许多动画 3D 模型(不同的)?也许还有另一种解决问题的方法,我在这个话题上缺乏经验看不到,所以我来找你,非常感谢。

以上是关于这是绘制许多不同的动态 3D 模型的最优化和正确的方法(它们是动画的并且每一帧都会改变)的主要内容,如果未能解决你的问题,请参考以下文章

3D 模型无法在 Scenekit 中正确加载

更改模型后未正确绘制 QML 中继器

使用 ASSIMP 和 OpenGL 加载 3D 模型时纹理不正确

使用 Matplotlib 在 3d 中绘制线性模型

Chem 3D中怎么创建立体模型

Simplygon减面工具