我想在我的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 ......调用 - 这对我来说非常重要。或者,还有更好的方法? (可能用较少的矩阵乘法?)
对此主题的任何帮助都将非常感谢!感谢您阅读
答案 0 :(得分:4)
标识,平移,旋转和缩放矩阵不需要应用全矩阵乘法,因为许多项总是0.0或1.0。如果你用这些矩阵写出乘以其他矩阵的逐个元素的结果,你会发现许多元素可能只有一些条件有助于它们的最终值。两个简单的例子:
glScalef
这样的东西总是1.0。) S × M 缩放<通过 S n i> n th M 行。 M × S 逐列工作。您还可以将单位矩阵视为特别无聊的缩放矩阵。翻译和旋转的逐个元素表达式比这些示例复杂一点,但仍然比全矩阵乘法简单得多。 (如果旋转轴与X,Y或Z轴完全对齐,旋转也会变得更加简单。)您可能希望在要求平移,缩放或旋转时直接修改矩阵,而不是构建另一个矩阵并乘以。
答案 1 :(得分:0)