OpenGL:什么是MatrixMode?

14

有几种可用的模式:

Modelview
Projection
Texture
Color

它们是什么意思?哪一个最常用?你知道适合初学者的简单读物吗?

4个回答

17

OpenGL使用多个矩阵来变换几何图形和相关数据。这些矩阵包括:

  • Modelview——将对象几何图形放置在全局的未投影空间中。
  • Projection——将全局坐标投影到剪裁空间中;你可以把它看作是一种镜头。
  • Texture——调整纹理坐标。主要用于实现纹理投影(例如将纹理投影为投影仪中的幻灯片)。
  • Color——调整顶点颜色。很少被改动。

所有这些矩阵都经常使用。由于它们遵循相同的规则,因此OpenGL只有一组矩阵操作函数:glPushMatrixglPopMatrixglLoadIdentityglLoadMatrixglMultMatrixglTranslateglRotateglScaleglOrthoglFrustum

glMatrixMode选择哪个矩阵上执行这些操作。假设你想编写一些C++命名空间包装器,它可能看起来像这样:

namespace OpenGL {
  // A single template class for easy OpenGL matrix mode association
  template<GLenum mat> class Matrix
  {
  public:
    void LoadIdentity() const 
        { glMatrixMode(mat); glLoadIdentity(); }

    void Translate(GLfloat x, GLfloat y, GLfloat z) const
        { glMatrixMode(mat); glTranslatef(x,y,z); }
    void Translate(GLdouble x, GLdouble y, GLdouble z) const
        { glMatrixMode(mat); glTranslated(x,y,z); }

    void Rotate(GLfloat angle, GLfloat x, GLfloat y, GLfloat z) const
        { glMatrixMode(mat); glRotatef(angle, x, y, z); }
    void Rotate(GLdouble angle, GLdouble x, GLdouble y, GLdouble z) const
        { glMatrixMode(mat); glRotated(angle, x, y, z); }

    // And all the other matrix manipulation functions
    // using overloading to select proper OpenGL variant depending on
    // function parameters, and all the other C++ whiz.
    // ...
  };

  // 
  const Matrix<GL_MODELVIEW>  Modelview;
  const Matrix<GL_PROJECTION> Projection;
  const Matrix<GL_TEXTURE>    Texture;
  const Matrix<GL_COLOR>      Color;
}

在C++程序中稍后您可以这样写:

void draw_something()
{
    OpenGL::Projection::LoadIdentity();
    OpenGL::Projection::Frustum(...);

    OpenGL::Modelview::LoadIdentity();
    OpenGL::Modelview::Translate(...);

    // drawing commands
}

不幸的是,C++无法模板化命名空间,也无法在实例上应用using(或with)(其他语言支持此功能),否则我会编写类似以下内容的代码(无效的C++代码)。

void draw_something_else()
{
    using namespace OpenGL;

    with(Projection) {    // glMatrixMode(GL_PROJECTION);
        LoadIdentity();   // glLoadIdentity();
        Frustum(...);     // glFrustum(...);
    }

    with(Modelview) {     // glMatrixMode(GL_MODELVIEW);
        LoadIdentity();   // glLoadIdentity();
        Translate(...);   // glTranslatef(...);
    }

}
我认为这段(伪)代码使问题变得清晰了:glMatrixMode有点像OpenGL的with语句。

4
作为一个旁注,矩阵模式(以及矩阵堆栈功能的其他部分)在OpenGL 3.3及以上版本中已经被弃用。

2

所有这些矩阵都是由OpenGL在内部使用的,但是你是否需要更改它们取决于你的应用程序。

您总是希望设置投影矩阵以确定您的视野和所查看的空间的范围。通常,您将设置模型视图矩阵来选择您的“相机”方向,并定位场景中的对象。

纹理矩阵和颜色矩阵不常用。在我的当前项目中,我使用纹理矩阵来翻转我的位图中的Y轴。我个人从未使用过颜色矩阵。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接