Подтвердить что ты не робот

OpenGL vs OpenGL ES 2.0 - Может ли приложение OpenGL быть легко перенесено?

Я работаю над игровой инфраструктурой, и я новичок в OpenGL. Большинство книг, похоже, не дают ясного ответа на этот вопрос, и я хочу развить его на рабочем столе с помощью OpenGL, но выполнить код в среде OpenGL ES 2.0. Мой вопрос двоякий:

  • Если я нацелен на свою инфраструктуру OpenGL на рабочем столе, будет ли она работать без изменений в среде OpenGL ES 2.0?
  • Если нет, тогда есть хороший эмулятор, ПК или Mac; есть ли script, который я могу запустить, который преобразует мой код OpenGL в код OpenGL ES или флаг, который не будет работать?
4b9b3361

Ответ 1

Прошло около трех лет с тех пор, как я в последний раз занимался какой-либо работой в области ES, поэтому я могу устареть или просто неправильно запомнить некоторые вещи.

  • Нет, ориентация на OpenGL для рабочего стола не равна таргетированию OpenGL ES, потому что ES является подмножеством. ES не реализует функции немедленного режима (glBegin()/glEnd(), glVertex*(),...). Вершинные массивы являются основным способом отправки материала в конвейер.

    Кроме того, это зависит от того, какой профиль вы планируете: по крайней мере, в профиле Lite, ES не нужно реализовывать функции с плавающей запятой. Вместо этого вы получаете функции фиксированной точки; думаю, 32-битные целые числа, где первые 16 бит означают цифры до десятичной точки, а следующие 16 бит означают цифры после десятичной точки.

    Другими словами, даже простой код может быть неспортивным, если он использует float (вам нужно будет заменить вызовы на функции gl*f() на вызовы gl*x()).

    Посмотрите, как вы можете решить эту проблему в пример Trolltech (в частности, файл qtwidget.cpp; пример Qt, но все же...). Вы увидите, что они делают этот вызов:

    q_glClearColor(f2vt(0.1f), f2vt(0.1f), f2vt(0.2f), f2vt(1.0f));

    Это означает заменить вызов glClearColorf(). Кроме того, они используют макрос f2vt() - значение float to vertex type - который автоматически преобразует аргумент из float в правильный тип данных.

  • В то время как три года назад я разрабатывал несколько небольших демонстраций для компании, я успешно работал с PowerVR SDK. Это для Visual С++ под Windows; Я не пробовал его под Linux (без работы с ПК).


Небольшое обновление, чтобы отразить мой недавний опыт работы с ES. (7 июня 2011 г.)

  • Сегодня платформы, вероятно, не используют профиль Lite, поэтому вам, вероятно, не нужно беспокоиться о десятичных запятых с фиксированной точкой.
  • При переносе кода вашего рабочего стола для мобильных устройств (например, iOS), вполне вероятно, вам придется делать в первую очередь эти, а не многое другое:
    • заменить glBegin()/glEnd() массивами вершин
    • замените некоторые вызовы на такие функции, как glClearColor(), с вызовами, такими как glClearColorf()
    • переписать свою систему окон и ввода
    • если вы используете OpenGL ES 2.0 для получения шейдерной функциональности, вы теперь имеете, чтобы полностью заменить конвейер с фиксированной функцией, построенный поведением с шейдерами, - по крайней мере, базовые, которые переопределяют конвейер фиксированной функции
  • Действительно важно: если ваша мобильная система не ограничена памятью, вы действительно хотите изучить использование сжатия текстур для вашего графического чипа; например, на устройствах iOS, вы будете загружать данные, сжатые PVRTC, в чип.

Ответ 2

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

Тем не менее, поскольку GLES является подмножеством настольного OpenGL, на обеих платформах можно запускать ту же программу.

Ответ 3

Я знаю два проекта для обеспечения GL-перевода между рабочим столом и ES:

  • glshim: существенный фиксированный конвейер для поддержки 1.x, базовая поддержка ES 2.x.

  • Regal: все, что требуется ES 2.x.

Ответ 4

Из моего понимания OpenGL ES является подмножеством OpenGL. Я думаю, что если вы воздерживаетесь от использования материалов немедленного режима, таких как glBegin() и glEnd(), вы должны быть в порядке. Я не много делал с OpenGL за последние пару месяцев, но когда я работал с ES 1.0, пока я не использовал glBegin/glEnd весь код, который я узнал из стандартного OpenGL.

Я знаю, что симулятор iPhone запускает код OpenGL ES. Я не уверен в Android.

Вот эмулятор Windows.

Ответ 5

Вариант 3). Вы можете использовать такую ​​библиотеку, как Qt, для обработки кода OpenGL с помощью встроенных функций оболочки. Это дает вам возможность использовать одну базу кода (или минимально разные базы кода) для OpenGL и создавать для большинства платформ, которые вы хотите. Вам не нужно было переносить его для каждой другой платформы, которую вы хотели бы поддержать. Qt может даже выбрать контекст OpenGL на основе функций, которые вы используете.