2014-02-08 4 views
0

Я использую OpenGL для игры на основе 2D, которая была разработана для разрешения 640x480 пикселей. Таким образом, настроить мой OpenGL DoubleBuffer так:OpenGL 2D doublebuffer scaling

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(0, 640, 480, 0, 0, 1); 
glDisable(GL_DEPTH_TEST); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

Это работает очень хорошо, и я могу нарисовать все мои спрайты и фоновые скроллеры, используя аппаратное ускорение GL текстур. Теперь я хочу также поддерживать другие размеры окон, то есть пользователь должен иметь возможность запускать игру в 800x600, 1024x768 и т. Д. Таким образом, вся графика должна быть масштабирована до нового разрешения. Конечно, я мог бы сделать это, просто применяя коэффициенты масштабирования ко всем моим вершинам при рисовании текстур как квад. Но я не думаю, что смогу достичь идеального позиционирования в пикселях таким образом .... но идеальное позиционирование в пикселях, конечно, очень важно для 2D-игр!

Таким образом, я хотел бы спросить, если есть возможность работать со статическим 640х480 DoubleBuffer есть он масштабируется только до того, как обращается к экрану, то есть что-то вроде этого:

1) Мой DoubleBuffer будет всегда должно быть 640x480 пикселей, независимо от того, каков реальный размер окна вывода.

2) Как только я вызываю glfwSwapBuffers(), двойной буфер буфера 640x480 следует масштабировать до фактического размера окна, которое может быть меньше или больше 640x480.

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

Спасибо!

ответ

2

настроить мой OpenGL DoubleBuffer так:

Я думаю, что вы не знаете, что такое "DoubleBuffer" означает. Это означает, что вы выполняете рисование невидимого буфера, который затем открывается пользователю после завершения рисования, так что пользователь не видит процесс рисования.

У фрагмента кода есть установка проецирования. И жестко кодирование размеров в пиксельных единицах просто неверно.

но пиксельное идеальное позиционирование, конечно, очень важно для 2D-игр!

Нет, не совсем. Вместо блоков «пиксель» (которые на самом деле не существуют в OpenGL, кроме индексации текстурных изображений и окна просмотра), вы должны использовать что-то вроде мировой единицы. Например, в простой платформер прыгать и беги, как SMW

Super Mario World screenshot

вы могли бы сказать, что каждый блок один блок высоко. Йоси-спрайт был бы на 2 единицы выше, Марио 1.5 и так далее.

Важно то, что вы можете сохранить размеры рендеринга спрайтов независимо от разрешения экрана. Это особенно важно в отношении всех различных разрешений экрана и пропорций. Не наставляйте пользователя на разрешения , вы думаете, что подходят. У людей есть компьютеры с большими экранами, и они хотят их использовать.

Также внешний вид ваших спрайтов во многом зависит от текстурных изображений и метода фильтрации, которые вы используете. Если вы хотите достигнуть пиксельного вида, просто сделайте изображение с текстурой низким разрешением и используйте фильтр увеличения GL_NEAREST, OpenGL сделает все остальное (однако вы должны предусмотреть мик-карты minification и использовать GL_LINEAR_MIPMAP_LINEAR для минимизации, чтобы вещи не выглядели ужасно небольшие резолюции).

Таким образом, я хотел бы спросить, если есть возможность работать со статическим 640х480 DoubleBuffer есть он масштабируется только до того, как обращается к экрану, то есть что-то вроде этого:

Да , для этого можно использовать объект framebuffer. Создайте набор текстур (цвет и глубину-трафарет) размеров рендеринга (например, 640 × 480), затем, после того, как закончите рисовать цветную текстуру в квадрат заполнения окна просмотра на основном фреймбуфере.

+0

Спасибо, обращаясь к текстуре с помощью фреймбуфера, а затем рисуя эту текстуру с помощью масштабированного квадроцикла именно то, что я искал. Идея определения размеров пикселов в glOrtho2D() поступает непосредственно из MSDN, см. Здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/dd374282(v=vs.85).aspx – Andreas

+0

@ Андреас: На самом деле эти «советы правильности» взяты из «Официального руководства по программированию OpenGL» (он же Красная книга), но уже давно устарели. В любом случае эти предложения применимы только в том случае, если вам требуется идеальное выравнивание пикселей. Но вам не требуется идеальное выравнивание пикселей для того, что вы хотите сделать (идеальное выравнивание пикселей требуется для таких функций, как фильтрация экрана, пост-обработка или рисование пользовательских интерфейсов). – datenwolf

0

Как и прежде, отрисовка на 640x480, но на внеэкранную текстуру. Затем визуализируйте квадрат размером (800x600, 1024x768, ...) с этой текстурой, примененной к нему.