GLSL (OpenGL Shading Language) - мова високого рівня для програмування шейдерів. Синтаксис мови базується на мові програмування ANSI C, однак, через його специфічної спрямованості, з нього були виключені багато можливостей, для спрощення мови і підвищення продуктивності. В мову включені додаткові функції і типи даних, наприклад для роботи з векторами і матрицями.

Основні переваги GLSL:

  • Переносимість коду між платформами і операційними системами.

1. Історія

Спочатку 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

2. GLSL 1.50

Додана підтримка геометричних шейдерів, для яких раніше використовувалися розширення GL_ARB_geometry_shader4, GL_EXT_geometry_shader4.

2.1. Приклад простого вершинного шейдера на 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  )  ;  } 

2.2. Приклад простого 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  (  )  ;  } 

2.3. Приклад простого 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  )  ;  } 

3. IDE

Література

  • Боресков Олексій Розробка і налагодження шейдерів. - БХВ-Петербург, 2006. - 488 с. - ISBN 5-94157-712-5
  • Боресков Олексій Розширення OpenGL. - БХВ-Петербург, 2005. - 688 с. - ISBN 5-94157-614-5

Примітки

  1. OpenGL 3.3 & 4.0 breathe new life into existing graphics hardware and pave the way for next gen GPUs - fireuser.com / blog / opengl_release_breathes_new_life_into_existing_graphics_hardware_paves_the_ /. Nick Haemel (March 11, 2010). Читальний - www.webcitation.org/66p9NeuiS з першоджерела 10 Квітень 2012.
  2. Amyto - GLSL Tutorial 1: Hello red - www.amyto.com/tutorials/glsl/1.html