Проблема glViewport - получение растянутых изображений с камеры - PullRequest
0 голосов
/ 27 февраля 2019

Здравствуйте. Я попытался разделить окно на четыре области просмотра, где я хочу визуализировать сцену в каждой области просмотра.Для простоты я упростил код, чтобы он содержал только одну камеру.Код выглядит примерно следующим образом:

void setup_trf(const PolarCoords& pc, double aspect)
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60, aspect, 0.01, 1000);
    //glFrustum(-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    double eye_x, eye_y, eye_z;
    pc.to_cartesian(eye_x, eye_y, eye_z);

    double look_x = 0;
    double look_y = 0;
    double look_z = 0;

    double up_x = 0;
    double up_y = 0;
    double up_z = 1;
    gluLookAt(
        eye_x, eye_y, eye_z,
        look_x, look_y, look_z,
        up_x, up_y, up_z);
}

void draw_scene(int w, int h) {
    glClearColor(0.0f, 0.75f, 1.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    double aspect = w / double(h);

    glViewport(0, h / 2, w / 2, h);
    setup_trf(app_state.m_polar, aspect);
    draw_sphere();

    glViewport(w / 2, h / 2, w, h);
    setup_trf(app_state.m_polar, aspect*0.5);
    draw_sphere();

    glViewport(0, 0, w / 2, h/2);
    setup_trf(app_state.m_polar, aspect);
    draw_sphere();

    glViewport(w / 2, 0, w, h / 2);
    setup_trf(app_state.m_polar, aspect);
    draw_sphere();
}

И результат следующий: просмотр сферы

Кто-нибудь знает, почему изображение растягивается в разных окнах просмотра

1 Ответ

0 голосов
/ 27 февраля 2019

1-й и 2-й параметр glViewport - это нижняя левая координата (начало координат) прямоугольника области просмотра.Но 3-й и 4-й параметры - это ширина и высота прямоугольника области просмотра, а не верхняя правая координата.

Это означает, что 3-й и 4-й параметры должны составлять половину размера окна (w/2, h/2) в каждом случае:

glViewport(0, h/2, w/2, h/2);
setup_trf(app_state.m_polar, aspect);
draw_sphere();

glViewport(w/2, h/2, w/2, h/2);
setup_trf(app_state.m_polar, aspect);
draw_sphere();

glViewport(0, 0, w/2, h/2);
setup_trf(app_state.m_polar, aspect);
draw_sphere();

glViewport(w/2, 0, w/2, h/2);
setup_trf(app_state.m_polar, aspect);
draw_sphere();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...