OpenGL ES 2.0 против OpenGL 3 - сходства и различия - PullRequest
11 голосов
/ 09 марта 2012

Из того, что я прочитал, видно, что OpenGL ES 2.0 не ничто , как OpenGL 2.1, что я и предполагал ранее.

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

Сюда также могут входить версии OpenGL 4.x.

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

Ответы [ 2 ]

21 голосов
/ 09 марта 2012

Из того, что я прочитал, видно, что OpenGL ES 2.0 не похож на OpenGL 2.1, как я предполагал ранее.

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

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

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

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

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

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

То, что вы, скорее всего, поймете, это удобство функций настольного GL 3.x. Например:

layout(location = 0) in vec4 position;

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

attribute vec4 position;

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

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

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

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

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

1 голос
/ 04 марта 2016

OpenGL ES 2.0 (и 3.0) - это в основном подмножество Desktop OpenGL.

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

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

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

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

...