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).

## Содержание

* 1 История
* 2 GLSL 1.50
* 2.1 Пример простого вершинного шейдера (Vertex Shader) на GLSL
* 2.2 Пример простого геометрического шейдера (Geometry Shader) на GLSL
* 2.3 Пример простого фрагментного шейдера (Fragment Shader) на GLSL
* 3 IDE
* 4 См. также
* 5 Литература
* 6 Примечания
* 7 Ссылки

## История

[править | править код]

Изначально 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

## 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

[править | править код]

* Shader Config
* Render Monkey
* Mac OpenGL Shader Builder Архивная копия от 20 августа 2011 на Wayback Machine
* OpenGL Shader Designer Архивная копия от 6 июня 2013 на Wayback Machine
* Shader Maker (GPL)
* Polydraw Архивная копия от 16 апреля 2012 на Wayback Machine

## См. также

[править | править код]

* HLSL
* Cg
* Шейдер

## Литература

[править | править код]

* Боресков Алексей. Разработка и отладка шейдеров. — БХВ-Петербург, 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 года.

## Ссылки

[править | править код]

Статьи

* http://www.gamedev.ru Архивная копия от 29 января 2010 на Wayback Machine
* http://mirgames.ru/

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

* GLSL Language Specification, Version 1.50 Архивировано 5 февраля 2012 года.
* GLSL Language Specification, Version 1.40 Архивная копия от 20 июня 2010 на Wayback Machine
* GLSL Language Specification, Version 1.30 Архивировано 5 февраля 2012 года.
* GLSL Language Specification, Version 1.20 Архивировано 5 февраля 2012 года.
* OpenGL Fragment Shader Specification
* OpenGL Vertex Shader Specification
* OpenGL Shader Objects Specification Архивная копия от 21 октября 2009 на Wayback Machine
* OpenGL Geometry Shader Specification Архивная копия от 20 июня 2010 на Wayback Machine

Стиль этой статьи неэнциклопедичен или нарушает нормы литературного русского языка.

Статью следует исправить согласно стилистическим правилам Википедии. (2 августа 2021)

|