Я сделал окно размером 800x600. Я позвонил
800x600
gluOrtho2D(-400,400,-300,300); glViewport(400,300,400,300);
и я нарисовал линию от (-100,-100) до (100,100). Я думаю, что должен увидеть строку от (0,0) до (100,100), но я получаю всю строку. Почему это?
(-100,-100)
(100,100)
(0,0)
Теоретически, glViewport не вызывает отсечения (см. Раздел 10) . Обычно весь рисунок обрезается до окна. Так как вы попросили OpenGL рисовать в области вашего окна, вам также нужно указать OpenGL обрезать координаты за пределами этого окна просмотра. Для этого вам понадобится glScissor. Тем не менее, некоторые реализации закрепляют свои рисунки в окне просмотра (подробности см. В моем комментарии).
glViewport
glScissor
Кроме того, ваша математика неверна. Ваша матрица проекции имеет ширину 800 единиц и высоту 600 единиц с центром в (0, 0). Затем он сопоставляется с частью окна шириной 400 пикселей и высотой 300 пикселей в правом верхнем углу окна.
Если вы нарисуете линию от (-100, -100) до (100, 100), она будет распространяться только на небольшую часть вашей области просмотра. Размер усеченного бруса соответствует размеру окна просмотра.
На изображении синее поле представляет собой окно, а красное поле представляет область просмотра. Черная линия должна быть линией, которую вы нарисовали.
Изображение, описывающее, что говорится в абзаце. http://img696.imageshack.us/img696/6541/opengl.png
Надеюсь, это поможет!
glViewport описывает область вашего окна, которая будет нарисована OpenGL. glOrtho или gluOrtho2D определяют систему единиц (единицы OpenGL), которые вписываются в эту (через определенную glViewport) область. Таким образом, ваша линия будет проведена в области просмотра от -100, -100 до 100,100