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.x.

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

Ответ 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.

Ответ 2

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. Он должен воспроизвести это. Имейте в виду, что вся система фиксированных функций была довольно неэффективной, и это одна из причин, по которой она была устаревшей, но это может быть способ быстро работать.