OpenGL Shading Language
OpenGL Shading Language | |
---|---|
Тип | язык для программирования шейдеров[вд] и язык программирования |
Разработчик | Khronos Group |
Операционная система | Кроссплатформенное программное обеспечение |
Первый выпуск | 2004 |
Последняя версия | 4.5 (30 января 2015) |
Сайт | opengl.org |
GLSL (OpenGL Shading Language) — язык высокого уровня для программирования шейдеров. Синтаксис языка базируется на языке программирования ANSI C, однако, из-за его специфической направленности, из него были исключены многие возможности, для упрощения языка и повышения производительности. В язык включены дополнительные функции и типы данных, например для работы с векторами и матрицами.
Основное преимущество GLSL перед другими шейдерными языками — переносимость кода между платформами и ОС.
История
[править | править код]Изначально 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[1].
GLSL версия | OpenGL версия |
---|---|
1.10.59[2] | 2.0 |
1.20.8[3] | 2.1 |
1.30.10[4] | 3.0 |
1.40.08[5] | 3.1 |
1.50.11[6] | 3.2 |
3.30.6[7] | 3.3 |
4.00.9[8] | 4.0 |
4.10.6[9] | 4.1 |
4.20.11[10] | 4.2 |
4.30.8[11] | 4.3 |
4.50 | 4.5 |
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(Programm, 0, "MyFragColor");
где: Programm — указатель на программу; 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
- OpenGL Shader Designer
- Shader Maker (GPL)
- Polydraw
См. также
[править | править код]Литература
[править | править код]- Боресков Алексей. Разработка и отладка шейдеров. — БХВ-Петербург, 2006. — 488 с. — ISBN 5-94157-712-5.
- Боресков Алексей. Расширения OpenGL. — БХВ-Петербург, 2005. — 688 с. — ISBN 5-94157-614-5.
Примечания
[править | править код]- ↑ 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 года.
- ↑ GLSL Language Specification, Version 1.10.59 . Архивировано из оригинала 12 июня 2013 года.
- ↑ GLSL Language Specification, Version 1.20.8 . Архивировано из оригинала 12 июня 2013 года.
- ↑ GLSL Language Specification, Version 1.30.10 . Архивировано из оригинала 12 июня 2013 года.
- ↑ GLSL Language Specification, Version 1.40.08 . Архивировано из оригинала 12 июня 2013 года.
- ↑ GLSL Language Specification, Version 1.50.11 . Архивировано из оригинала 12 июня 2013 года.
- ↑ GLSL Language Specification, Version 3.30.6 . Архивировано из оригинала 12 июня 2013 года.
- ↑ GLSL Language Specification, Version 4.00.9 . Архивировано из оригинала 12 июня 2013 года.
- ↑ GLSL Language Specification, Version 4.10.6 . Архивировано из оригинала 12 июня 2013 года.
- ↑ GLSL Language Specification, Version 4.20.11 . Архивировано из оригинала 12 июня 2013 года.
- ↑ GLSL Language Specification, Version 4.30.8 . Архивировано из оригинала 12 июня 2013 года.
Ссылки
[править | править код]Статьи
Спецификации
- GLSL Language Specification, Version 1.50
- GLSL Language Specification, Version 1.40
- GLSL Language Specification, Version 1.30
- GLSL Language Specification, Version 1.20
- OpenGL Fragment Shader Specification
- OpenGL Vertex Shader Specification
- OpenGL Shader Objects Specification
- OpenGL Geometry Shader Specification
Примеры
Эту статью необходимо исправить в соответствии с правилами Википедии об оформлении статей. |