О чем следует беспокоиться при изменении источника OpenGL в верхнем левом углу экрана?


11

Для самообразования я пишу 2D-платформер на C ++ с использованием SDL / OpenGL. Сначала я начал с чистого SDL, используя учебники на sdltutorials.com и lazyfoo.net, но теперь я использую SDL для создания контекста рендеринга OpenGL, а затем рендеринга с использованием функций OpenGL (в частности, непосредственного режима, но я изучаю VAO / VBOs ). Я использую SDL только для интерфейса, аудио и т. Д.

SDL использует систему координат с началом координат в верхнем левом углу экрана и положительной осью Y, направленной вниз. Это легко настроить мою ортографическую проекцию в OpenGL, чтобы отразить это.

Я знаю, что координаты текстуры - это правая система со значениями от 0 до 1 - перелистывание текстуры по вертикали перед рендерингом (ну, переверните файл перед загрузкой) приводит к текстурам, которые рендерится правильно ... что хорошо, если я рисую всю текстуру, но в конечном итоге я буду использовать наборы плиток и могу представить проблемы.

Что меня должно беспокоить с точки зрения рендеринга, когда я делаю это?

Если у кого-нибудь есть какой-либо совет или он сделал это сам и может указать на будущие подводные камни, это было бы здорово, но на самом деле любые мысли будут оценены.


1
Используете ли вы SDL для рендеринга (как в функциях блитинга SDL), или вы используете SDL для создания контекста рендеринга OpenGL, а затем используете функции рендеринга OpenGL?
Никол Болас

1
Я использую SDL для создания контекста рендеринга OpenGL и использую функции OpenGL для рендеринга. Я уточню это в вопросе.
производная

1
Возможно, если вы собираетесь использовать физическую систему, лучше посмотрите, какую систему координат она использует (правая или левая, Y-UP или Y-DOWN) и продолжайте использовать ту же. Конечно, вы можете делать такие вещи, как инвертирование силы тяжести, но я бы попробовал использовать то же самое, чтобы упростить работу.
Густаво Масиэль

Ответы:


8

«Что меня должно беспокоить с точки зрения рендеринга, когда я делаю это?» - немного. Система координат - это просто соглашение, а не жесткое и быстрое правило, и это совершенно законная и обоснованная вещь. Просто убедитесь, что вы последовательны в своем собственном использовании, и все будет работать нормально.


Большой! У меня была предчувствие, что единодушие, о которой мне нужно было беспокоиться, - это самообладание, но для меня это новая территория.
производная

1
Я должен добавить, что дорогой старый Quake сделал это еще в 1996 году, и он работал просто отлично.
Максимус Минимус

5

При работе в 2D с OpenGL я часто использую верхний левый угол в качестве источника. Это можно сделать с помощью:

glOrtho(0,      // left
        width,  // right
        height, // bottom
        0,      // top
        0,      // zNear
        1       // zFar
        );

Тем не менее, есть некоторые подводные камни при изменении источника в верхнем левом углу.

Одна ловушка, с которой я сталкивался более одного раза: glScissor()она используется для отсечения, всегда использует координаты левого нижнего угла.

Его подпись:

void glScissor( GLint x, GLint y, GLsizei width, GLsizei height )

где x, yукажите нижний левый угол ножничного бокса.

В более общем смысле все функции, которые работают в оконных координатах, используют нижний левый угол в качестве источника. Это включает в себя такие функции , как gluProject, gluUnProject, glCopyPixelsи т.д.

Но некоторые функции, например, glDrawPixelsиспользуют glRasterPosдля позиционирования и glRasterPosиспользуют объектные (т.е. преобразованные) координаты .

Если вы работаете в Linux и знаете, как его использовать man, вы можете получить копию руководств OpenGL здесь: ftp://ftp.sgi.com/sgi/opengl/doc/ Я нахожу их в реальном времени. заставки.

Также я заметил, что вы говорите «переверните файл перед загрузкой» текстур. Это не обязательно. Вместо переворачивания изображения при загрузке, просто переверните координаты текстуры, чтобы при рендеринге перейти от 1,0 до 0,0.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.