Листинг 9.17. Вычисление дымки по GL_EXP2
const float L0G2E = 1.442695: // = 1 / log(2) fog = exp2(-gl_Fog.density * gl_Fog.density * glJogF rag Coord * gl^FogFragCoord * L0G2E) ;
Производительность этого кода можно улучшить, передавая определенную разработчиком uniform-переменную, которая содержит значение gl_Fog.density * gl_Fog.density * L0G2E. OpenGL требует также, чтобы окончательное значение коэффициента дымки было ограничено диапазоном [0,1]. Это можно сделать так, как показано в листинге 9.18.
Листинг 9.18. Ограничение коэффициента дымки
fog = clamp(fog. 0.0. 1.0):
Любую из этих трех функций дымки можно вычислить либо в вершинном, либо во фрагментном шейдере - когда в изображении нет очень больших многоугольников, разница вряд ли будет заметна, если коэффициент дымки будет вычисляться в вершинном шейдере и передаваться во фрагментный шейдер как varying-nepe-менная. Это может повлиять на производительность кода в целом. Во фрагментном
Традиционные шейдеры
шейдере, когда окончательный цвет почти вычислен, коэффициент дымки можно использовать для вычисления перехода между цветом дымки и окончательным цветом фрагмента. Код шейдера (листинг 9.19) использует значение цвета дымки из состояния OpenGL.
Листинг 9.19. Наложение дымки на окончательное значение цвета
color - mix(vec3 (gl_Fog.color). color, fog);
Код, представленный в этом разделе, можно использовать для вычислений, результат которых будет тем же, что и полученный стандартными вычислениями OpenGL. Но, учитывая возможность программируемое™, разработчик может вычислять дымку совершенно иначе.
9.7. Формирование текстурных координат
OpenGL можно настроить для автоматического вычисления текстурных координат на основании только входных координат вершин. Существует пять способов такой настройки, и каждый из них имеет свои преимущества в определенных условиях. Режим GL_OBJECT_LINEAR применяется в случаях, когда текстура будет неподвижной на геометрической модели, например, при моделировании местности. GL_EYE_LI WEAR применяется для выполнения динамических контурных линий объекта. С ее помощью, например, создаются топографические карты или интерпретируются сейсмические данные. GL_SPHERE_MAP можно использовать для текстурных координат, применяемых для простого отображения. GL_REFLECTION_MAP и GL_NORMAL_MAP можно использовать для кубических текстур; GL_REFLECTION_MAP передает вектор отражения как координаты текстуры, GL_NORMAL_MAP просто передает вычисленную нормаль в системе координат обзора как текстурную координату.