opengles 2.0 2D场景图实现

时间:2011-09-02 08:01:33

标签: opengl-es shader

我想创建一个2d opengles引擎用于我的应用程序。该引擎应支持场景图。图的每个节点都可以根据它的父节点拥有自己的着色器,纹理,材质和变换矩阵。但我是opengles 2.0的新手,所以我有一些问题:

  1. 矩阵乘法如何在opengles 2.0中运行?这是绘制第一个父项的好方法,然后是它的子节点(它会在乘以modelview矩阵时给出一些优化)。矩阵乘法在哪里发生?我应该在CPU上还是在GPU上这样做。
  2. 根据它使用的着色器,然后是纹理和材质,是一种更好的方法来绘制节点吗?在这种情况下我应该如何实现场景图转换(在CPU或GPU上以及如何实现)?

1 个答案:

答案 0 :(得分:4)

  

矩阵乘法如何在opengles 2.0中运行?这是绘制第一个父项的好方法,然后是它的子节点(它会在乘以modelview矩阵时给出一些优化)。矩阵乘法在哪里发生?我应该在CPU上还是在GPU上这样做。

除了一些古老的SGI机器,转换矩阵乘法总是在CPU上进行。虽然可以在着色器中进行矩阵乘法,但这不应该用于实现变换层次。您应该使用或实现一个小的线性代数库。如果它是针对4x4同质转换(3D图形中使用的转换)而定制的,则可以在1k行的C代码中实现。

不是依赖旧的OpenGL矩阵堆栈(已弃用并从以后的版本中移除),而是为转换堆栈中的每个级别创建当前矩阵的副本,对其应用下一个转换并提供新矩阵转型制服。

  

根据它使用的着色器,然后是纹理和材质,它是一种更好的方法来绘制节点吗?在这种情况下,如何实现场景图转换(在CPU或GPU上以及如何实现)?

通常使用两阶段渲染方法。在第一阶段,您将收集有关要绘制的对象和绘图输入数据(着色器,纹理,转换矩阵)的所有信息,并将其放入列表中。然后根据某些条件对该列表进行排序。人们希望最大限度地降低州改变的总成本。

最昂贵的状态更改是切换纹理,因为这会使缓存无效。在纹理单元之间交换纹理有一些成本,但它仍然比切换着色器便宜,这使得执行路径预测器的状态无效。然而,改变统一数据是非常便宜的,所以不应该急于过于频繁地换制服。因此,如果您可以通过制服进行实质性设置,那就这样做吧。但是,您必须意识到着色器中的条件代码具有性能,因此您必须平衡切换着色器的成本与条件着色器代码的成本。