OpenGL: что такое MatrixMode?

Доступно несколько доступных режимов:

Modelview
Projection
Texture
Color

Что они означают? Какой из них наиболее часто используется? Любые легкие чтения, которые вы знаете для начинающих?

Ответ 1

OpenGL использует несколько матриц для преобразования геометрии и связанных данных. Этими матрицами являются:

  • Modelview - помещает геометрию объекта в глобальное непроецируемое пространство
  • Проекция - проектирует глобальные координаты в пространстве клипов; вы можете подумать об этом как о объективе
  • Текстура - корректирует координаты текстуры раньше; в основном используется для реализации текстурной проекции (т.е. проецирования текстуры, как если бы это был слайд в проекторе).
  • Цвет - регулирует цвета вершин. Редко касался вообще

Все эти матрицы используются все время. Поскольку они соответствуют всем тем же правилам, OpenGL имеет только один набор функций манипуляции матрицами: glPushMatrix, glPopMatrix, glLoadIdentity, glLoadMatrix, glMultMatrix, glTranslate, glRotate, glScale, glOrtho, glFrustum.

glMatrixMode выбирает, на какой матрице действуют эти операции. Предположим, вы хотели написать некоторую оболочку имен на С++, это может выглядеть так:

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;
}

Позже в программе на С++ вы можете записать

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

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

    // drawing commands
}

К сожалению, С++ не может создавать пространства имен шаблонов или применять using (или with) к экземплярам (другие языки имеют это), иначе я написал что-то вроде (недопустимый С++)

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 является выражением оператора with OpenGL.

Ответ 2

В качестве опоры матричные режимы (наряду с остальной функциональностью матричного стека) устаревают в OpenGL 3.3 и выше.

Ответ 3

Все они используются внутри OpenGL, но нужно ли их изменять, зависит от вашего приложения.

Вы всегда хотите установить матрицу проецирования для определения поля обзора и экстента пространства, которое вы просматриваете. Обычно вы устанавливаете матрицу Modelview для выбора ориентации "камеры" и для размещения объектов в сцене.

Матрицы Texture и Color используются менее широко. В моем текущем проекте я использую матрицу Texture, чтобы перевернуть Y в моих растровых изображениях. Я никогда не использовал цветную матрицу лично.

Ответ 4

Здесь вы можете найти свои ответы http://www.opengl.org/sdk/docs/man/xhtml/glMatrixMode.xml

modelview предназначен для моделирования. Проекция предназначена для проецирования как 3D-материалов. Текстура для текстурирования. Цвет для окраски. Но есть нечто большее. Просто прочитайте ссылку, которую я вам даю. Приветствия.