1

我想在我的 openGL 2.0 应用程序中使用固定函数方法,如 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());

所以我的顶点着色器看起来像:

attribute vec4 position;
attribute vec4 color;

varying vec4 colorVarying;

uniform mat4 modelViewProjectionMatrix;

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

在 OpenGL ES 1.1 中是否以同样的方式完成?看起来,我需要一个矩阵乘法:glRotate、glScale、glTranslate...调用——这对我来说似乎很重要。或者,还有更好的方法?(也许矩阵乘法较少?)

对此主题的任何帮助将不胜感激!感谢您阅读

4

2 回答 2

4

恒等、平移、旋转和缩放矩阵不需要完整的矩阵乘法来应用,因为许多项总是 0.0 或 1.0。如果您写出将其他矩阵乘以这些矩阵的逐个元素结果,您会发现许多元素可能只有少数项对其最终值有贡献。两个简单的例子:

  • 给定单位矩阵I和任意矩阵MI × M = M × I = M
  • 缩放矩阵S中唯一的非零元素是沿对角线的四个元素,我们将其称为S 0S 1S 2S 3。(对于类似的东西, S 3始终为 1.0 glScalef。)S × M将Mn行缩放S nM × S是逐列工作的。您还可以将单位矩阵视为一个特别无聊的缩放矩阵。

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

于 2011-02-03T07:53:50.543 回答
0

看看这个: http: //glm.g-truc.net/about.html

于 2011-02-02T15:50:58.933 回答