Как заново создать / изменить матрицу ортографической проекции (OpenGL) - PullRequest
1 голос
/ 04 апреля 2019

Я сделал простую программу OpenGL, которая рисует 2D текстуру на экране.Когда вы изменяете размер окна, оно не корректируется должным образом, поэтому, чтобы это исправить, я просто запустил бы код матрицы проекции снова:

if (windowSizeChange)
{
    std::cout << "Window resized." << std::endl;
    std::cout << windowWidth << " " << windowHeight << std::endl;
    windowSizeChange = false;
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0, windowWidth, windowHeight, 0.0, -1.0, 1.0);
    glMatrixMode(GL_MODELVIEW);
}

Однако запуск этого кода деформирует изображение.Насколько я понимаю, чтобы сделать так, чтобы я мог рисовать 2D-как на экране, моя текстура рисуется с использованием матрицы ортографической проекции, что означает, что есть плоскость, которая "параллельна" с окном окна или что-то вроде того, на котором я рисую,Когда я пытаюсь изменить его, чтобы он соответствовал новому размеру окна, он не корректируется должным образом.Что не так с этим кодом?

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

В вашем коде вы изменяете орто-матрицу, но вам также нужно изменить glViewport:

if (windowSizeChange)
{
    glViewport(0, 0, windowWidth, windowHeight); // <-- Add this
    std::cout << "Window resized." << std::endl;
    std::cout << windowWidth << " " << windowHeight << std::endl;
    windowSizeChange = false;
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0, windowWidth, windowHeight, 0.0, -1.0, 1.0);
    glMatrixMode(GL_MODELVIEW);
}

Ортогональные матрицы, как вы сказали, просто матрица, которая в данном случае параллельнаэкран.Когда мы вызываем glOrtho, он изменяет размер матрицы, с которой мы работаем, и glViewport сообщает openGL размер области просмотра (в нашем случае нашего окна), с которой мы работаем.Как правило, вы хотите, чтобы glOrtho и glViewport имели одинаковые размеры

1 голос
/ 04 апреля 2019

Когда размер окна и кадрового буфера был изменен, вы должны отрегулировать прямоугольник области просмотра.
Прямоугольник области просмотра может быть установлен glViewport и указывает, как нормализованные координаты устройства отображаются на координаты окна. Он определяет область кадрового буфера, в которую отображаются нормализованные координаты устройства от (-1, -1) до (1, 1).

glViewport(0, 0, windowWidth, windowHeight);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, windowWidth, windowHeight, 0.0, -1.0, 1.0);
...