fog = Cgl_Fog.end - gl_FogFragCoord)) * gl_Fog.scale:

Так как 1.0 / (gl_Fog.end - gl_Fog.start) не зависит от состояния вершины или фрагмента, это значение можно вычислить заранее и сделать доступным в виде встроенной переменной gl_Fog. scale.

Более реалистичного эффекта дымки можно достичь с помощью экспоненциальной функции. Используя отрицательное значение экспоненты, экспоненциальная функция моделирует убывание изначального цвета в зависимости от расстояния. Простая экспоненциальная функция дымки выбирается в OpenGL с помощью константы GL_EXP, Этой функции соответствует формула:

9.6. Эффект дымки Здесь density - это плотность дымки, а г вычисляется так, как описано в пре-| дыдущей функции, density можно представить в виде uniform-переменной или встроенной переменной gl_Fog.density. Чем больше это значение, тем насыщеннее дымка. Чтобы эта функция работала правильно, density должно быть больше или равно 0.

Язык шейдеров OpenGL не имеет встроенной функции expÇbase е), но в нем есть экспоненциальная функция с основанием 2, ехр2. Учитывая, что ехр(х) = ехр 2(х/ bg(2)), можно получить нужный результат. Выражение 1 /log(2) равно 1,442695. Код шейдера OpenGL для вычисления приведенного уравнения показан в листинге 9.16.

Листинг 9.16. Вычисление дымки по GL_EXP

const float L0G2E - 1.442695: // - 1 / log{2)
fog - exp2(-gl_Fog.density * gl_FogFragCoord * L0G2E):

Этот код иллюстрирует формулу, определенную для стандартной функциональности OpenGL 1.5. Приняв решение об использовании этой формулы для вычисления дымки, разработчик может усовершенствовать код - например, умножить константу L0G2E на -gl_Fog.density в приложении и передать результат в определенной разработчиком uniform-переменной. Этим достигается экономия на операции умножения в приведенном ранее выражении.

Окончательная функция дымки, определенная OpenGL, выбирается с помощью константы GL_EXP2: Эта функция меняет крутизну экспоненциального затухания функции возведением экспоненты в степень 2. Код шейдера OpenGL, реализующий это выражение, очень похож на предыдущую функцию (листинг 9.17).


⇐ Предыдущая| |Следующая ⇒