java - OpenGL 2.0 ES 矩阵堆栈如何工作?

标签 java android opengl-es

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

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

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

最佳答案

您可以查看本教程,基本上与您想要实现的目标相同,但使用的是立方体而不是正方形。它还使用 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/

这是一个头文件库,所以你只需要将它复制到某个地方并包含在你需要的地方。

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

如果您的方 block 之间有某种层次结构(例如,如果其中一个移动,则其左侧的那个必须相应地移动),矩阵堆栈的概念就有意义了。

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

  1. 对根方 block 应用变换
  2. 将转换推送到队列中
  3. 为每个 child 调用相同的渲染函数
  4. 每个 child 读取队列顶部的矩阵,乘以 它通过自己的转换,将新矩阵插入队列并 给 children 打电话
  5. 之后每个 child 弹出他们之前推过的矩阵

使用 glmath 非常简单,您只需要创建一个矩阵队列(在本例中为 std:vector):

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

然后对于每个 child :

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

对于绘图部分,我猜你可以将顶点数组与正方形顶点绑定(bind),然后在调用 glDrawArrays 之前为每个 child 更新着色器中的模型矩阵。

关于java - OpenGL 2.0 ES 矩阵堆栈如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14342270/

相关文章:

java - 如何使用 OpenCSV 将 csv 导入 FX SimpleObjectProperties?

java - 如果 getLine1Number() 返回 null,则获取 Sim 号码的替代方法

android - 什么是 JNI 图形或如何使用它?

java - 如何处理Java中字符串的特定位置?

java - 如何将 JPanel 添加到 JFrame 的中心?

java - Eclipse RCP 4.10 Workbench 本地文件历史记录

iphone - 了解 iPhone OpenGL 分析

Android Camera.Parameters.getZoomRatios() 只返回 1 个值

android - 如何同时有效地读取两个 BLE 设备的温度?

android - 在六边形上映射纹理