OpenGL vs OpenGL ES 2.0 - можно ли легко портировать приложение OpenGL?

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

  1. Если я нацелен на мой фреймворк для OpenGL на рабочем столе, будет ли он просто работать без изменений в среде OpenGL ES 2.0?
  2. Если нет, то есть хороший эмулятор есть ли скрипт, который я могу запустить, который преобразует мой код OpenGL в код OpenGL ES или помечает вещи, которые не будут работать?

5 ответов


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

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

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

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

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

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

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

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


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

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

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

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


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

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

здесь Windows эмулятор.


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

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

  • Регал: что угодно ES 2.x.


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