在OpenGL ES 2.0中实现固定功能管道高效?

时间:2011-02-02 13:56:27

标签: opengl-es matrix matrix-multiplication opengl-es-2.0

我想在我的openGL 2.0 App中使用固定函数方法,如glTranslate(),glRotate(),glScale()。我知道,我需要实现一个矩阵类 - 并且已经完成了这个。我现在的问题是关于效率。能够使用类似的东西:

glLoadIdentity();
glRotatef(2.0f, 0.0f, 0.0f, 1.0f);
glScalef(2.0f, 2.0f, 2.0f);

我认为,我需要做至少3次矩阵乘法(假设我们有一个投影和一个模型视图矩阵,这是模型视图)。 首先是:Identity-Matrix * Rotation-Matrix - 第二个是:ActualMatrix * ScaleMatrix,最后一个是:projectionMatrix * ActualMatrix(这个Im作为统一值传递给我的着色器)。

glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEW_PROJECTION_MATRIX], 1, GL_FALSE, matrix->getProjectionModelviewMatrix());

所以我的Vertexshader看起来像:

attribute vec4 position;
attribute vec4 color;

varying vec4 colorVarying;

uniform mat4 modelViewProjectionMatrix;

void main()
{
    gl_Position = modelViewProjectionMatrix * position;
    colorVarying = color;
}

在OpenGL ES 1.1中是否以相同的方式完成?看起来,我需要一个矩阵乘法vor:glRotate,glScale,glTranslate ......调用 - 这对我来说非常重要。或者,还有更好的方法? (可能用较少的矩阵乘法?)

对此主题的任何帮助都将非常感谢!感谢您阅读

2 个答案:

答案 0 :(得分:4)

标识,平移,旋转和缩放矩阵不需要应用全矩阵乘法,因为许多项总是0.0或1.0。如果你用这些矩阵写出乘以其他矩阵的逐个元素的结果,你会发现许多元素可能只有一些条件有助于它们的最终值。两个简单的例子:

  • 给定单位矩阵 I 和任意矩阵 M I × M = M × I = M
  • 缩放矩阵 S 中唯一的非零元素是沿对角线的四个元素,我们将其称为 S 0 S 1 S 2 S 3 。 ( S 3 对于像glScalef这样的东西总是1.0。) S × M 缩放<通过 S n i> n th M 行。 M × S 逐列工作。您还可以将单位矩阵视为特别无聊的缩放矩阵。

翻译和旋转的逐个元素表达式比这些示例复杂一点,但仍然比全矩阵乘法简单得多。 (如果旋转轴与X,Y或Z轴完全对齐,旋转也会变得更加简单。)您可能希望在要求平移,缩放或旋转时直接修改矩阵,而不是构建另一个矩阵并乘以。

答案 1 :(得分:0)