2011-09-02 74 views
2

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

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

回答

4

矩阵乘法在opengles 2.0中如何工作?这是一个很好的方法来绘制第一个父母,然后它是子节点(当模型视图矩阵相乘时它会提供一些优化)。矩阵乘法在哪里发生?我应该在CPU上还是在GPU上执行它。

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

对于转换堆栈中的每个级别,您都可以创建当前矩阵的副本,对其应用下一个转换并提供新的值,而不是依赖于旧版OpenGL矩阵堆栈(已弃用并从更高版本中删除)矩阵到变换统一。

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

通常人们使用两阶段方法来渲染。在第一阶段中,您将收集有关要绘制哪些对象以及绘图输入数据(着色器,纹理,转换矩阵)的所有信息并将其放入列表中。然后根据一些标准对该列表进行分类。人们想要最小化状态变化的总成本。

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

+0

非常感谢您的回答。您是否也可以回答这个问题:实际上,所有事情都在2D中进行,而场景图也定义了节点的zOrder。所以这个顺序在渲染时必须保持。在启用GL_DEPTH_TEST的情况下使用z值(如0.001或0.01)来优化渲染顺序是个好主意吗?否则,我将不得不使用zOrder的第一个排序标准。也许你知道更好的方法?谢谢 – Andrew

+0

使用深度测试是一种有效的方法。其实我出于性能原因推荐它。使用PowerVR技术的OpenGL-ES设备实际上不使用深度测试(这是基于图块的深度排序渲染器),但是通过任何方式进行深度测试都可以减少透支。如果未启用深度测试,则每个具有重叠基元的像素将被多次写入。随着深度测试,这个透支将会减少。理想情况下,您也可以将前后排序作为次要排序(即在所有其他排序之后)以获得最佳性能。 – datenwolf

+0

所以如此小的值不会在渲染时提供假象? – Andrew