Приложение OpenGL имеет несколько способов сообщения с шейдерами. Учтите, что здесь описан только один, хотя принцип один — единственные выходные данные шейдеров — рендер каких-либо целей, обычно цвета и буфера глубины.

Шейдеры частично имеют доступ к функционалу OpenGL, поэтому, когда приложение изменяет состояние OpenGL, оно эффективно общается с шейдерами. Так что например если приложению нужно изменить параметры освещения в шейдере, оно просто воздействует на освещение в OpenGL, точно так же, как и с фиксированным функционалом, без шейдеров.

Однако изменение параметров в OpenGL — не всегда самый подходящий путь изменения значений шейдеров.
Например, рассмотрим шейдер, которому требуется переменная, указывающая время для активации какой-либо анимации. В OpenGL отсутствуют подходящие переменные. В общем-то вы можете, например, использовать неиспользованные значения типа угла зеркального отсечения, но это совсем не интуитивно.

К счастью GLSL допускает обьявление пользовательских переменных, используемых для сообщения OpenGL с шейдером.
Благодаря этой простой возможности вы можете использовать для того же отсчета времени переменную, названную «timeElapsed» или другим подходящим именем.

В этом контексте в GLSL имеется два определения переменных:

  • Uniform
  • Attribute 

Переменные, определённые в шейдере с использованием этих переменных, являются для шейдера read-only.
В следующих разделах мы рассмотрим, когда и как используются эти типы переменных.

Есть ещё один способ передавать данные шейдеру — текстуры. Текстуры не обязательно должны рассматриваться как изображения, они могут быть интерпретированы как массивы данных. Фактически, при использовании шейдеров вы и только вы решаете, как интерпретировать данные текстур, даже если это действительно изображение. В этих уроках мы не будем рассматривать передачу данных текстурами.