Подтвердить что ты не робот

Различия между GLSL и GLSL ES 2

Два вопроса действительно...

  • Является ли GLSL ES 2 полностью отдельным языком или специальной версией GLSL?
  • В чем различия между ними, с точки зрения функций "стандартной библиотеки", синтаксиса и возможностей?

Я пишу шейдеры для приложения, предназначенного для Windows, Mac и iPad, и я бы предпочел не добавлять больше версий каждого шейдера - а тем более шейдеров в любом случае.

4b9b3361

Ответ 1

Является ли GLSL ES 2 полностью отдельным языком или специальной версией GLSL?

Каждая версия GLSL в конечном счете является "полностью отдельным языком"; некоторые из них даже не совместимы с предыдущими версиями. Тем не менее, ES-вариация GLSL еще более выражена.

Подумайте об этом как о вилке рабочего стола GLSL. Имейте в виду вилку GLSL с шести версий назад.

Каковы различия между ними, с точки зрения функций "стандартной библиотеки", синтаксиса и возможностей?

Между версиями?

Единственная возможная причина, по которой вам может потребоваться совместное использование шейдеров между этими платформами, - это попытка совместного использования кода OpenGL между ними. Поэтому вам придется ограничивать себя функциональностью OpenGL 2.1 на рабочем столе.

Это означает, что вы используете настольную версию GLSL версии 1.20. Это похоже на версию GLSL ES версии 1.00 (для версии GLSL не указан тот же номер, что и соответствующая версия GL. Ну, до настольных систем GL 3.3/4.0 и GLSL 3.30/4.00), но все равно. В ES у вас есть много спецификаторов точности, которые рабочий стол GLSL 1.20 не обрабатывает.

Лучший способ справиться с этим - использовать "шейдерную строку преамбулы". См. glShaderSource использует несколько строк шейдера, которые он объединяет и компилирует как один. Вы можете взять основную шейдерную строку (main и ее различные коды, attribute определения, uniforms и т.д.) И придерживать перед ними строку "преамбулы". Преамбула будет отличаться в зависимости от того, для чего вы компилируете.

Ваша преамбула ES GLSL 1.00 будет выглядеть так:

#version 100  //Must start with a version specifier.

Ваш рабочий стол GLSL 1.20 будет выглядеть следующим образом:

#version 120
#define lowp
#define mediump
#define highp

И, может быть, несколько других разумных #defines. Таким образом, ваш шейдер может установить эти прецизионные определители, и при использовании рабочего стола GLSL они будут #define d.

Это очень похоже на платформенно-нейтральное кодирование в C/С++, где у вас часто есть определенный определенный платформой заголовок, который меняет определение и/или имеет #define, на котором вы можете установить код на основе.