繁体   English   中英

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

[英]general scheme of 3d geometry storage and usage in OpenGL or DirectX

我只知道OpenGL很小,所有这些文档和教程都很难读,所以我无济于事。尽管我了解到了它如何工作,但我只想澄清或验证我的想法。

我假设3D世界是由3d网格构建的,每个网格可以保存在一个或几个数组中(存储该网格的几何形状)。.我还假设某些网格可能有点像克隆,并且在场景中使用了不止一次..所以我的智慧是我说了50个网格,但是其中一些被多次使用了……可以说我将那些克隆命名为一个网格实例(每个网格可能有0个实例,1个实例或更多实例)

这个愿景好吗? 可以添加更多吗?

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

这会耗尽零件的几何(非着色)部分吗? (然后我还不太了解的着色器部分来了,着色器上存在大量的骗局,其中此几何形状部分对我来说更重要,无论如何)

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

因此,您有一个包含一个或多个网格的模型,一个将包含一个或多个组的网格以及一个包含顶点数据的组。

模型与网格之间只有很小的差异,例如模型将包含其他数据(例如纹理),这些数据将由一个(或多个)网格使用。

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

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

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

  • 推模型矩阵
  • 与龙矩阵相乘
  • 推模型矩阵
  • 与机翼矩阵相乘
  • 抽翼
  • 流行矩阵
  • 推矩阵
  • 与第二个机翼矩阵相乘
  • 画第二翼
  • 流行矩阵
  • ...画龙的其他部分
  • 流行矩阵

您可能会想到,机翼随后被分为多个部分,每个部分又包含一个内部相对矩阵,从而实现了更深层次的矩阵使用和绘图。

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

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

最后,我们通常会想到一个共享对象之类的东西,其中包含绘制一条龙所需的所有数据,这些数据将是纹理和顶点缓冲区。 然后,我们还有另一个龙对象,它将指向该模型,并包含在场景上绘制特定龙的所有必要数据。 这将包括场景中位置的矩阵数据,用于对机翼和其他部分进行动画处理的组的矩阵,可能与原始模型组合在一起的某些大小甚至某些基本颜色。通常,一些状态也存储在此处例如速度,一些AI参数甚至是生命值。

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

因此,是的,数据的结构最终很复杂,但是如果您从较小的部分开始并继续向外,则所有内容都将非常具有史诗性。

为了平滑加载,还需要处理其他运行时系统。 例如,如果您在玩游戏并且附近有龙,则不会加载龙模型。 当龙进入附近时,应尽可能将模型加载到背景中,但仅在需要时(在可视范围内)绘制。 然后,当龙消失时,您可能不仅要卸载模型,还必须确保所有龙都消失了,如果有人返回,甚至可能要稍等片刻。 然后,这导致了类似垃圾收集器的事情。

希望这可以帮助您更好地理解。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM