在OpenGL中绘制3D图形的最有效方法?

时间:2015-06-01 14:45:39

标签: opengl graphics 3d elements framebuffer

使用glDrawElements渲染单个GL_Triangle元素或将元素绘制到纹理然后将其渲染到另一个纹理以使用帧缓冲区构建场景是否更有效? 无论哪种方式,每次修改图形对象时都会发生这种情况,并且每次发生这种情况时都必须更新包含该对象的父对象。 谢谢 我只是创建一些更高级别的对象来轻松有效地绘制大型场景。我们的想法是拥有一个图形树,只根据需要重绘树的部分,直到我的场景中的单个立方体的根。

2 个答案:

答案 0 :(得分:2)

仅针对“损坏的”'进行更新的过程在交互式应用程序(例如,#34; Minecraft"类游戏)中正确(并且有效)地执行屏幕的部分是非常棘手的,其中“看起来像”方向经常变化。可能它永远不会更高效或内存受限,因为只是每帧渲染整个场景。

考虑相机转换变化的(常见)情况。屏幕上的每个像素都需要更新。在这种情况下,检测“损坏”是没有意义的。部分 - 整个屏幕都被损坏,在检测过程中花费的任何时间都被浪费了。

在相机不改变的情况下,需要渲染的内容的计算可能是困难且昂贵的。您需要知道移动的对象,移动到的位置以及它们在两个位置(所有屏幕空间)重叠的对象。如果您具有以编程方式转换顶点的顶点着色器(例如,考虑仅使用GPU的粒子系统模拟),则屏幕空间可能特别难以计算。

我的建议是在其他地方寻找优化机会。

答案 1 :(得分:-1)

你做不到。如果您移动相机,则需要重新绘制场景(这就是现代实时计算机图形的内容)。

请注意,如果您有透视投影,则没有例外(没有特定的动作可以帮助您避免重绘。如果您将相机向上或向左/向右翻转,您可以反转最终的图像,但这不是一个“有用”的动作。

我建议深入了解GPU后面幕后发生的事情,这样你就会感觉更好,而不是GPU。 (根据我想的矩阵图像,可以证明这一点)

如果您接受“扭曲”,那么您可以使用冒名顶替者tecnique。假设您一次渲染一批100x100x100立方体。您可以用一个大的立方体替换100x100x100立方体(只有3个可见面,您必须手动更新这3个面)。它会看起来像一个棱柱形立方体,如果你快速移动,你会觉得地平线上充满了巨大的水晶(这可能是一个很好的效果......如果需要的话)。

但我怀疑这会比渲染立方体批次慢。 (试试,你会看到)