2012-03-09 3 views
11

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

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

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

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

ответ

20

Из того, что я прочитал, похоже, что 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=#)), VAOs и т.д.

Например, если я начну читать эту книгу, я теряю время, если я планирую портировать движок для 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.

+0

Идеально - только то, что мне нужно. Спасибо. :) – zeboidlund

+0

Набор спецификаторов компоновки фактически доступен в ES 2.0. Вам нужно указать «#extension GL_EXT_separate_shader_objects: enable» в вашем GLSL, и вы по-прежнему используете «атрибут», а не «в». –

+1

@NicolBolas неверно. В спецификации четко указано, что «также выполняет функции ARB_explicit_attrib_location», – Speed

1

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