Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OpenGL2.0ES矩阵堆栈是如何工作的?_Java_Android_Opengl Es - Fatal编程技术网

Java OpenGL2.0ES矩阵堆栈是如何工作的?

Java OpenGL2.0ES矩阵堆栈是如何工作的?,java,android,opengl-es,Java,Android,Opengl Es,我在使用OpenGL时遇到了一些性能问题。我基本上想要创建一个正方形网格。首先,我尝试在每个正方形转换为我想要的正方形的地方实现它,然后将模型和视图矩阵相乘,将其传递到着色器程序并绘制正方形。我会为每个方块做这个。在创建了大约50个方块后,帧速率将开始下降到低于我的期望值 然后我尝试了一种VBO方法,每次正方形改变位置时,我基本上都会生成一个顶点缓冲区。使用这种方法,帧速率显著提高,但当某些内容发生更改时,我有太多的延迟,因为它必须重新生成所有顶点位置 我想我需要的是一个矩阵堆栈。。。我以前使用

我在使用OpenGL时遇到了一些性能问题。我基本上想要创建一个正方形网格。首先,我尝试在每个正方形转换为我想要的正方形的地方实现它,然后将模型和视图矩阵相乘,将其传递到着色器程序并绘制正方形。我会为每个方块做这个。在创建了大约50个方块后,帧速率将开始下降到低于我的期望值

然后我尝试了一种VBO方法,每次正方形改变位置时,我基本上都会生成一个顶点缓冲区。使用这种方法,帧速率显著提高,但当某些内容发生更改时,我有太多的延迟,因为它必须重新生成所有顶点位置


我想我需要的是一个矩阵堆栈。。。我以前使用过opengl 1.1,并且会使用push/pop。我真的不理解它在做什么,以及如何复制它的概念。有谁知道矩阵堆栈的一个好例子在哪里,我可以用它作为例子?或者可能只是一个很好的解释?

您可以查看本教程,它基本上与您想要实现的相同,但是使用立方体而不是正方形。它还使用VBO:

关于矩阵,在OpenGL ES 2.0中,您不再具有任何与矩阵相关的函数,但您可以使用glmath库,该库也具有相同的功能(以及更多功能):

它是一个标题库,所以您只需要将它复制到某个地方,并将其包含在您需要的地方

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

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

你可以把它想象成由正方形组成的骨架。如果肩膀移动,手臂上的所有部分也会移动(手、手指等)。 您可以通过使用矩阵堆栈来模拟它。您可以使用所有的方块创建某种类型的树,这样每个方块都有一个“子体”列表,它将应用与父体相同的转换。然后可以递归地渲染所有正方形,如下所示:

  • 将变换应用于平方根
  • 在队列中推送转换
  • 为每个子级调用相同的渲染函数
  • 每个孩子读取队列顶部的矩阵,乘以 它通过自身的转换,将新矩阵推送到队列上,然后 给孩子们打电话
  • 在那之后,每个孩子都会弹出他们之前推过的矩阵
  • 使用glmath非常简单,只需创建矩阵队列(本例中为std:vector):

    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();