【问题标题】:Implement the Fixed function Pipeline efficent in OpenGL ES 2.0?在 OpenGL ES 2.0 中实现固定功能 Pipeline 高效?
【发布时间】:2011-06-20 00:03:44
【问题描述】:

我想在我的 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(这个我作为统一值传递给我的着色器)。

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...调用——这对我来说似乎很重要。或者,还有更好的方法? (也许矩阵乘法更少?)

我们将不胜感激有关此主题的任何帮助!感谢阅读

【问题讨论】:

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


    【解决方案1】:

    【讨论】:

      【解决方案2】:

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

      • 给定单位矩阵 I 和任意矩阵 M,I × M = M × I = M.
      • 缩放矩阵S中唯一的非零元素是沿对角线的四个元素,我们称之为S0, S1、S2 和 S3。 (对于像glScalef 这样的东西,S3 总是 1.0。) S × M 缩放 Sn 的 M 的第 nth 行。 M × S 改为逐列工作。您还可以将单位矩阵视为一个特别无聊的缩放矩阵。

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

      【讨论】:

      • 你能给我一些关于如何在没有矩阵乘法的情况下实现 gluLookAt 的说明吗?
      猜你喜欢
      • 1970-01-01
      • 2013-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多