(OpenGL) Видовой экран не изменит положение по оси y

#c #c #opengl

Вопрос:

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

 /* create viewport */
if (win->width > win->height)
    glViewport((win->width / 2 - win->viewport.width / 2), 0, win->viewport.width, win->viewport.height);
else
    /* FIXME: viewport appears at bottom of window, i have no idea why */
    glViewport(0, (win->height / 2 - win->viewport.height / 2), win->viewport.width, win->viewport.height);
 

Я изменил ряд переменных в уравнении, но ни одна из них не дала никаких результатов. Я выполнил уравнение за пределами glViewport , и оно возвращает нужные числа. OpenGL намеренно меняет положение видовых экранов на (0,0), и мне еще предстоит выяснить, почему. если это вообще поможет, я использую OpenGL 3.3 и SDL2 на машине с Windows.

Если бы кто-нибудь мог сказать мне, что мне нужно сделать, чтобы исправить это, я был бы очень признателен. Пожалуйста, и спасибо вам.

Комментарии:

1. Это работает на меня. Вы пробовали отлаживать программу, чтобы понять, имеет ли значение win->height / 2 - win->viewport.height / 2 значение?

2. я выполнил уравнение вне функции и обнаружил, что они дают желаемые результаты. возможно ли, что это может быть связано с моей системой, а не с OpenGL?

Ответ №1:

У меня тоже была аналогичная проблема с SDL2.

Я думаю, что недостающая часть заключается в том, что вы не учитываете ценность аспекта рактио.

Также, используя SDL2 с Opengl, вы должны учитывать, что область рисования может отличаться от области окна.

Предполагая, что w и h исходные размеры, draw_w и _draw_h текущий размер области рисования, view_w view_h размер области просмотра, мы можем рассчитать его как :

 SDL_GL_GetDrawableSize(window,amp;draw_w,amp;draw_h);

float ratio = (float)w/(float)h;

if(draw_w/ratio < draw_h)
{
    view_w = draw_w;
    view_h = (int)((float)view_w/ratio);
}
else
{
    view_h = draw_h;
    view_w = (int)((float)view_h*ratio);
}

x = (draw_w-view_w)/2;
y = (draw_h-view_h)/2;

glViewport(x, y, view_w, view_h);   
 

Я использовал аналогичную функцию, применяемую к событию фильтра SDL2, как :

 if(event->type==SDL_WINDOWEVENT amp;amp; (event->window.event==SDL_WINDOWEVENT_SIZE_CHANGED || event->window.event==SDL_WINDOWEVENT_EXPOSED))