OpenGL或DirectX中3d几何存储和使用的一般方案

时间:2015-12-21 22:53:35

标签: opengl opengl-es 3d geometry gpu

我知道OpenGL只是轻微的,所有这些文档和教程都很难阅读所以我没有帮助..我有一些愿景,虽然它如何工作,只想澄清或验证我的愿景

我假设3D世界是从3d网格构建的,每个网格可以保存在某个数组或少数数组中(存储该网格的几何体)。我还假设某些网格可能像克隆一样被使用不止一次在现场..所以在我的wision我得到50个网格,但其中一些被使用不止一次...让我们说这些克隆我会命名为网格的一个实例(每个网格可能有0个实例,1个实例或更多实例)

这个愿景好吗?还可以添加一些吗?

我知道每个实例都应该有自己的位置和方向,那么我们是否有一些实例数组,每个元素包含一个pos-oriantation矩阵?或仅存在于代码分支中的thiose矩阵(你知道我的意思是,我设置了这样的矩阵然后发送一个网格,然后修改这个位置矩阵,然后再次发送网格,直到发送所有实例)?

这会耗尽东西的几何(非着色器)部分吗? (然后着色器部分来了,我也不太明白,在着色器上有大量的恶作剧,这个几何部分对我来说似乎更重要,等等)

有人可以验证我在这里传播的愿景吗?

1 个答案:

答案 0 :(得分:1)

所以你有一个包含一个或多个网格的模型,一个包含一个或多个组的网格,以及一个包含顶点数据的组。

模型与网格之间只有很小的差异,例如模型将包含其他数据,例如纹理将用于网格(或网格)。

网格还将包含有关如何绘制矩阵等组的数据。

组是网格的一部分,通常用于使用子矩阵移动模型的一部分。看看“骨骼动画”。

因此,传统的固定管道建议您通常会有一堆矩阵,可以推送和弹出以定义某些“子位置”。具有代表龙的模型的成像。该模型很可能包括单个网格,纹理以及绘图上的其他一些数据。在运行时,该模型将具有一些矩阵,用于定义模型的基本位置和旋转,甚至是比例。然后,当龙需要飞行时,你会移动它的翅膀。由于机翼可能相同,因此可能只有一组,但网格将包含用不同矩阵绘制两次的数据。所以模型有矩阵,然后乘以翼组矩阵来绘制机翼本身:

  • 推模型矩阵
  • 乘以龙矩阵
  • 推模型矩阵
  • 与翼矩阵相乘
  • 画翼
  • pop matrix
  • 推送矩阵
  • 乘以第二翼矩阵
  • 画第二翼
  • pop matrix
  • ...画龙的其他部分
  • pop matrix

您可以想象机翼然后被分成多个部分,每个部分再次包含一个内部相对矩阵,从而实现更深层次的矩阵使用和绘图。

然后在模型/网格的其他部分使用相同的过程。

因此,我们的想法是将尽可能少的数据放在GPU上并重用它们。因此,当加载模型时,应将所有纹理和顶点数据发送到GPU并准备使用。 CPU必须知道这些缓冲区以及它们是如何使用的。整个模型可能有一个顶点缓冲区,其中每个绘制调用将重用缓冲区的不同部分,而只是想象模式的每个主要部分都有一个缓冲区,例如机翼,头部,主体,腿部。 ..

最后,我们通常会想出一个类似共享对象的东西,其中包含绘制龙所需的所有数据,这些数据将是纹理和顶点缓冲区。然后我们有另一个龙对象,它将指出该模型并包含在场景中绘制特定龙的所有必要数据。那将包括场景中位置的矩阵数据,用于动画翅膀和其他部分的组的矩阵,可能是一些尺寸甚至一些基本颜色与原始模型相结合......还有一些状态通常存储在这里例如速度,一些AI参数甚至甚至是生命值。

所以我们最终要做的就是像foreach(dragon in dragons) dragon.draw()这样的东西,它将使用其内部数据来设置基本模型矩阵并使用所需的任何其他数据。然后draw方法将调用所有组,模型中的网格也将被绘制,直到“递归”完成并绘制整个模型。

所以,是的,数据的结构最终非常复杂,但是如果你从较小的部分开始并继续向外,它们都非常融合。

还需要处理其他运行时系统以实现平滑加载。例如,如果你在游戏中并且附近有龙,你就不会拥有龙的模型。当龙进入附近时,模型应尽可能在背景中加载,但仅在需要时(在可视范围内)绘制。然后,当龙走了,你可能不会简单地卸下模型,你必须确保所有的龙都消失了,如果有人可能会回来,甚至可能等一下。这导致了一个类似于垃圾收集器的东西。

我希望这会帮助您更好地理解。