Java OpenGL2.0ES矩阵堆栈是如何工作的?
我在使用OpenGL时遇到了一些性能问题。我基本上想要创建一个正方形网格。首先,我尝试在每个正方形转换为我想要的正方形的地方实现它,然后将模型和视图矩阵相乘,将其传递到着色器程序并绘制正方形。我会为每个方块做这个。在创建了大约50个方块后,帧速率将开始下降到低于我的期望值 然后我尝试了一种VBO方法,每次正方形改变位置时,我基本上都会生成一个顶点缓冲区。使用这种方法,帧速率显著提高,但当某些内容发生更改时,我有太多的延迟,因为它必须重新生成所有顶点位置Java OpenGL2.0ES矩阵堆栈是如何工作的?,java,android,opengl-es,Java,Android,Opengl Es,我在使用OpenGL时遇到了一些性能问题。我基本上想要创建一个正方形网格。首先,我尝试在每个正方形转换为我想要的正方形的地方实现它,然后将模型和视图矩阵相乘,将其传递到着色器程序并绘制正方形。我会为每个方块做这个。在创建了大约50个方块后,帧速率将开始下降到低于我的期望值 然后我尝试了一种VBO方法,每次正方形改变位置时,我基本上都会生成一个顶点缓冲区。使用这种方法,帧速率显著提高,但当某些内容发生更改时,我有太多的延迟,因为它必须重新生成所有顶点位置 我想我需要的是一个矩阵堆栈。。。我以前使用
我想我需要的是一个矩阵堆栈。。。我以前使用过opengl 1.1,并且会使用push/pop。我真的不理解它在做什么,以及如何复制它的概念。有谁知道矩阵堆栈的一个好例子在哪里,我可以用它作为例子?或者可能只是一个很好的解释?您可以查看本教程,它基本上与您想要实现的相同,但是使用立方体而不是正方形。它还使用VBO: 关于矩阵,在OpenGL ES 2.0中,您不再具有任何与矩阵相关的函数,但您可以使用glmath库,该库也具有相同的功能(以及更多功能): 它是一个标题库,所以您只需要将它复制到某个地方,并将其包含在您需要的地方 我不确定是否完全理解您的目标,但我想您可以复制图形卡中一个正方形的数据(使用VBO),然后重复更新每个正方形的模型矩阵 如果正方形之间有某种层次结构(例如,如果其中一个移动,则其左侧的一个必须相应移动),那么矩阵堆栈的概念是有意义的 你可以把它想象成由正方形组成的骨架。如果肩膀移动,手臂上的所有部分也会移动(手、手指等)。 您可以通过使用矩阵堆栈来模拟它。您可以使用所有的方块创建某种类型的树,这样每个方块都有一个“子体”列表,它将应用与父体相同的转换。然后可以递归地渲染所有正方形,如下所示:
std::vector<glm::mat4> matrixStack;
对于绘图部分,我想您可以将顶点数组与方形顶点绑定,然后在调用glDrawArrays之前,为每个子对象更新着色器中的模型矩阵。这基本上就是我尝试做的。它们实际上从顶点缓冲区执行所有操作。他们实际上并不是通过翻译来放置每个立方体的,我需要一个例子,在每帧中进行许多翻译。我试图拆分AndEngine,因为他们正在这么做,但我不熟悉的抽象层和OpenGL对我来说太多了。他们有一个矩阵推送/弹出实现在那里,我只是不明白它到底在做什么。谢谢这解释了我需要什么。
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();