OpenGL Shading Language — Википедия

OpenGL Shading Language
Тип язык для программирования шейдеров[вд] и язык программирования
Разработчик Khronos Group
Операционная система Кроссплатформенное программное обеспечение
Первый выпуск 2004
Последняя версия 4.60.5 (14 июня 2018)
Сайт opengl.org

GLSL (OpenGL Shading Language, Graphics Library Shader Language) — язык высокого уровня для программирования шейдеров. Разработан в целях математических расчетов, которые обычно требуются для выполнения растеризации графики. Синтаксис языка базируется на языке программирования ANSI C, однако, из-за его специфической направленности, из него были исключены многие возможности, для упрощения языка и повышения производительности. В язык включены дополнительные функции и типы данных, например для работы с векторами и матрицами.

OpenGL Shading Language (GLSL) версии 4.0 даёт разработчикам небывалую мощь и гибкость при создании современных интерактивных программ. Появляется возможность напрямую и в полной мере использовать силу современных графических процессоров (GPUs) благодаря мощному языку и API (англ. Application Programming Interface). Программы на GLSL не существуют сами по себе, а входят как составная часть в большую программу для OpenGL.

На сегодняшний день OpenGL Shading Language (GLSL) является основной составной частью OpenGL API[1]. Забегая вперёд скажем, что всякая программа для OpenGL внутри себя использует одну или несколько GLSL-программ. Эти мини-программы на GLSL называются шейдерами. Программа-шейдер исполняется в графическом процессоре и реализует алгоритмы эффектов освещенности и закраски для 3-мерных изображений. При этом программа-шейдер способна на большее, чем реализация только алгоритма закраски поверхностей. Они также могут создавать анимацию, мозаику и даже общие математические вычисления. Программа-шейдер предназначена к исполнению прямо в графическом процессоре и часто с применением параллельных вычислений. Например фрагментный шейдер исполняется один раз для каждого пикселя, а вычисления запускаются одновременно в разных потоках графического процессора. Число процессоров в графической подсистеме определяет число одновременных потоков. Всё это делает программы-шейдеры необычайно эффективными и позволяет программисту очень легко задействовать параллельные вычисления. Вычислительная мощность современных графических подсистем впечатляет. В следующей таблице приведены количества шейдер-процессоров в некоторых моделях платах NVIDIA GeForce 900 .

Основное преимущество 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[2].

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

Добавлена поддержка геометрических шейдеров, для которых ранее использовались расширения 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); } 

Литература

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

Примечания

[править | править код]
  1. OpenGL News Archives. www.opengl.org. Дата обращения: 16 апреля 2025.
  2. OpenGL 3.3 & 4.0 breathe new life into existing graphics hardware and pave the way for next gen GPUs. Nick Haemel (11 марта 2010). Дата обращения: 13 марта 2010. Архивировано из оригинала 10 апреля 2012 года.
  3. GLSL Language Specification, Version 1.10.59. Дата обращения: 28 сентября 2018. Архивировано 28 сентября 2018 года.
  4. GLSL Language Specification, Version 1.20.8. Дата обращения: 28 сентября 2018. Архивировано 5 апреля 2019 года.
  5. GLSL Language Specification, Version 1.30.10. Дата обращения: 28 сентября 2018. Архивировано 19 января 2019 года.
  6. GLSL Language Specification, Version 1.40.8. Дата обращения: 28 сентября 2018. Архивировано 11 августа 2017 года.
  7. GLSL Language Specification, Version 1.50.11. Дата обращения: 28 сентября 2018. Архивировано 29 апреля 2016 года.
  8. GLSL Language Specification, Version 3.30.6. Дата обращения: 28 сентября 2018. Архивировано 11 августа 2017 года.
  9. GLSL Language Specification, Version 4.00.9. Дата обращения: 28 сентября 2018. Архивировано 12 августа 2017 года.
  10. GLSL Language Specification, Version 4.10.6. Дата обращения: 28 сентября 2018. Архивировано 19 января 2019 года.
  11. GLSL Language Specification, Version 4.20.11. Дата обращения: 28 сентября 2018. Архивировано 19 января 2019 года.
  12. GLSL Language Specification, Version 4.30.8. Дата обращения: 28 сентября 2018. Архивировано 28 сентября 2018 года.
  13. GLSL Language Specification, Version 4.40.9. Дата обращения: 28 сентября 2018. Архивировано 28 сентября 2018 года.
  14. GLSL Language Specification, Version 4.50.7. Дата обращения: 28 сентября 2018. Архивировано 19 июля 2019 года.
  15. GLSL Language Specification, Version 4.60.5. Дата обращения: 28 сентября 2018. Архивировано 12 августа 2018 года.
  16. GLSL ES Language Specification, Version 1.00, revision 17. Дата обращения: 19 июня 2018. Архивировано 13 июля 2018 года.
  17. GLSL ES Language Specification, Version 3.00, revision 6. Дата обращения: 19 июня 2018. Архивировано 4 марта 2018 года.

Статьи

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