- OpenGL Shading Language
-
Эту статью следует викифицировать. Пожалуйста, оформите её согласно правилам оформления статей.OpenGL Shading Language Разработчик Операционная система Последняя версия Сайт 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].
OpenGL версия GLSL версия 2.0 1.10 2.1 1.20 3.0 1.30 3.1 1.40 3.2 1.50 3.3 3.3 4.0 4.0 4.1 4.1 4.2 4.2 GLSL 1.50
Добавлена поддержка геометрических шейдеров, для которых ранее использовались расширения GL_ARB_geometry_shader4, GL_EXT_geometry_shader4.
Пример простого вершинного шейдера на GLSL
Преобразование входной вершины так же, как это делает стандартный конвейер.
void main(void) { gl_Position = ftransform(); }
Замечание: ftransform() больше не поддерживается GLSL с версии 1.40 и GLSL ES с версии 1.0. Теперь программисты должны управлять матрицами проекции и трансформации модели в соответствии со стандартом OpenGL 3.1[2].
#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); }
Пример простого GLSL Geometry Shader
Простой шейдер, работающий с цветом и положением.
#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; void main() { for(int i = 0; i < gl_in.length(); i++) { gl_Position = gl_in[i].gl_Position; EmitVertex(); } EndPrimitive(); }
Пример простого GLSL Fragment Shader
Создаёт тексель красного цвета..
#version 120 void main(void) { gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); }
В GLSL 1.30 и новее используется следующая функция:
glBindFragDataLocation(Programm, 0, "MyColor");
где: Programm - указатель на программу; 0 - количество буферов цвета, если вы не используете MRT(Multiple Render Targets), значение должно быть равно 0; "MyColor" - имя вашего буфера цвета в шейдерной программе.
#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
Примечания
- ↑ OpenGL 3.3 & 4.0 breathe new life into existing graphics hardware and pave the way for next gen GPUs. Nick Haemel (March 11, 2010). Архивировано из первоисточника 10 апреля 2012. Проверено 13 марта 2010.
- ↑ Amyto - GLSL Tutorial 1: Hello red
Ссылки
Статьи
Спецификации
- 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
Примеры
Категории:- Программное обеспечение по алфавиту
- Компьютерная графика
- Языки программирования
- OpenGL
Wikimedia Foundation. 2010.