LINUX.ORG.RU

Как вызывать glOrtho?

 ,


0

1

Пытаюсь осознать OpenGL. Во всех найденных мною в интернете материалах при использовании OpenGL для двумерной графики при инициализации матрицы GL_PROJECTION делают как-то так:

glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho( 0.0, SCREEN_WIDTH, SCREEN_HEIGHT, 0.0, 1.0, -1.0 );
Но почему же это не делают вот так?
glOrtho( 0.0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1, 0.0, 1.0, -1.0 );
Ведь это координаты, а не длина и ширина. Второй вариант кажется мне логичным. Почему же используют первый?

★★★★★

Последнее исправление: proud_anon (всего исправлений: 1)

Я вообще glOrtho() никогда в жизни не применял, потому что в 100% случаев мне хватало gluPerspective() ну или была просто своя математическая библиотека, которая и генерировала матрицу перспективного проецирования.

1. Тебе прямо обязательно нужна ортогональная проекция?
2. Не лучше ли воспользоваться gluPerspective()? Она уровнем выше и проста в понимании.

resurtm ★★★
()
Ответ на: комментарий от resurtm

1. Тебе прямо обязательно нужна ортогональная проекция?

А почему нет?

2. Не лучше ли воспользоваться gluPerspective()? Она уровнем выше и проста в понимании.

Хм, на том уровне, на котором я пока ковыряюсь (фактически двумерные объекты), это, мне кажется, все равно. Проекция все равно не менятся потом.

proud_anon ★★★★★
() автор топика

Ведь это координаты, а не длина и ширина.

В OpenGL вершины задаются дробными коодинатами, а не номерами пикселей.

quiet_readonly ★★★★
()
Ответ на: комментарий от O02eg

glOrtho нынче не принято вызывать.

А, вижу. Она еще и успела устареть. И что же теперь вместо нее делают? А то на сайте OpenGL я вижу, что gluPerspective тоже пользоваться не рекомендуется. glFrustum тоже устарел. Вручную создавать и загружать нужную матрицу?

proud_anon ★★★★★
() автор топика
Ответ на: комментарий от x0r

сейчас набегут маргиналы 2.1 и расскажут, почему 3.0 и выше без compatibility profile не нужен.

Ну, насколько я понимаю, в «чистом» 3.0 шагу нельзя ступить без писательства собственных шейдеров. Это, конечно, надо будет в какой-то момент освоить, но блин... Сложность всего дела стремительно растет.

proud_anon ★★★★★
() автор топика
Ответ на: комментарий от proud_anon

но ведь начинается с 0, а не с -1

Не распарсил. Попробую ещё раз объяснить: (x,y) координаты пикселя в пикселях определяют координаты верхнего левого угла во вьюпорте (x*pixsize, y*pixsize), тогда целиком пиксель во вьюпорте задаётся координатами (x*pixsize, y*pixsize) - ((x+1)*pixsize, (y+1)*pixsize).

redgremlin ★★★★★
()
Ответ на: комментарий от redgremlin

И правый нижний угол правого нижнего пикселя при pixsize=1у.е.
((last_x+1), (last_y+1)) => (((SCREEN_WIDTH-1)+1), ((SCREEN_HEIGHT-1)+1)) => (SCREEN_WIDTH, SCREEN_HEIGHT)
И целиком вьюпорт от левого верхнего угла до правого нижнего получается как раз
(0, 0) - (SCREEN_WIDTH, SCREEN_HEIGHT)

redgremlin ★★★★★
()
Ответ на: комментарий от redgremlin

А, теперь понимаю, как это получается. Спасибо.

proud_anon ★★★★★
() автор топика
Ответ на: комментарий от proud_anon

в «чистом» 3.0 шагу нельзя ступить без писательства собственных шейдеров.

так и есть, но для простейшего рендеринга это 5-10 строк кода на glsl.

Это, конечно, надо будет в какой-то момент освоить

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

Сложность всего дела стремительно растет.

так только кажется на первый взгляд. единственное, что нужно будет осилить, это базовая линейная алгебра. КГ это не знание API, а эффективные алгоритмы, и OpenGL3, в котором есть данные и необходимость их помолотить на GPU, хорошо способствуют именно изучению алгоритмов а не плясок вокруг API.

x0r ★★★★★
()
Ответ на: комментарий от x0r

Если мой жалкий троллинг зацепил, то реккомендую читнуть: http://ogldev.atspace.co.uk/index.html (проще, но некоторые моменты упущены) http://www.arcsynthesis.org/gltut/ (более развернуто, но имеет смысл смотреть параллельно в предыдущий туториал) По API смотреть reference и вики http://www.opengl.org/wiki/Getting_Started

x0r ★★★★★
()
Ответ на: комментарий от x0r

КГ это не знание API, а эффективные алгоритмы

Безусловно, все это придется осваивать. Спасибо за ссылки.

Однако пока что у меня тут вполне прикладная задача с выводом двумерной графики (но только чтобы работало быстро), причем желательно с совместимостью с OpenGL 2.0 или 2.1. Хочется ее как-то быстро решить. Не думаю, что для этого требуются какие-то сложные хорошо оптимизированные алгоритмы.

proud_anon ★★★★★
() автор топика
Ответ на: комментарий от proud_anon

я б тогда взял какой нить clutter чтоли и не парился с OGL.

x0r ★★★★★
()
15 сентября 2014 г.
Ответ на: комментарий от CYB3R

А как сейчас принято делать?

Принято самому заливать нужные матрицы в шейдер и там считать координаты.

Есть какая-нибудь брошюрка по современному OpenGL?

http://www.arcsynthesis.org/gltut/

O02eg ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.