Установить режим проецирования в OpenGL 3? - PullRequest
0 голосов
/ 12 октября 2018

В старых версиях OpenGL пространственную проекцию (где объекты становятся меньше с ростом расстояния) можно было включить с помощью вызова

glMatrixMode(GL_PROJECTION);

(по крайней мере, насколько я помню, это был вызов для включения этого режима).

В OpenGL 3 - когда этот режим медленного стека больше не используется - эта функция больше не работает.

Так как же я могу получить такой же пространственный эффект здесь?Что для этого нужно?

1 Ответ

0 голосов
/ 12 октября 2018

Вы совершенно не поняли, что на самом деле сделал 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;
}

Что касается генерации проекцииматрица: все популярные математические библиотеки по компьютерной графике помогли вам в этом.

...