对于OpenGL ES 2.0中的任意数量的转换,您在哪里计算模型和视图矩阵?

时间:2011-07-13 14:04:00

标签: opengl-es opengl-es-2.0 game-engine

我正在用OpenGL ES 2.0编写一个小型2D游戏引擎。它有效,但对于中等大小的场景,目前感觉有些迟钝。我设计它使每个游戏对象都是一个节点树,每个节点都是一个原始形状(三角形,正方形,圆形)。并且每个节点都可以在创建时和运行时应用任意一组转换。

为了说明,“head”节点是一个圆圈,它有一个子“hat”节点,它是一个三角形,带有平移变换以将其移动到圆的顶部。现在,在运行时,我可以通过头部的动画转换变换来移动头部,并且帽子随之移动。或者我可以通过在运行时动态地在帽子上应用旋转变换来为“帽子提示”制作动画。

在渲染时,每个节点都应用自己的静态转换(帽子向上移动),然后是任何动态转换(帽子提示),然后对每个父节点应用。每个节点有三个矩阵,每个应用的动态动画另外三个矩阵。对于深树,这会增加很多矩阵数学。

如果可能的话,这似乎是推向GPU的好事,但由于动画是动态应用的,我不知道每个节点将经历多少次变换以便编写着色器来处理它。我是OpenGL ES 2.0和游戏引擎设计的新手,并不知道所有限制。

我的问题是......

  1. 我是否完全不符合“优秀”的游戏引擎设计?
  2. 这确实是CPU或GPU的任务吗?
  3. 可以编写OpenGL 2.0 ES着色器来处理符合我的“对象树”设计和运行时应用动画矩阵的任意数量的转换吗?

1 个答案:

答案 0 :(得分:2)

将转换层次计算移动到GPU是一个坏主意。着色器以每个基元/每顶点/每个片段级别操作。因此,您将为绘制的每个顶点执行这些计算。效率不高。

你应该真正优化你的动画制作方式。例如,每个节点不需要3个矩阵。一个矩阵包含整个转换。每4×4矩阵 - 矩阵乘法涉及64个浮点乘法。所以每个节点都有64⁴次乘法。把它剪掉!

优化动画系统的一个好方法是分离单个参数。使用quaternios进行旋转;四元数只需要8个标量乘法,将平移存储为3个向量,与缩放相同。然后从这些部分组成单个变换矩阵。您可以将四元数直接转换为3×3左上部分,描述旋转,使用缩放矢量作为列的因子。翻译进入第4行。元素4,4是1。