Interested Article - OpenGL Shading Language

GLSL (Open GL S hading L anguage, G raphics L ibrary S hader L anguage) — язык высокого уровня для программирования шейдеров . Разработан в целях математических расчетов, которые обычно требуются для выполнения растеризации графики. Синтаксис языка базируется на языке программирования ANSI C , однако, из-за его специфической направленности, из него были исключены многие возможности, для упрощения языка и повышения производительности. В язык включены дополнительные функции и типы данных, например для работы с векторами и матрицами .

Основное преимущество GLSL перед другими шейдерными языками — переносимость кода между платформами и ОС .

Язык GLSL используется в OpenGL , в OpenGL ES и WebGL используется язык GLSL ES (OpenGL ES Shading Language).

История

Изначально GLSL 1.10 стал доступен в виде набора расширений GL_ARB_shading_language_100, GL_ARB_shader_objects, GL_ARB_vertex_shader , GL_ARB_fragment_shader. Но уже начиная с OpenGL 2.0, GLSL включен в ядро.

Начиная с OpenGL 3.3, GLSL меняет нумерацию версий. Теперь номер версии GLSL будет соответствовать версии OpenGL .

GLSL версия OpenGL версия Дата
1.10.59 2.0 30 Апреля 2004
1.20.8 2.1 7 Сентября 2006
1.30.10 3.0 22 Ноября 2009
1.40.08 3.1 22 Ноября 2009
1.50.11 3.2 4 Декабря 2009
3.30.6 3.3 11 Марта 2010
4.00.9 4.0 24 Июля 2010
4.10.6 4.1 24 Июля 2010
4.20.11 4.2 12 Декабря 2011
4.30.8 4.3 7 Февраля 2013
4.40.9 4.4 16 Июня 2014
4.50.7 4.5 9 Мая 2017
4.60.5 4.6 14 Июня 2018
GLSL ES версия OpenGL ES версия WebGL версия Основан на GLSL версии Дата
1.00.17 2.0 1.0 1.20 12 Мая 2009
3.00.6 3.0 2.0 3.30 29 Января 2016

GLSL 1.50

Добавлена поддержка геометрических шейдеров, для которых ранее использовались расширения GL_ARB_geometry_shader4 , GL_EXT_geometry_shader4.

Пример простого вершинного шейдера (Vertex Shader) на GLSL

Преобразование входной вершины так же, как это делает стандартный конвейер.

void main(void)
{
    gl_Position = ftransform();
}

Замечание: ftransform() больше не поддерживается GLSL с версии 1.40 и GLSL ES с версии 1.0. Теперь программисты должны управлять матрицами проекции и трансформации модели в соответствии со стандартом OpenGL 3.1.

#version 140

uniform Transformation {
    mat4 projection_matrix;
    mat4 modelview_matrix;
};

in vec3 vertex;

void main() {
    gl_Position = projection_matrix * modelview_matrix * vec4(vertex, 1.0);
}

Пример простого геометрического шейдера (Geometry Shader) на GLSL

Простой шейдер, работающий с цветом и положением.

#version 120
#extension GL_EXT_geometry_shader4 : enable

void main() {
  for(int i = 0; i < gl_VerticesIn; ++i) {
    gl_FrontColor = gl_FrontColorIn[i];
    gl_Position = gl_PositionIn[i];
    EmitVertex();
  }
}

В OpenGL 3.2 с GLSL 1.50 геометрические шейдеры были добавлены в «core functionality» что означает, что теперь не нужно использовать расширения. Однако, синтаксис достаточно сложен.

Простой шейдер, передающий положения вершин треугольников на следующий этап.:

#version 150

layout(triangles) in; //тип входных данных - треугольники
layout(triangle_strip, max_vertices = 3) out; //тип выходных данных - цепочка треугольников, не более 3 вершин (то есть один треугольник)

void main() {
  for(int i = 0; i < gl_in.length(); i++) {
    gl_Position = gl_in[i].gl_Position;
    EmitVertex(); //создалась выходная вершина, содержащая копию всех активных выходных данных, в данном случае только gl_Position
  }
  EndPrimitive();
}

Пример простого фрагментного шейдера (Fragment Shader) на GLSL

Создаёт тексель красного цвета..

#version 120
void main(void)
{
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}

В GLSL 1.30 и новее используется следующая функция:

glBindFragDataLocation(Program, 0, "MyFragColor");

где: Program — указатель на программу; 0 — номер буфера цвета, если вы не используете MRT(Multiple Render Targets), значение должно быть равно 0; «MyFragColor» — имя выходной переменной шейдерной программы, записывающей в данный буфер.

#version 150
void main(void)
{
    MyFragColor = vec4(1.0, 0.0, 0.0, 1.0);
}

IDE

См. также

Литература

  • . Разработка и отладка шейдеров. — БХВ-Петербург, 2006. — 488 с. — ISBN 5-94157-712-5 .
  • . Расширения OpenGL. — БХВ-Петербург, 2005. — 688 с. — ISBN 5-94157-614-5 .

Примечания

  1. . Nick Haemel (11 марта 2010). Дата обращения: 13 марта 2010. Архивировано из 10 апреля 2012 года.
  2. . Дата обращения: 28 сентября 2018. 28 сентября 2018 года.
  3. . Дата обращения: 28 сентября 2018. 5 апреля 2019 года.
  4. . Дата обращения: 28 сентября 2018. 19 января 2019 года.
  5. . Дата обращения: 28 сентября 2018. 11 августа 2017 года.
  6. . Дата обращения: 28 сентября 2018. 29 апреля 2016 года.
  7. . Дата обращения: 28 сентября 2018. 11 августа 2017 года.
  8. . Дата обращения: 28 сентября 2018. 12 августа 2017 года.
  9. . Дата обращения: 28 сентября 2018. 19 января 2019 года.
  10. . Дата обращения: 28 сентября 2018. 19 января 2019 года.
  11. . Дата обращения: 28 сентября 2018. 28 сентября 2018 года.
  12. . Дата обращения: 28 сентября 2018. 28 сентября 2018 года.
  13. . Дата обращения: 28 сентября 2018. 19 июля 2019 года.
  14. . Дата обращения: 28 сентября 2018. 12 августа 2018 года.
  15. . Дата обращения: 19 июня 2018. 13 июля 2018 года.
  16. . Дата обращения: 19 июня 2018. 4 марта 2018 года.

Ссылки

Статьи

Спецификации

Источник —

Same as OpenGL Shading Language