加快OpenGL中旋转和缩放图像的绘制速度

时间:2011-09-05 17:37:43

标签: c++ performance opengl transform

我正在尝试绘制大量精灵的几种方法(例如粒子系统),我有一些不确定的结果。所以这就是我尝试过的和我拥有的: 这是绘制25k精灵:

  1. 使用常规glBegin / glEnd并使用trig计算顶点 - 17-18fps。
  2. 使用常规glBegin / glEnd,但使用glRotateglTranslateglScale转换精灵 - 14-15fps。
  3. 使用顶点数组而不是glBeginglEnd,但仍然使用trig来计算顶点位置 - 10-11fps。
  4. 使用顶点数组而不是glBeginglEnd,但使用glRotateglTranslateglScale来转换精灵 - 10-11fps。
  5. 所以我的问题是,为什么使用顶点数组比使用glBegin / glEnd要慢,而我读过(这里甚至)它应该更快?

    为什么使用你自己的三角学(在我的例子中是5 cos,5 sin,超过5个div,15次乘法和大约10次加法/减法)比使用5个函数(glPushMatrix(),{更快{1}},glTranslated()glRotated()glScaled())。我虽然它们是在GPU上完成的,但它应该更多,更快

    当绘制较少的精灵时,我确实获得了更有希望的结果。就像我绘制10k精灵一样,顶点数组可以快5fps,但仍然不一致。还要注意,这些fps总体上可以增加,因为我还有其他的计算方法,所以我并不是真正关注fps本身,而是它们之间的区别。就像顶点数组和gl变换比手动触发的glPopMatrix() / glBegin多5-10fps,那么我会很高兴,但就目前而言,它似乎不值得麻烦。他们会帮助移植到GLES(因为它没有glEnd / glBegin),但我想我会为此单独实现。

    那么有没有办法在不使用几何着色器的情况下加快速度呢?我真的不了解它们(也许是一些很棒的教程?),它们可能会破坏与旧硬件的兼容性,所以我想在不使用着色器的情况下挤出所有的果汁。

4 个答案:

答案 0 :(得分:3)

  

所以我的问题是为什么使用顶点数组比使用glBegin / glEnd慢,而我读过(这里甚至)它应该更快?

谁说他们 更慢?

您可以说,对于您的特定硬件,对于您当前的驱动程序,glBegin / glEnd较慢。你有没有在其他硬件上验证过这个?

更重要的是, 是如何绘制这些的问题。你是从顶点数组中绘制一个精灵,然后绘制另一个精灵,然后绘制另一个精灵吗?或者您通过一次glDrawArraysglDrawElements来电话来绘制所有吗?

如果你没有一次性地绘制所有这些(或者至少是一次性的大群),那么你的速度就不会像你应该的那样快。

  

为什么使用你自己的三角学(在我的例子中是5 cos,5 sin,超过5个div,15次乘法和大约10次加法/减法)比使用5个函数(glPushMatrix(),glTranslated()更快,glRotated(),glScaled(),glPopMatrix())。我虽然它们是在GPU上完成的,但它应该更快。

好吧,让我们考虑一下。 glPushMatrix不需要任何费用。 glTranslated创建一个双精度浮点矩阵,然后进行矩阵乘法glRotated执行至少一个sin和一个cos,进行一些加法和减法来计算矩阵(全部为双精度),然后进行矩阵乘法glScaled计算matix,进行矩阵乘法

每个“矩阵乘法”由16个浮点乘法和12个浮点乘法组成。既然你要求双精度数学,你可以忘记SSE矢量数学或其他什么;这是做标准数学。你正在为每个点做中的3个

GPU上发生的事情是该矩阵与顶点位置的相乘。而且由于你在更改矩阵之前只通过了4个位置,因此速度变慢并不特别令人惊讶。

答案 1 :(得分:0)

您是否考虑过使用glPoints ...()?这是他们的目的,取决于您支持的OpenGL版本。

答案 2 :(得分:0)

您是否尝试过VBO?它们是目前的标准,所以大多数卡都是对它们有利的优化。

此外:

  • 你应该使用自己的数学计算
  • 考虑尽可能多地为着色器卸载计算

你发布的fps金额与人们预期的相反 - 你可能做错了什么。你能粘贴一些渲染代码吗?

答案 3 :(得分:0)

您是否有特定理由使用双精度矩阵函数?它们通常比单精度的慢很多。