【问题标题】:Render The Same Model Multiple Times多次渲染同一个模型
【发布时间】:2013-08-26 09:12:56
【问题描述】:

我想要做的,基本上是让 1 个模型被多次渲染,具有不同的平移和旋转。

所以我知道如何使用Array BuffersArray Element Buffers (Vertex Buffer Objects),我的问题是。现在,当我将模型加载到 VBO 时,如果我想用不同的平移和旋转多次渲染它,最好的方法是什么。

对于如何做到这一点,我有 2 种理论。 (虽然我在问什么是最好的方法)。

  1. 将模型加载到一个 VBO 中,然后继续调用 glDrawArrays 并为我要渲染的每个模型应用平移和旋转。

  2. 将模型多次加载到一个VBO。然后,同一个模型会被存储多次,最终会占用大量内存。

额外: 当使用 1 方式时,可以使用四叉树和/或 Frustum,这将最大限度地减少需要渲染的模型数量。 em>

如果我想要高 FPS 并且仍然尽可能节省最多的内存量,那么这些方法中的哪一种是最好的,还是有另一种更好的方法?

只是为了澄清我不是在问如何使用 VBO's 进行渲染或一般如何渲染,我是在问当你想多次渲染同一个模型时,最好的方法是什么。 em>

测试模型

这只是测试模型的图像。

编辑

我目前使用的是 OpenGL 版本 4.2.0,并且我在 Windows 桌面计算机上使用它。

【问题讨论】:

  • 哦,抱歉,我编辑了标签,我的意思是桌面版 OpenGL。
  • 实际上,如果你想以最有效的方式做到这一点,你会使用实例化。请参阅:opengl.org/wiki/Vertex_Rendering#Instancing,其想法是使用 Uniform Buffer Objects 存储变换信息数组,您可以使用实例 ID 在顶点着色器中对其进行索引。
  • 抱歉简洁,明天有时间我会尝试写一个正式的解释。不过我现在要说这个——你的最终解决方案将取决于你的目标 OpenGL 版本,而你没有在你的问题中列出它;否则很好的问题! >> 实例化在 3.1(dx10 类硬件)中成为 OpenGL 的核心功能。
  • 哦,我不知道实例化是一回事。尽管您无法在所有实例上执行四叉树和/或截锥体剔除。
  • 对矩阵使用具有统一缓冲区的实例化渲染。

标签: performance opengl 3d rendering


【解决方案1】:

为了尽量减少绘图调用和制服传输,您可以使用glDrawArrayInstanced()。这样,您可以在单个绘图调用中提交任意数量的原始对象实例!您可以将每个实例的矩阵打包到 UBO(统一缓冲区对象)并使用gl_InstanceID访问每个实例的顶点着色器中的对象

【讨论】:

  • 虽然使用它时,使用四叉树和/或截锥体剔除是不可能的。因此,如果我有 10K 模型,那么我可能会得到一个低帧率,使用这种方式。
  • 您可以在 shaders.Google 中为它剔除几何图形;)
  • 事实上,你甚至可以用 CPU 方法来剔除它。在绘制调用之前,你可能已经知道哪个对象会在截锥体之外(针对实例矩阵进行测试)。所以,在截锥体之外的实例不应该提交。就是这样。
猜你喜欢
  • 1970-01-01
  • 2014-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 2019-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多