OpenGL Shading Language

Материал из Википедии — свободной энциклопедии
Это старая версия этой страницы, сохранённая Ntfs.hard (обсуждение | вклад) в 22:30, 11 июня 2013 (версия 4,3. таблица версий со ссылками). Она может серьёзно отличаться от текущей версии.
Перейти к навигации Перейти к поиску
OpenGL Shading Language
Тип язык для программирования шейдеров[вд] и язык программирования
Разработчик Khronos Group
Операционная система Кроссплатформенное программное обеспечение
Первый выпуск 2004
Последняя версия 4.3 (7 февраля 2013)
Сайт www.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

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;

void main() {
  for(int i = 0; i < gl_in.length(); i++) {
    gl_Position = gl_in[i].gl_Position;
    EmitVertex();
  }
  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, "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.

Примечания

Ссылки

Статьи

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

Примеры