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

После того, как вершины и все данные вершин обработаны, они двигаются к следующей стадии графического конвейера (которая всё ещё обрабатывается фиксированным функционалом), где доступна информация об объединении вершин. На этой стадии все примитивы собраны и пикселы вычислены. Для каждого пиксела есть ряд переменных, которые автоматически интерполированы и переданы пикселному шейдеру. Например, цвет пиксела. Цвет, принадлежащий пикселу, — это интерполяция цветов вершин, составляющих примитив.

Этот тип переменных, с которыми шейдер получает интерполированные данные предыдущих этапов, и есть — «Varying-переменные». В GLSL есть несколько зарезервированных varying-переменных, таких, как приведённый для примера цвет. Также GLSL позволяет обьявление пользовательских varying-переменных. Они должны быть обьявлены и в вершинном и в пикселном шейдере, например: varying float intensity;

Значения varying-переменным должны быть присвоены в вершинном шейдере, где мы вычисляем значения аттрибутов всех вершин. В пикселном шейдере переменная с готовым результатом интерполяции вершинных данных может быть только прочитана.