Вопрос по opengl – Соотношение сторон растяжения в OpenGL

2

У меня проблемы с полноэкранным режимом. Я могу установить окно в 800x600, но при полном разрешении экрана оно растягивается. Я предполагаю, что это из-за изменения соотношения сторон. Как я могу это исправить?

Редактировать # 1

Вот скриншот того, что я вижу происходящим.

image

Слева: 800х600

Справа: 1366x768

Редактировать № 2

Моя функция initGraphics вызывается каждый раз, когда я изменяю размер окна (WM_SIZE).

void initGraphics(int width, int height) {
    float aspect = (float)width / (float)height;
    glViewport(0, 0, width, height);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND); //Enable alpha blending
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0, width, height * aspect, 0.0);
    glMatrixMode(GL_MODELVIEW);
}
Как выглядит ваша проекционная матрица? Thomas

Ваш Ответ

2   ответа
2

После изменения размера окна вам необходимо настроить матрицу проекции, чтобы отразить новое соотношение сторон. Если вы используете классический OpenGL, переключите режим матрицы на GL_PROJECTION, загрузите матрицу идентификаторов, затем вызовите glOrtho или gluPerspective с вертикальным измерением, масштабированным по соотношению сторон (при условии, что вы хотите, чтобы горизонтальное распространение изображения было таким же, как оно было с оригинальным окном).

Я делаю это, но я не вижу никаких результатов. gluOrtho2D (0,0, ширина, высота * (ширина / высота), 0,0); MintGrowth
Просто предположение - это высота и рост целые числа ширины? Возможно, вы захотите привести одно или оба к удвоению, прежде чем вычислять эту дробь, или вы, скорее всего, умножите на 1.
Нет разницы. Изображения растягиваются в любом направлении по размеру окна. MintGrowth
Я обновил свой оригинальный пост, чтобы показать скриншот того, что я вижу происходящим. MintGrowth
4

SOLUTION: Реальная проблема закончилась тем, что вы неправильно использовали функцию gluOrtho2D. Вместо использования этого:

gluOrtho2D(0.0, width, height * aspect, 0.0);

Вам нужно было переключить его в правильную форму:

gluOrtho2D(0.0, width, 0.0, height);

Последний создает двухмерную ортографическую проекцию, которая заполняет всю ширину и высоту вашего окна просмотра, поэтому растяжение не происходит.

ORIGINAL ANSWER:

Вам необходимо изменить свой прогноз, чтобы учесть новое соотношение сторон.

Убедитесь, что вы в первую очередь настроеныglViewport на новый размер окна. После того, как видовой экран настроен, вам нужно будет переключить режим матрицы на проекцию с вызовомglMatrixMode и, наконец, рассчитать свой новый формат изображения сwidth / height и передать новое соотношение сторонgluPerspective, Вы также можете использовать прямоglFrustum вместоgluPerspective Вы можете найти источникgluPerspective достичь того же эффекта сglFrustum.

Что-то вроде этого:

    float aspectRatio = width / height;
    glMatrixMode(GL_PROJECTION_MATRIX);
    glLoadIdentity();
    gluPerspective(fov, aspectRatio, near, far); 
@Storm Kiernan, поэтому с glOrtho я подумал, что вы просто скажете glOrtho (0, ширина, 0, высота, близко, далеко), и это позаботится обо всех аспектах
@JustinMeiners, но почему я растягиваюсь? Это нормально? Я новичок в этом, поэтому я не знаю точно, что я должен здесь искать, но кажется, что растяжение было бы плохо. MintGrowth
@Cobbal хорошая точка плохо, что добавить
Я использую Ortho, но это тот же процесс. MintGrowth
не забывайтеglLoadIdentity() или матрица проекции может применять перспективы друг на друге

Похожие вопросы