【问题标题】:For an arbitrary number of transformations in OpenGL ES 2.0, where do you calculate model and view matrices?对于 OpenGL ES 2.0 中的任意数量的转换,您在哪里计算模型和视图矩阵?
【发布时间】:2011-07-13 14:03:59
【问题描述】:

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

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

在渲染时,每个节点都应用自己的静态变换(帽子向上移动),然后是任何动态平移(帽子尖),然后对每个父节点依次类推。每个节点有三个矩阵,每个应用的动态动画还有另外三个矩阵。对于深度树,这增加了很多矩阵数学。

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

我的问题是……

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-28
      • 2012-12-31
      • 1970-01-01
      • 2012-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多