Разница между 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()
умножит текущую матрицу на матрицу ортогональной проекции. Таким образом, если начальное состояние этой матрицы неизвестно, невозможно сказать, каким будет результирующее преобразование.
Я надеюсь, что настоящий тест не будет содержать такие плохо определенные вопросы.