Почему это полноэкранный режим? Разве центр OpenGL не находится сверху слева (0, 0)? Почему с этими вершинами ничья верна? Кажется, что центр действительно является реальным центром экрана, а ширина и высота от -1 ... 1, но я не совсем понимаю, потому что я думал, что центр был в верхнем левом углу ...
Есть 3 вещи, которые собираются вместе. Так называемая область просмотра , так называемые нормализованные координаты устройства (NDC) и проекция из пространства модели в пространство глаза для отсечения пространства в пространство NDC.
Окно просмотра выбирает часть вашего окна, в которую входит диапазон NDC
[-1…1]×[-1…1]
отображается на. Сигнатура функции glViewport(x, y, width, height)
. OpenGL предполагает, что система координат с восходящими x-координатами NDC направлена вправо, а восходящие y-координаты NDC повышается.
Таким образом, если вы вызываете glViewport(0, 0, window_width, window_height)
, который также является значением по умолчанию после того, как контекст OpenGL впервые привязан к окну, координата NDC (-1, -1) будет в левом нижнем углу, а координата NDC ( 1,1) в верхнем правом углу окна.
OpenGL начинается со всех преобразований, устанавливаемых в идентичность, что означает, что координаты вершины, которые вы проходите, проходят прямо в пространство NDC и интерпретируются следующим образом. Однако большую часть времени в OpenGL вы применяете к последовательным преобразованиям:
и
Преобразование вида модели используется для перемещения по всему миру перед неподвижным глазом / камерой (которая всегда находится в (0,0,0)). Размещение камеры просто означает добавление дополнительной трансформации всего мира (просмотр трансформации), это полная противоположность тому, как вы поместите камеру в мире. Фиксированная функция OpenGL называет эту матрицу MODELVIEW , доступной, если для режима матрицы установлено значение GL_MODELVIEW.
Проекционное преобразование является своего рода объективом OpenGL. Вы используете его, чтобы установить, является ли он широким или небольшим углом (в случае перспективы) или краями кубоида (ортопроекция) или даже чем-то другим. Фиксированная функция OpenGL называет эту матрицу PROJECTION , доступной, если для режима матрицы установлено значение GL_PROJECTION.
После того, как примитивы проекции обрезаны, а затем применено так называемое однородное деление , которое создает фактический эффект перспективы, если была применена перспективная проекция.
В этот момент вершины были преобразованы в пространство NDC, которое затем отображается в окне просмотра, как объяснено в начале.
Относительно вашей проблемы: вам нужна проекция , которая отображает координаты вершин 1: 1 в пикселях области просмотра. Достаточно просто:
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if( origin_lower_left ) {
glOrtho(0, width, height, 0, -1, 1);
} else {
glOrtho(0, width, 0, height, -1, 1);
}
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
Теперь координаты вершин отображаются в пикселях области просмотра.
Обновление: рисование текстурированного квадрата полного видового экрана треугольниками:
OpenGL-2.1 и OpenGL ES-1
void fullscreenquad(int width, int height, GLuint texture)
{
GLfloat vtcs[] = {
0, 0,
1, 0,
1, 1,
0, 1
};
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, vtcs);
glTexCoordPointer(2, GL_FLOAT, 0, vtcs);
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, 1, 0, 1, -1, 1);
glMatrixMode(GL_MODELVIEW);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
}