LibGdx должен ли я использовать gl30?

В конфигурации libgdx есть логическое значение useGL30. Поскольку я никогда не работал с OpenGL, я не уверен, что делает этот метод. И кстати. я должен установить его на ложь или истину? Что лучше для моей игры?


person Joza100    schedule 15.10.2017    source источник
comment
Конфигурация Android или конфигурация рабочего стола?   -  person Zoe    schedule 15.10.2017
comment
это для рабочего стола   -  person Joza100    schedule 15.10.2017


Ответы (2)


Другой ответ очень обширен, но, к сожалению, в некоторых частях неверен. Сначала отвечаю на ваши вопросы:

Вы хотите установить член config.useGL30 на false, независимо от платформы (рабочий стол или Android).

Вы не должны не устанавливать для члена config.useGL30 значение true, если только у вас нет реальной необходимости использовать функции OpenGL ES 3.0. В этом случае (если вам нужно использовать функциональность GLES3) вам нужно будет позаботиться о совместимости даже в тех местах, где вам не нужна эта функциональность.

Простая установка config.useGL30 на true не улучшит вашу игру. На самом деле, это может привести к проблемам.

Чтобы уточнить несколько вещей:

OpenGL и OpenGL ES это разные вещи, версии нельзя сравнивать. Если вы действительно хотите сравнить версии, то OpenGL ES 2.0 можно сравнить с (является подмножеством) OpenGL 4.3, а OpenGL ES 3.0 можно сравнить с (является подмножеством) OpenGL 4.5.

В этом отношении имена useGL30, Gdx.gl20, Gdx.gl30 можно считать вводящими в заблуждение, потому что 20 и 30 в этом названии на самом деле относятся к версии OpenGLES, а не к версии OpenGL. Возможно, лучшими именами были бы useGLES30, Gdx.gles20 и Gdx.gles30.

OpenGL ES 3.0 не полностью обратно совместим с OpenGL ES 2.0, что также верно для настольных компьютеров (на которых OpenGL ES эмулируется через OpenGL). Несмотря на то, что сам API совместим, это не относится к используемому языку шейдеров. Итак, если вы установите config.useGL30 на true, то велика вероятность, что ваши шейдеры больше не будут работать так, как вы ожидаете. Сюда входят шейдеры, поставляемые с libgdx (SpriteBatch, ShapeRenderer, ModelBatch и т. д.).

Таким образом, не имеет смысла устанавливать элемент useGL30 только в значение true для вашего настольного проекта, особенно если вы также не вносите другие изменения в свой код.

person Xoppa    schedule 15.10.2017
comment
Но что это за изменения в коде, которые я должен добавить? - person Joza100; 17.10.2017
comment
Как было сказано выше, вам придется (как минимум) модифицировать шейдеры. Точные изменения в вашем коде зависят от использования, а также от других соображений (включая версию контекста opengl, которую вы выбрали в своей конфигурации, если вы нацелены на рабочий стол). Это был бы другой вопрос, и он не очень подходит для раздела комментариев. - person Xoppa; 17.10.2017
comment
Не могу подтвердить это для iOS, но OpenGL ES 3 обратно совместим с GLES 2 на Android:The OpenGL ES 3.x API is backwards-compatible with the 2.0 API, which means you can be more flexible with your implementation of OpenGL ES in your application - person Zoe; 18.10.2017
comment
Возможно, вы захотите снова прочитать ответ @Zoe: хотя сам API совместим, это не относится к используемому языку шейдеров. - person Xoppa; 18.10.2017
comment
Так что вы должны: OpenGL ES 3.0 is *not* fully backwards compatible with OpenGL ES 2.0, which is also true for desktop - person Zoe; 19.10.2017
comment
Ты имеешь в виду, что я должен читать то, что написал сам? Это предложение прекрасно и правильно. Пожалуйста, давайте прекратим эту ерунду, она не добавляет ценности ответу и не помогает ОП. - person Xoppa; 19.10.2017

Из документации LwjglApplicationConfiguration< /а>:

стоит ли пытаться использовать OpenGL ES 3.0.

LibGDX использует множество функций для обеспечения совместимости на нескольких платформах. Если вы не включите этот параметр, вы не сможете использовать OpenGL 3 там, где это возможно (IIRC). По сути, этот метод позволяет использовать OpenGL ES 3. (Я думаю, что все новые компьютеры поддерживают OpenGL 3, проблема заключается в Android, где он был добавлен в API 18, и это зависит от пользовательских реализаций производителей. Я вернусь об этом позже)

Стоит проверить этот ответ, хотя вопрос немного отличается, он объясняет, как работает LibGDX:

LibGDX работает под управлением OpenGL ES2.0, который по современным меркам является устаревшим. Это необходимо из соображений совместимости: большинство мобильных устройств не поддерживают более высокие стандарты.

