在 OpenGL 中绘制 3d 图形的最有效方法是啥?
Posted
技术标签:
【中文标题】在 OpenGL 中绘制 3d 图形的最有效方法是啥?【英文标题】:Most efficient way to draw 3d graphics in OpenGL?在 OpenGL 中绘制 3d 图形的最有效方法是什么? 【发布时间】:2015-06-01 14:45:38 【问题描述】:使用 glDrawElements 渲染单个 GL_Triangle 元素或将元素绘制到纹理然后将其渲染到另一个纹理以使用帧缓冲区构建我的场景对我来说更有效吗? 无论哪种方式,每次修改图形对象时都会发生这种情况,并且每次发生这种情况时也必须更新包含该对象的父对象。 谢谢 我只是在创建一些更高级别的对象以轻松高效地绘制大型场景。这个想法是有一个图形树,并且只根据需要重绘树的部分,直到我场景中单个立方体的根。
【问题讨论】:
还有什么建议我可以从所选视角检测整个场景何时是不透明的,这样我就不必渲染构成场景的更远的立方体了? “想想我的世界”?? 【参考方案1】:仅在屏幕的“损坏”部分进行更新的过程在交互式应用程序(例如“我的世界”类游戏)中正确(且有效)执行非常棘手,其中“查看”方向经常变化。很可能它永远不会比每帧渲染整个场景更有效或内存受限。
考虑相机变换变化的(频繁)情况。屏幕上的每个像素都需要更新。在这种情况下,检测“损坏”部分是没有意义的——整个屏幕都损坏了,在检测过程中花费的任何时间都被浪费了。
在相机不变的情况下,计算需要渲染的内容可能会很困难且代价高昂。您需要知道哪些对象移动了,它们移动到了哪里,以及它们在两个位置(所有屏幕空间)重叠的对象。如果您有以编程方式转换顶点的顶点着色器(例如,考虑仅 GPU 的粒子系统模拟),则屏幕空间可能特别难以计算。
我的建议是在别处寻找优化机会。
【讨论】:
【参考方案2】:你不能。如果您移动相机,则需要重新绘制场景(这就是现代实时计算机图形学的意义所在)。
请注意,如果您有透视投影,没有例外(没有特定的动作可以帮助您避免重绘。如果您将相机向上或向左/向右翻转,您可以反转最终图像,但无论如何这不是一个“有用”的动作)。
我建议深入了解 GPU 幕后发生的事情,以便您更好地了解 GPU 的可能和不可能。 (我想可以用矩阵图像来证明)
如果您接受“扭曲”,那么您可以使用冒名顶替者技术。假设您一次渲染一批 100x100x100 的立方体。您可以用一个大立方体替换 100x100x100 立方体(只有 3 个可见面,您必须手动更新这 3 个面)。如果你快速移动,它看起来像一个棱柱形立方体,你会觉得地平线上充满了巨大的晶体(如果需要的话,这可能是一个很好的效果)。
但我高度怀疑这会比渲染立方体批次要慢。 (试试看就知道了)
【讨论】:
以上是关于在 OpenGL 中绘制 3d 图形的最有效方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章