我正在用OpenGL ES 2.0编写一个小型2D游戏引擎。它有效,但对于中等大小的场景,目前感觉有些迟钝。我设计它使每个游戏对象都是一个节点树,每个节点都是一个原始形状(三角形,正方形,圆形)。并且每个节点都可以在创建时和运行时应用任意一组转换。
为了说明,“head”节点是一个圆圈,它有一个子“hat”节点,它是一个三角形,带有平移变换以将其移动到圆的顶部。现在,在运行时,我可以通过头部的动画转换变换来移动头部,并且帽子随之移动。或者我可以通过在运行时动态地在帽子上应用旋转变换来为“帽子提示”制作动画。
在渲染时,每个节点都应用自己的静态转换(帽子向上移动),然后是任何动态转换(帽子提示),然后对每个父节点应用。每个节点有三个矩阵,每个应用的动态动画另外三个矩阵。对于深树,这会增加很多矩阵数学。
如果可能的话,这似乎是推向GPU的好事,但由于动画是动态应用的,我不知道每个节点将经历多少次变换以便编写着色器来处理它。我是OpenGL ES 2.0和游戏引擎设计的新手,并不知道所有限制。
我的问题是......
答案 0 :(得分:2)
将转换层次计算移动到GPU是一个坏主意。着色器以每个基元/每顶点/每个片段级别操作。因此,您将为绘制的每个顶点执行这些计算。效率不高。
你应该真正优化你的动画制作方式。例如,每个节点不需要3个矩阵。一个矩阵包含整个转换。每4×4矩阵 - 矩阵乘法涉及64个浮点乘法。所以每个节点都有64⁴次乘法。把它剪掉!
优化动画系统的一个好方法是分离单个参数。使用quaternios进行旋转;四元数只需要8个标量乘法,将平移存储为3个向量,与缩放相同。然后从这些部分组成单个变换矩阵。您可以将四元数直接转换为3×3左上部分,描述旋转,使用缩放矢量作为列的因子。翻译进入第4行。元素4,4是1。