OpenGL ES2.0 похож на OpenGL 2.0, но с некоторыми изменениями и был выпущен в 2007 году. LWJGL, с другой стороны, поддерживает последнюю и самую лучшую (OpenGL 4.5) и все, что ниже. Он также имеет привязки OpenCL (обработка графического процессора), OpenAL (3D-аудио) и Vulkan (драйверы Magic и прочее).

OpenGL ES 3 — это новейшая версия, доступная для Android (и я предполагаю, что устройства iOS также), а OpenGL 4.6 — самая новая версия, доступная для настольных устройств (где есть графическая карта, которая ее поддерживает).

Стоит отметить, что OpenGL ES 3 также довольно старый (2012 г.), но он обратно совместим с OpenGL ES 2.

Не зная много об этой конкретной части, это более или менее обоснованное предположение: когда вы пишете код с использованием LibGDX, вы делаете вызовы Gdx.gl (или Gdx.gl20 или Gdx.gl30). Затем LibGDX вызывает соответствующий API (OpenGL ES на Android и iOS, LWJGL/JOGL на рабочем столе и т. д.).

Насколько мне известно, использование useGl30 позволяет использовать OpenGL ES 3. Основная причина, по которой вам не следует использовать OpenGL 3, заключается в том, что Android. OpenGL 3 добавлен в API 18 и:

Внимание! Для поддержки API OpenGL ES 3.0 на устройстве требуется реализация этого графического конвейера, предоставленная производителем устройства. Устройство под управлением Android 4.3 или более поздней версии может не поддерживать API OpenGL ES 3.0.

Но для вас это не проблема, поскольку вы (насколько я понял) не ориентируетесь на Android. Таким образом, использование новейших доступных является хорошей идеей.

Это означает, что вы можете использовать Open GL 4.6. Но это будет означать, что вам придется напрямую вызывать привязки LWJGL.

Проблема в том, что вы можете сделать это только для определенных вещей, сама LibGDX по-прежнему будет использовать версии 2.0/3.0.

Имея все это в виду, я собираюсь ответить на два последних вопроса:

И кстати. я должен установить его на ложь или истину?

Вы должны установить его на true, если вы не ориентируетесь на Android. Будут проблемы, так как не все устройства, работающие с API 18+, обязательно его поддерживают (ссылка на это находится ранее в этом ответе). Если вы работаете с настольным компьютером, вам следует ориентироваться на самую новую версию, которую вы можете найти, поскольку в более новых версиях также добавляются новые функции, которые могут вам понадобиться. Если в OpenGL 4+ нет особых вещей (4+ - это не опечатка), вы должны придерживаться самой структуры и не делать вызовы напрямую в LWJGL (LibGDX для рабочего стола построен поверх LWJGL).

Вы можете сделать игру только с OpenGL 2.0. OpenGL 1 и 2 не совместимы, но 2 и 3 совместимы. Это означает, что если вы решите использовать OpenGL 3, вы все равно можете совершать вызовы OpenGL 2 (насколько мне известно, по опыту работы с LWJGL более поздние версии полагаются друг на друга для правильной работы. Если вы используете 4, вам все равно нужно совершать вызовы 2). и 3, чтобы получить соответствующие API. Хотя я могу ошибаться в этом)

Что лучше для моей игры?

Это вопрос мнения, но есть одна важная вещь, которую вы должны помнить: если вы используете OpenGL 3, вы все равно можете использовать OpenGL 2. При этом нет выбора между тем, что вы выбираете. Если вы включите OpenGL 3, вы можете использовать 2 и 3, , так как openGL ES 3 обратно совместим с OpenGLES 2.

Что-то, о чем я еще не упомянул, - это использование разных версий.

Gdx.gl по умолчанию использует OpenGL 2. Это означает, что если вы хотите получить доступ к функциям 3.0, вы должны вызвать Gdx.gl30.* соответствующие методы. Поскольку он обратно совместим, функции 2.0 (я думаю) должны вызываться с использованием Gdx.gl20.*, поскольку они напрямую не присутствуют в 3.0 (в результате обратной совместимости, если у вас есть 3.0, у вас также есть 2.0)

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

Итак, подведем итог:

  • Вы должны использовать OpenGL 3, если вы работаете только на настольном компьютере (поскольку Android API 18+ может не поддерживать его. Если вы также ориентируетесь на Android, вам нужно подумать, хотите ли вы использовать OpenGL 3, и из-за этого потеряете поддержку для много устройств)
  • useGl30 позволяет использовать версию 3.0 там, где она доступна.
  • 2.0 и 3.0 совместимы, поэтому вам не нужно беспокоиться о том, какую версию вы поддерживаете. Вы можете использовать оба вместе.
person Zoe    schedule 15.10.2017
comment
Итак, в проекте libgdx есть отдельная конфигурация запуска для Android и рабочего стола, что означает, что на моем рабочем столе я включу его, а на своем Android я отключу! Спасибо за ответ :) - person Joza100; 15.10.2017