Вы совершенно не поняли, что на самом деле сделал glMatrixMode
.Старый, устаревший конвейер фиксированных функций OpenGL содержал множество матриц, которые все использовались без разбора при рисовании.Двумя наиболее важными матрицами были:
матрица modelview , которая используется для описания преобразования из локального пространства модели в пространство просмотра.Пространство вида по-прежнему абстрактно, но его можно понимать как мир, трансформированный в координатное пространство «камеры».Расчеты освещения происходили в этом пространстве.
матрица projection , которая используется для описания преобразования из пространства просмотра в пространство клипа.Пространство клипа является промежуточной стадией непосредственно перед достижением координат устройства (в этом есть несколько важных деталей, но это не важно сейчас), что в основном включает применение однородного деления , то есть масштабирование вектора координат клипа с помощьюобратная сторона его w-компонента.
Фиксированный конвейер преобразования всегда был
position_view := Modelview · position
do illumination calculations with position_view
position_clip := Projection · position_view
position_pre_ndc := position_clip · 1/position_clip.w
В устаревшем OpenGL матрица вида и проекции всегда присутствуют.glMatrixMode
- это селектор, который из существующих матриц подвергается операциям, выполняемым функциями манипулирования матрицей.Одной из этих функций является glFrustum
, которая генерирует и умножает матрицу перспективы, то есть матрицу, которая создаст эффект перспективы через однородное разделение.
Так как же я могу получить такой же пространственный эффект здесь?Для чего это нужно?
Вы создаете матрицу перспективы нужных свойств и используете ее для преобразования атрибута вершины, который вы называете в качестве локального положения модели, в пространство клипа и передачи его в gl_Position
вывод вершинного шейдера.Обычный способ сделать это - передать представление модели и матрицу проекции как униформу.
Наиболее вершинный шейдерный GLSL-шейдер делает это так:
#version 330
uniform mat4 modelview;
uniform mat4 projection;
in vec4 pos;
void main(){
gl_Position = projection * modelview * pos;
}
Что касается генерации проекцииматрица: все популярные математические библиотеки по компьютерной графике помогли вам в этом.