2013-01-15 53 views
3

我在OpenGL中遇到了一些性能问题。我基本上想要创建一个正方形网格。我首先尝试实现它,其中每个平方都会转换为我想要的方形,然后将模型和视图矩阵相乘,然后将其传递到着色器程序并绘制方块。我会为每个方块做这个。创建大约50格后,帧速率将开始下降至低于我的要求。OpenGL 2.0 ES矩阵堆栈如何工作?

然后我尝试了一个VBO方法,我每次在广场改变位置时基本上都会生成一个顶点缓冲区。采用这种方法后,帧速率会急剧增加,但由于必须重新生成所有顶点位置,因此在发生某些变化时我的延迟太大。

我认为我需要的是一个矩阵堆栈...我之前使用过opengl 1.1并使用push/pop。我并不真正理解那些正在做什么以及如何重现它的概念。有没有人知道矩阵堆栈的一个好例子,我可以用它作为例子?或者可能只是一个很好的解释?

回答

2

你可以查看这个教程,基本上是做同样你想达到的,但是用方块而不是方块。它采用VBO还有:

http://www.learnopengles.com/android-lesson-seven-an-introduction-to-vertex-buffer-objects-vbos/

关于矩阵,在OpenGL ES 2.0的,你没有任何矩阵相关的功能了,但你可以使用glmath库,它做同样的(和多更多):

http://glm.g-truc.net/

这是一个头库,所以你只需要在一些地方复制它,包括它在你需要它。

我不确定我是否完全理解了你的目标,但我想你可以复制一张正方形的数据(使用VBO),然后重复更新每个正方形的模型矩阵。

矩阵堆栈的概念是有意义的,如果你的方块之间有某种层次结构(例如,如果其中一个移动,左边的那个必须相应移动)。

你可以把它想象成一个由正方形构成的骨架。如果肩膀移动,手臂中的所有部分也会移动(手,手指等)。 您可以使用矩阵堆栈来模拟。你可以用你所有的方格创建某种树,这样每个方格都有一个“后代”列表,这些列表将会应用与父代相同的变换。那么你可以递归渲染所有的方块像:

  1. 应用变换的平方根(S)
  2. 推入队列变换
  3. 调用相同的渲染功能,为每一个孩子
  4. 每孩子在读队列顶部的矩阵,通过自身的变革乘以 它,推动队列中的新的矩阵和 调用孩子
  5. 后,每个孩子弹出他们
  6. 0123推前矩阵

使用glmath是很容易的,你只需要创建一个队列:矩阵(STD向量在这种情况下):

std::vector<glm::mat4> matrixStack; 

然后为每个孩子:

glm::mat4 modelMatrix = matrixStack.back(); 
glm::mat4 nodeTransform = /*apply your transform here*/ 
glm::mat4 new = modelMatrix * nodeTransform; 
matrixStack.push_back(new); 
/*Pass in the new matrix to the shader and call to glDrawArrays or whatever to render your square*/ 

for (every child) { 
    render(); 
} 
matrixStack.pop_back(); 

对于绘图部分,我想你可以将顶点数组和顶点数组绑定,然后在调用glDrawArrays之前更新着色器中每个孩子的模型矩阵。

+0

这基本上是我试图做的。他们实际上从顶点缓冲区执行所有操作。他们实际上并不通过翻译来放置每个单独的立方体 –

+0

我需要一个每帧进行多次翻译的例子。我试图拆开AndEngine,因为他们正在这样做,但我不熟悉的抽象层和OpenGL层对我来说太过分了。他们在那里有一个矩阵推/拉的实现,我只是不明白它在做什么。 –

+0

@seanwagner我用一些伪代码更新了答案 – Esparver