2016-03-24 3 views
4

Я пытался написать код opengl, который работает повсюду, но не слишком ограничивая меня.
Я хотел использовать opengles2 на устройствах, которые поддерживают его, и ядро ​​opengl, где поддерживается.Совместимость OpenGL с OpenGLES2

Кроме того, я хотел бы иметь возможность выбрать, какой из них использовать, во время выполнения (если доступно, конечно).

Мои вопросы:
если связать свой код с библиотекой OpenGL каждый раз, когда она доступна, а затем создать основной контекст GLES2 или GL, будет контекст GLES2 ведут себя точно так же, как и библиотеки GLESv2? Какими будут последствия этого, заголовок? Например, GLESv2 не определяет форматы текстур BGRA, поэтому, я думаю, мне придется преобразовать все в RGBA. Это не большая проблема, но мне интересно узнать об альтернативах.

Я думал о динамической загрузке библиотеки и загрузке всех используемых указателей на функции, но это огромная работа для чего-то, что может быть проще ответить. В этом случае я бы просто включил glext.h и объявил все указатели функций для используемых функций и заполнил их. Проблема здесь в том, что glext не определяет какие-либо типы данных (glenum и т. Д.), Поэтому мне всегда нужно включить gl.h. Включая оба, я получаю объявление функции gl.h И мое собственное объявление указателя функции, поэтому я не мог просто использовать общее пространство имен для указателей функций ... И даже тогда некоторые функции (например, glGetError) не кажутся чтобы связать typedef с указателем на функцию.

Я знаю о GLEW, но, к сожалению, большинство дистрибутивов Linux распространяют версию GLEW, которая до сих пор не совместима с GLES2 (debian, я смотрю на вас). Это просто segfaults.

Как вы можете сделать это человек? Любые другие подходы к связыванию функции opengl?

ответ

1

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

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

BGRA macro/enum будет частью вашей рабочей среды GLESv2, но вы обязательно не сможете использовать его во время выполнения, если ваша платформа поддерживает только RGBA.

Решения времени выполнения на основе возможностей платформы выполняются на основе списка расширений OpenGL. Сравните список расширений с использованием любого приложения, деактивируйте неподдерживаемые ветви и активируйте поддерживаемые ветки. Таким образом вы можете различать OpenGL и GLES.

Смежные вопросы