Ответ 1
Во-первых, OpenGL использует несколько систем координат, поэтому нет " системы координат OpenGL". Вы имеете в виду нормализованные координаты устройства (NDC), где все три координаты находятся в диапазоне [-1, 1]. Различные системы координат и их имена объясняются здесь, в разделе "9.011 Как преобразуются координаты? Каковы разные координатные пространства?". 1)
Во-вторых, во избежание путаницы в OpenGL термин "видовой экран" относится к той части окна, в которую вы рендерируете, и в координатах окна. В вашем вопросе вы использовали его для описания части (l, r, t, b) = (- 500, -500, 1200, 1200) вашего мира, которую вы хотите отобразить, которая находится в мировых координатах.
Вы спросили, как "рассчитать, где рисовать объекты на экране". То, что вам нужно сделать, это определить трансформацию (матрицу 4x4), которая отображает из одной системы координат в другую. Ваш 2D-мир задан в мировых координатах, поэтому вам нужно определить матрицу, которая преобразует мировые координаты в НДЦ, т.е. Матрицу проекций. В ваших шейдерах вы просто просто умножаете свои вершины на эту матрицу проекций, и вы получаете НДЦ. glm::ortho
/glOrtho
вычисляет такую проекционную матрицу. Что касается перспективной проекции, то не понятно, что вы хотите сделать, но вы должны поэкспериментировать с функциями perspective
и lookat
в glm.
Чтобы быть ясным, вы определяете вершины в любой системе координат, которую хотите (которая называется мировой системой координат), и просто нарисуйте эти вершины. Задача вершинного шейдера заключается в том, чтобы применить преобразование, которое вы определили.
Также обратите внимание, что вы указали квадрат, и обычно это не то, что вы хотите. Мониторы и большинство окон не квадратные, поэтому, если вы сопоставляете этот квадрат с типичным окном просмотра, вы получите искаженное представление о своем мире. Вам нужно учитывать соотношение сторон (ширина: высота) окна просмотра. Я попытался объяснить, что здесь.
1) В качестве побочного примечания часто задаваемые вопросы относятся к старым версиям OpenGL. В настоящее время программисты ожидаются и призваны управлять как самими моделью, так и проекционными матрицами, поскольку они нужны вам в ваших шейдерах. Я настоятельно рекомендую glm, поэтому он просто загорается, поэтому очень легко интегрируется и имеет хороший синтаксис, который отражает GLSL.