#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))