2012-06-05 3 views
2

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

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

Вот снимок экрана, что я вижу, что происходит.

image

Слева: 800х600

Справа: 1366x768

Edit # 2

функция My 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); 
} 
+1

Как выглядит ваша матрица проекции? – Thomas

ответ

4

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

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

Вам необходимо включить его в правильной форме это:

gluOrtho2D(0.0, width, 0.0, height); 

Последнее создает 2D ортогональной проекцию, которая заполняет всю ширину и высоту окна просмотра, так нет растяжения.

ОРИГИНАЛЬНЫЙ ОТВЕТ:

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

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

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

float aspectRatio = width/height; 
    glMatrixMode(GL_PROJECTION_MATRIX); 
    glLoadIdentity(); 
    gluPerspective(fov, aspectRatio, near, far); 
+0

не забывайте, что 'glLoadIdentity()' или матрица проекции могут применять перспективы друг к другу – cobbal

+0

@cobbal good point плохо добавьте, что –

+0

Я использую Ortho, но это тот же процесс. –

2

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

+0

Я делаю это, но я не вижу никаких результатов. gluOrtho2D (0,0, ширина, высота * (ширина/высота), 0,0); –

+0

Просто догадка - это целые числа высоты и ширины? Вероятно, вы хотите, чтобы один или оба были удвоены, прежде чем вычислять эту долю, или вы, вероятно, закончите mutiplying на 1. –

+0

Нет разницы. Изображения просто растягиваются в любом направлении, когда я размер окна. –

Смежные вопросы