Ответ 1
Из того, что я прочитал, похоже, что 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).
Однородные буферы - это другое. Книга использует их либерально, особенно для общих перспективных матриц. Это простая и эффективная техника для этого. Но у ES 2.0 нет этой функции; у него есть только форма для каждой программы.
Опять же, вы можете закодировать общее подмножество, если хотите. То есть вы можете преднамеренно отказаться от использования явных мест атрибутов, равномерных буферов, объектов массива вершин и т.п. Но эта книга не совсем поможет вам в этом.
Будет ли это пустой тратой времени? Ну, эта книга не для обучения вам API OpenGL 3.3 (он делает это, но это не так). В книге рассказывается о графическом программировании; просто так получается использовать API 3.3. Навыки, которые вы там узнаете (за исключением тех, которые основаны на оборудовании), передаются в любой API или систему, которую вы используете, включая шейдеры.
Положите это так: если вы не очень хорошо знаете графическое программирование, не имеет значения, какой API вы используете для изучения. После того, как вы освоите концепции, вы можете прочитать различные документы и понять, как легко применять эти концепции к любому новому API.