2010-09-01 4 views
6

У меня возникли проблемы с тем, как они работают. Во-первых, в 2-й игре матрица проекции должна быть установлена ​​как орто с левым, правым, верхним, нижним, соответствующими окну, правильно? Но когда окно изменяет размер, я должен просто изменить glViewport, а не матрицу проецирования? И как мне сохранить соотношение сторон?OpenGL - ортопроекционная матрица, glViewport

Может ли кто-нибудь объяснить цели этих двух вещей в 2-й орфографической игре, чтобы я мог лучше ее понять?

Похоже, что OpenGL делает много бесполезных вещей в настройке 2d. Растрирование и вычисление фрагментов, когда изображения уже есть, преобразование вершинных координат в NDC только для преобразования обратно в то, что они уже там, где glViewport.

Кроме того, как получить устаревший бесплатный OpenGL, мы должны создать собственные матрицы, но не наши собственные вычисления, которые делает glViewport?

Спасибо.

ответ

5

Не путайте то, что вы вводите в GL и то, что он выводит на.

параметры, которые вы используете для вычисления матрицы Ortho, являются теми, которые коррелируют с вашим входом . Выходом матрицы проекции всегда является куб [-1: 1] x [-1: 1] x [-1: 1].

viewport переводит этот куб в координаты рендеринга. Таким образом, это типично то, что вы хотите изменить, чтобы соответствовать вашему новому размеру окна (ну, и самого фреймбуфера).

Да, GL делает много бесполезных вещей для пути 2D-рендеринга. Это 3D API в конце концов ...

Я закончил, сказав, что вам не нужно создавать матрицы для 2D-преобразований, пока ваш вершинный шейдер выйдет в кубе, о котором я упоминал ранее. Если вы хотите написать верхний правый угол окна просмотра, вы всегда можете передавать свои вершины непосредственно как (0,0) (0,1) (1,0) (1,1) и просто выводить их.

+0

Спасибо, я думаю, теперь понимаю, и я вводил в заблуждение ввод с выходом. Использование проекционной матрицы просто делает ее намного проще, так как я использую координаты вершин, соответствующие пикселям окна. Материал, который он делает, на самом деле бесполезен, потому что растрирование вершин с текстурами означает, что OpenGL может масштабировать их для вас, и вы можете использовать точные позиции вершин и, например, поворачивать вещи и т. Д., И OpenGL по-прежнему является самым быстрым способом сделать это в любом случае. Я прав? – mk12

-2

Не знаете, на каком языке вы используете OpenGL, но если вы ищете C++ этот сайт, http://nehe.gamedev.net/ в значительной степени покрывает все и имеет учебные пособия от простого «Hello World» вплоть до основных игр и 3D-эффектов ,

Надеется, что это помогает

+6

Nehe учит использовать устаревший конвейер фиксированной функции, который я не хочу использовать (а также с точки зрения C++ windows). Кстати, я использую Objective C на mac. И я искал конкретный ответ. – mk12