Разница между glOrtho и glViewPort в openGL

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

В сценарии А

Я беру glOrtho(0,100,0,100,-100,100) а также glViewPort(0,0,50,50) когда glOrthois определяется как (left,right,bottom,top,zNear,zFar), а glViewPort определяется как (нижний левый угол x, нижний левый угол y, ширина, высота).

В сценарии Б

Я беру glOrtho(0,50,0,50,-100,100) а также glViewPort(0,0,100,100)когда glOrthois определяется как (слева, справа, снизу, сверху, zNear, zFar), а glViewPort определяется как (нижний левый угол x, нижний левый угол y, ширина, высота)

Это в основном означает, что в сценарии A изображение будет отображаться с меньшей шириной и высотой, чем требуется (т.е. будет отображаться через каждые два пикселя). В исходном изображении будет отображаться один в целевой "поверхности", но все равно будет видно все изображение.

Однако в сценарии B изображение будет обрезано, поэтому будет видна только верхняя левая четверть изображения. Я прав? - Просто чтобы быть ясно, это вопрос из теста CG, у меня завтра, и я хочу убедиться, что я получил openGL правильно... (уже читал API... =\)

2 ответа

Решение

glViewPort представлен в пиксельных единицах экрана: вот и все, он не имеет ничего общего с трехмерным миром "внутри" вашей видеокарты. Он просто сообщает, какая часть окна будет использоваться для рендеринга (или просто будет видна).

Вместо этого glOrtho изменяет "внутренний" мир и представляет собой единицы OpenGL: больше единиц OpenGL поместится в видимой части экрана, поэтому "большие" объекты легко поместятся в видимой области, если вы увеличите размер орто.

Изменение области просмотра не меняет усеченного конуса, потому что одно и то же изображение будет просто растянуто, чтобы соответствовать новому окну просмотра.

Пояснительные изображения:

Рисунок 1: окно просмотра наполовину

Рисунок 2: Если я просто удвою область просмотра, изображение будет растянуто (тот же усеченный контур, который заполняет другую поверхность)

Таким образом, единственное решение для сохранения соотношения сторон - это удвоение ортогонального размера (в этом случае я удваиваю левое и правое значения)

Рисунок 3: окончательный результат (обратите внимание, что теперь видна большая часть трехмерного мира):

Дальнейшие подробности доступны на довольно знакомом сайте по продуктам OpenGL NeHe.

Эти две вещи влияют на разные этапы конвейера преобразования координат GL. OpenGL использует усеченный вид, который в нормированном пространстве устройства представляет собой куб в диапазоне [-1,1] по всем трем измерениям. glOrtho() call обычно используется для установки матрицы проекции, которая преобразует координаты пространства глаза в пространство клипа. GL внутренне преобразуется из пространства клипа в NDC. В ортогональном случае можно даже предположить, что пространство клипа и NDC - это одно и то же. Окно просмотра описывает преобразование из NDC в пространство окна, где происходит растеризация.

Я прав? - просто чтобы быть ясно, это вопрос теста CG, у меня завтра, и я хочу убедиться, что я получил openGL правильно...

Вероятно, вы правы для случая A. В случае B, вероятно, видна левая четверть багажника. Но на самом деле вопрос остается без ответа, если никакой дополнительной информации не предоставлено. Вы говорите, что изображение имеет "ширину" и "высоту" 100. Как правило, такие размеры интерпретируются как количество пикселей в каждом направлении. Но в этом случае вопрос, по-видимому, подразумевает, что также квад, который текстурирован с изображением, визуализируется таким образом, что он будет заканчиваться в пространстве глаза от (0,0) до (100,100) (либо используя это непосредственно в качестве координат объекта или с помощью другого преобразования mdoel и / или view). Также не указано, каким образом изображение отображается, т. Е. Его можно поворачивать (что делает невозможным определить, какая часть изображения видна в сценарии B с какой-либо разумной достоверностью).

Стоит отметить, что glOrtho() умножит текущую матрицу на матрицу ортогональной проекции. Таким образом, если начальное состояние этой матрицы неизвестно, невозможно сказать, каким будет результирующее преобразование.

Я надеюсь, что настоящий тест не будет содержать такие плохо определенные вопросы.

Другие вопросы по тегам