OpenGL Shading Language

Материал из Википедии — свободной энциклопедии
(перенаправлено с «GLSL»)
Перейти к: навигация, поиск
OpenGL Shading Language
Разработчик

Khronos Group

Операционная система

Кроссплатформенное программное обеспечение

Последняя версия

4.2 (8 августа 2011)

Сайт

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

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

This transforms the input vertex the same way the fixed-function pipeline would.

void main(void)
{
    gl_Position = ftransform();
}

Note that ftransform() is no longer available since GLSL 1.40 and GLSL ES 1.0. Instead, the programmer has to manage the projection and modelview matrices explicitly in order to comply with the new OpenGL 3.1 standard[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

This is a simple pass-through shader for the color and position.

#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" что означает, что теперь не нужно использовать расширения. Однако, синтаксис достаточно сложен. This is a simple version 1.50 pass-through shader for vertex positions (of triangle primitives):

#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

This produces a red fragment.

#version 120
void main(void)
{
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}

In GLSL 1.30 and later you must do

glBindFragDataLocation(Programm, 0, "MyColor");

where: Programm - your shader programm's handle; 0 - count of color buffers, if you usen't MRT, you must write zero; "MyColor" - name of your color buffer in shader programm.

#version 150
void main(void)
{
    MyFragColor = vec4(1.0, 0.0, 0.0, 1.0);
}

[править] IDE

[править] См. также

[править] Литература

[править] Примечания

[править] Ссылки

Статьи

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

Примеры

Личные инструменты
Пространства имён

Варианты
Действия
Навигация
Участие
Печать/экспорт
Инструменты
На других языках