OpenGL Shading Language
GLSL (OpenGL Shading Language, Graphics Library Shader Language) — язык высокого уровня для программирования шейдеров. Разработан для выполнения математики, которая обычно требуется для выполнения растеризации графики. Синтаксис языка базируется на языке программирования 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 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