Приложение OpenGL Orthographic View из окна в полноэкранный режим

Я работаю над основанной на тайлах 2D-игрой OpenGL (сверху вниз, 2D-стиль Zelda) и использую орфографическую проекцию. Я хотел бы сделать эту игру как оконной, так и полноэкранной.

Лучше ли мне создавать функции масштабирования 2D-рисования, чтобы размеры плиток можно было масштабировать, когда они рисуются в полноэкранном режиме, или я должен просто спроектировать игру полностью для оконного режима, а затем масштабировать ВСЮ область рисования всякий раз, когда игрок находится в полноэкранный режим?

В конце концов, я надеюсь сохранить наилучшее качество текстур при изменении масштаба моих плиток.

ОБНОВЛЕНИЕ/ПОЯСНЕНИЕ. Вот мое беспокойство (которое может быть, а может и не быть реальной проблемой): если я нарисую всю область холста размером с оконный вид, а затем увеличу ее, возможно, я уменьшу масштаб? исходные текстуры 128x128 пикселей до текстур оконного размера 64x64 пикселей, а затем снова масштабировать их до 80x80, когда я масштабирую всю игровую область для полноэкранного просмотра?

Другая справочная информация: я делаю эту игру, используя Java/LWJGL, и я рисую с помощью функций OpenGL 1.1.


person hithere    schedule 16.01.2012    source источник
comment
не свернуть? от 128x128px   -  person rkmax    schedule 16.01.2012
comment
Хорошая точка зрения. Я изменю вопрос, спасибо!   -  person hithere    schedule 16.01.2012
comment
В чем именно ваша проблема?   -  person rkmax    schedule 16.01.2012
comment
В основном я просто пытаюсь выяснить, включает ли полноэкранный режим отрисовку всех моих игровых изображений в большем размере или отрисовку всего в одном размере, но с изменением проекционной матрицы. Ответ Луки был именно тем, что я надеялся увидеть!   -  person hithere    schedule 16.01.2012


Ответы (1)


Не масштабируйте плитки, потому что ваше полноэкранное окно больше обычного, а поиграйте с матрицей проекции.

Окно становится больше? Увеличьте параметры, используемые для построения проекционной матрицы.

Если вы хотите, чтобы размер плитки был пропорционален размеру окна, не изменяйте матрицу проекции в зависимости от размера окна!

Ключевым моментом является, если вы еще не уловили, матрица проекции: благодаря ей вершины проецируются на окно просмотра, фактически вершины «масштабируются», что позволяет вам выбрать подходящую систему единиц, не беспокоясь о масштабировании.


В двух словах, орфографическая проекция задается из 4 параметров: слева, справа, снизу и сверху. Эти параметры не что иное, как координаты XY вершины, спроецированные на границы экрана окна (на самом деле область просмотра).

Приведем конкретный пример.

Пример 1

Размер окна: 400 x 300.

Положение вершины OpenGL (2D): 25 x 25

Матрица ортогональной проекции: - Слева = 0 - Справа = 400 - Снизу = 0 - Сверху = 300

Матрица представления модели настроена на идентичность

--> Точка будет отрисовываться размером 25x25 в координатах окна

Пример 2

Размер окна: 800 x 600 (удвоено по сравнению с примером 1).

Положение вершины OpenGL (2D): 25 x 25

Матрица ортогональной проекции: - Слева = 0 - Справа = 400 - Снизу = 0 - Сверху = 300

Матрица представления модели настроена на идентичность

--> Точка будет отрисовываться размером 50x50 в координатах окна. Он удваивается, потому что орфографическая проекция не изменилась.

Пример 3

Допустим, я хочу спроецировать вершину в примере 1, даже если соотношение сторон окна изменится. Предыдущие окна были 4:3. Окно в этом примере 16:9: оно больше! Хитрость заключается в том, чтобы установить соотношение между (право-лево) и (верх-низ)

Размер окна: 1600 x 900 (удвоено по сравнению с примером 1).

Положение вершины OpenGL (2D): 25 x 25

Матрица ортогональной проекции:

  • Слева= 0
  • Справа = 533 (300 * 16/9)
  • Внизу = 0
  • Топ = 300

Матрица представления модели настроена на идентичность

--> Точка будет отрисовываться размером 25x25 (вместо 33,3x25, если бы мы использовали матрицу проекции примера 1) в координатах окна.

person Luca    schedule 16.01.2012
comment
Спасибо, Лука! И в качестве дополнительного вопроса: есть ли у вас какие-либо предложения по правильному масштабированию моей проекционной матрицы при масштабировании на разные мониторы с разными соотношениями сторон? Прямо сейчас вид моей игры искажается, если я перехожу из оконного режима 16:9 в полноэкранный режим 3:4. Можно ли создать проекционную матрицу почтового ящика? - person hithere; 16.01.2012
comment
Спасибо за отличные примеры! Вы действительно очень помогли! :) - person hithere; 16.01.2012
comment
@ Лука, ты мне тоже очень помогаешь, потому что я учусь для своей игры ;) - person rkmax; 17.01.2012