Соотношение сторон растяжения в OpenGL

У меня проблемы с полноэкранным режимом. Я могу установить окно в 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);
}
 Thomas05 июн. 2012 г., 07:24
Как выглядит ваша проекционная матрица?

Ответы на вопрос(2)

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

 MintGrowth05 июн. 2012 г., 07:45
Я делаю это, но я не вижу никаких результатов. gluOrtho2D (0,0, ширина, высота * (ширина / высота), 0,0);
 05 июн. 2012 г., 07:51
Просто предположение - это высота и рост целые числа ширины? Возможно, вы захотите привести одно или оба к удвоению, прежде чем вычислять эту дробь, или вы, скорее всего, умножите на 1.
 MintGrowth05 июн. 2012 г., 08:08
Нет разницы. Изображения растягиваются в любом направлении по размеру окна.
 MintGrowth05 июн. 2012 г., 18:46
Я обновил свой оригинальный пост, чтобы показать скриншот того, что я вижу происходящим.
Решение Вопроса

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); 
 05 июн. 2012 г., 07:34
@Cobbal хорошая точка плохо, что добавить
 05 июн. 2012 г., 21:23
@Storm Kiernan, поэтому с glOrtho я подумал, что вы просто скажете glOrtho (0, ширина, 0, высота, близко, далеко), и это позаботится обо всех аспектах
 MintGrowth05 июн. 2012 г., 22:30
@JustinMeiners, но почему я растягиваюсь? Это нормально? Я новичок в этом, поэтому я не знаю точно, что я должен здесь искать, но кажется, что растяжение было бы плохо.
 MintGrowth05 июн. 2012 г., 18:48
Я использую Ortho, но это тот же процесс.
 05 июн. 2012 г., 07:34
не забывайтеglLoadIdentity() или матрица проекции может применять перспективы друг на друге

Ваш ответ на вопрос