OpenGL ES 2.0 vs OpenGL 3-сходства и различия

из того, что я прочитал, кажется, что OpenGL ES 2.0 не ничего как OpenGL 2.1, что я предполагал раньше.

Мне интересно знать, сопоставим ли OpenGL 3 с OpenGL ES 2.0. Другими словами, учитывая, что я собираюсь сделать игровой движок для рабочего стола и Android, есть ли какие-либо различия, которые я должен знать, в частности, в отношении OpenGL 3.x+ и OpenGL ES 2.0?

Это также может включать OpenGL 4.икс версии тоже.

например, если я начну читать этой книга, я трачу свое время, если я планирую портировать двигатель на Android (используя NDK, конечно ;) )?

2 ответов


из того, что я прочитал, кажется, что OpenGL ES 2.0 не что-то вроде OpenGL 2.1, что я предполагал раньше.

определить "ничего подобного". Desktop GL 2.1 имеет множество функций, которых нет в ES 2.0. Но есть в основном общее подмножество двух, которые будут работать на обоих (хотя вам придется подделывать вещи для загрузки изображения текстуры, потому что там есть некоторые существенные различия).

рабочий стол GL 3.x обеспечивает a много функций, которые unextended ES 2.0 просто не делает. Объекты Framebuffer являются ядром в 3.x, тогда как они являются расширениями в 2.0 (и даже тогда вы получаете только один целевой образ без другого расширения). Есть обратная связь преобразования, целочисленные текстуры, однородные буферные объекты и шейдеры геометрии. Это все специфические аппаратные функции, которые либо недоступны в ES 2.0, либо доступны только через расширения. Некоторые из них могут быть специфичными для платформы.

но есть также некоторые хорошие функции удобства API доступны на рабочем столе GL 3.х. Явного расположения атрибутов (layout(location=#)), VAOs и т. д.

например, если я начну читать эту книгу, я трачу свое время, если я планирую перенести двигатель на Android (используя NDK, конечно ;) )?

это скорее зависит от того, сколько работы вы собираетесь делать и что вы готовы сделать, чтобы заставить его работать. По крайней мере, вы должны прочитать о том, что делает OpenGL ES 2.0, чтобы вы могли знать, как это отличается от рабочего стола GL.

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

то, что вы, скорее всего, попадетесь на удобство особенности рабочего стола GL 3.х. Для пример:

layout(location = 0) in vec4 position;

это невозможно в ES 2.0. Аналогичное определение было бы:

attribute vec4 position;

это будет работать в ES 2.0, но это будет не причиной быть связаны с индексом атрибут 0. Что должно быть сделано с помощью кода, используя glBindAttribLocation прежде чем программа будет связана. Desktop GL также позволяет это, но книга, с которой вы связаны, этого не делает. По очевидным причинам (это книга на основе 3.3, а не одна попытка поддерживать совместимость со старыми версиями GL).

единые буферы-это другое. Книга делает либерально использование их, особенно для общих перспективных матриц. Это простая и эффективная техника. Но ES 2.0 не имеет этой функции; у него есть только униформа для каждой программы.

опять же, вы можете закодировать общее подмножество, если хотите. То есть вы можете сознательно отказаться от использования явных местоположений атрибутов, равномерных буферов, объектов массива вершин и как. Но эта книга точно не поможет вам сделать это.

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

скажем так: если вы не знаете графики программирование очень много, не имеет значения, какой API вы используете для обучения. После того, как вы освоили концепции, вы можете прочитать различную документацию и понять, как применить эти концепции к любому новому API достаточно легко.


OpenGL ES 2.0 (и 3.0) в основном является подмножеством рабочего стола OpenGL.

самая большая разница в том, что в ES нет устаревшего фиксированного конвейера функций. Что такое конвейер фиксированных функций? Все, что связано с glVertex, glColor, glNormal, glLight, glPushMatrix, glPopMatrix, glMatrixMode, etc... в GLSL, используя любую из переменных, которые обращаются к данным фиксированной функции, как gl_Vertex, gl_Normal, gl_Color, gl_MultiTexCoord, gl_FogCoord, gl_ModelViewMatrix и различные другие матрицы из фиксированных функция конвейера.

если вы используете любой из этих функций, вы будете иметь некоторую работу. OpenGL ES 2.0 и 3.0 - это просто шейдеры. Нет " 3d " не предоставляется для вас. Вы должны написать все проекции, освещение, ссылки на текстуры и т. д. самостоятельно.

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

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