Традиционные шейдеры
9.6. Эффект дымки В OpenGL эффекты глубины и дымки (туман, а в большинстве изображений просто ухудшение видимости с удалением предметов от точки обзора) контролируются параметрами дымки. Коэффициент дымки вычисляется с помощью одного из трех уравнений, а в дальнейшем используется при вычислении плавного перехода между цветом дымки и цветом фрагмента. Значение глубины, которое используется в выражении для дымки, может быть либо координатой дымки, переданной как стандартный атрибут вершины (gl_FogCoord), либо расстоянием от точки обзора до фрагмента изображения в пространстве координат обзора. Во втором случае обычно достаточно просто аппроксимировать значение глубины, используя абсолютное значение координаты z в пространстве обзора (то есть abs(ecPosition.z)). При очень большом угле обзора такая аппроксимация может спровоцировать заметный дефект изображения (небольшую дымку у края). В этом случае можно вычислять z как расстояние от точки обзора до фрагмента (length(ecPosition)). (Этот метод предполагает вычисление квадратного корня, что немного ухудшит производительность.) Выбрать способ вычисления в вершинном шейдере можно так:
if (UseFogCoordinate)
gl_FogFragCoord = gl_FogCoord: else
gl_FogFragCoord - abs(ecPosition.z); Линейные вычисления, соответствующие обычным вычислениям глубины, можно выбрать в OpenGL с помощью константы GL_LIrJEAR. В этом случае коэффициент дымки/вычисляется следующим уравнением:
j _ end - z end - start
где start, end иг- расстояния в координатах пространства обзора: start - расстояние до начала дымки; end - расстояние до окончания действия эффекта; г - значение из gl _FogFragCoord. Начальную и конечную координаты можно задавать явно в uniform-nepeMeHHbix или использовать в качестве них текущие значения из состояния OpenGL (встроенные переменные gl_Fog. start и gl _Fog. end). Код шейде-ра для вычисления коэффициента дымки с помощью встроенных переменных показан в листинге 9.15.
Листинг 9.15. Вычисления дымки по GLJJNEAR