Из того, что я прочитал, видно, что 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.