【问题标题】:What is so bad about GL_QUADS?GL_QUADS 有什么不好?
【发布时间】:2011-07-10 22:15:53
【问题描述】:

我听说GL_QUADS 将在 OpenGL 版本 > 3.0 中被删除,这是为什么呢?那么我的旧程序将来会不起作用吗?我进行了基准测试,GL_TRIANGLESGL_QUADS 在渲染速度上没有区别(甚至可能是GL_QUADS 更快)。那有什么意义呢?

【问题讨论】:

  • 您已在 your 测试程序中对两者进行了基准测试,分别使用 your 硬件和 your GPU。不要假设您的结论现在和永远适用于所有 GPU。
  • @jalf:我没有投反对票,但这并不是一个真正的可回答问题。这纯粹是推测性的;除非我们中的任何人实际上是 Khronos OpenGL ARB 的成员,否则任何关于为什么要删除四边形的问题的答案都是猜测。
  • @jalf 对一个非常特殊的声明有点苛刻的评论。我真的没有在 OPs 问题中找到这个假设。
  • @Captain Giraffe:他为什么提到基准?他用它来支持他的观点,即删除 GL_QUADS 将是一个错误。因此,“那有什么意义?”行。
  • @Captain:有多苛刻?我在指出他可能考虑或可能没有考虑到的一些事情。但他说他已经对两者进行了基准测试,发现渲染速度没有差异。你不认为指出他的结果可能不像他想象的那样普遍适用吗?

标签: opengl deprecated


【解决方案1】:

关键是您的 GPU 渲染的是三角形,而不是四边形。从两个三角形构造一个矩形非常简单,因此 API 并不需要承担原生渲染四边形的能力。 OpenGL 正在经历一个重大的修整过程,削减了许多 15 年前有意义的功能,但不再与 GPU 的工作方式或 GPU 的工作方式相匹配。我相信,固定功能管道也从最新版本中消失了,因为再一次,它不再需要,并且不再与 GPU 的工作方式相匹配(可编程着色器)。

关键是 OpenGL API 可以做得越小越紧密,供应商就越容易编写健壮、高性能的驱动程序,也就越容易学会正确有效地使用 API。

几年前,几乎 OpenGL 中的任何事情都可以通过 3-5 种不同的方式来完成,这给开发人员带来了很大的负担,如果你想找出哪个实现是正确的,最佳性能。

所以他们正在尝试简化 API。

【讨论】:

  • @jalf:从技术上讲,没有十年的停滞和小更新; GLSL 几乎不是次要的。 Khronos 获得 ARB 的唯一原因(大多数 Khronos ARB 成员都是原版的成员)是因为 ARB 的前所有者 SGI 快要死了。不,停滞发生在 ARB 决定尝试重写整个 API 时。这花了 2 年时间,实际上并没有发生
  • @jalf:我同意 OpenGL 一度“与 3d 世界格格不入”。我什至写了semi-popular answer 关于他们的失败。问题是你第一次说有“十年的停滞和非常小的更新”,这是一个非常不同的事情。 ARB 的问题不是未能更新 API; ARB 的问题是 错误地 更新它。如果你走下坡路,那不是停滞...
  • @jalf,现在测试了更多,无论我有什么设置,GL_QUADS 总是更快。我尝试将所有缓冲区计数设置为相同,所有缓冲区大小设置为相同,等等。但是 GL_QUADS 总是获胜,当我将它们设置为使用完全相同数量的缓冲区时,我得到的两者之间的最低差异:三角形 33fps,四边形 36fps。那么,有没有其他人做过这样的测试?这让我想如果它更快,他们为什么要摆脱它。
  • @Rookie:但再一次,你还没有在不同的操作系统下使用不同的 GPU 测试它。您如何确定在所有这些情况下它会更快?另一个重要的一点是,OpenGL 将您的四边形转换为三角形无论如何,因为 GPU 只能渲染三角形。所以在这种情况下,OpenGL 不会做任何你自己做不到的事情,同样有效。因此,如果您的代码显示四边形更快,那么听起来您的三角形渲染代码写得不如您的四边形渲染同上。 :)
  • 这就是它被删除的原因。 15 年前,四边形与三角形一样好,因为您要么在没有专用硬件的 CPU 上渲染,要么在各种类似 GPU 的硬件上渲染,其中一些硬件本身支持四边形。但是今天,no GPU 本身就支持四边形。因此,OpenGL 在现代实现中对四边形的支持归结为它在内部将每个四边形切成两半,并渲染生成的三角形。 3d API 不需要这样做。如果你真的想要四边形,你可以很容易地定义一个外部帮助库
【解决方案2】:

人们已经很好地回答了你的问题。除了他们的回答之外,GL_QUADS 被弃用的原因之一是由于四边形的未定义性质。

例如,尝试用点(0,0,0), (1,0,0), (1,1,1), (0,1,0) 对二维正方形进行建模。这是一个扁平的四边形,一个角向上拖动。以这种方式绘制一个普通的平面正方形是不可能的。根据驱动程序,它将以一种或另一种方式分成 2 个三角形 - 这是我们无法控制的。这样的模型必须用两个三角形建模。 - 三角形的所有三个点始终位于同一平面上。

【讨论】:

  • 四边形没有“未定义的性质”,因为您可以使用它们来定义几何上不平坦的东西。谁说聚必须是平的?如果程序员想让它变平,他可以让它变平。认为并非所有在同一平面上的点都可以形成平面,这只是程序员的天真。即使使用三角形,您仍然无法实现这一目标,因此提出这一点是无关紧要的。他们显然只会用tri's来代替他们所有的poly's。他们必须。插值是平坦的。四边形只是将两个三角形与 4 个顶点而不是 6 个顶点组合在一起的一种方式。
  • 这个答案大部分是正确的,除了一些硬件,例如 SEGA Saturn 可以毫无问题地渲染这样的四边形。然而,较新的硬件无法渲染四边形,因此它们通过两个三角形来模拟它们,这在某些情况下会出现问题,就像提到的那样。
【解决方案3】:

它不会成为任何东西。与许多其他功能一样,@​​987654321@ 在 3.0 版中已弃用,在 3.1 版中删除。显然,如果您创建兼容性上下文,这一切都无关紧要。

任何人可能会就弃用它们的原因给出的任何答案都是纯粹的猜测。

【讨论】:

  • 我不确定弃用它们的答案完全是猜测 ;-) 无论如何,实际删除“次要”中的功能要激进得多。
  • @pst:现在存在主要版本以对应实际的新硬件。 GL 3.2 可以在与 3.1 和 3.0 相同的硬件上实现。但是 4.0 不能在与 3.3 相同的硬件上实现。有点像现在的 Direct3D 主要版本。
猜你喜欢
  • 1970-01-01
  • 2010-12-27
  • 2011-08-19
  • 2011-02-06
  • 1970-01-01
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
相关资源
最近更新 更多