Листинг 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:
j - g-idcnsitiji)1 .
Эта функция меняет крутизну экспоненциального затухания функции возведением экспоненты в степень 2. Код шейдера OpenGL, реализующий это выражение, очень похож на предыдущую функцию (листинг 9.17).
Листинг 9.17. Вычисление дымки по GL_EXP2
const float L0G2E = 1.442695: И = 1 / log(2)
fog = exp2(-gl_Fog.density * gl_Fog.density *
gl_FogFragCoord * 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_L I NEAR применяется в случаях, когда текстура будет неподвижной на геометрической модели, например, при моделировании местности. GL_EYE_LINEAR применяется для выполнения динамических контурных линий объекта. С ее помощью, например, создаются топографические карты или интерпретируются сейсмические данные. GL_SPHERE_MAP можно использовать для текстурных координат, применяемых для простого отображения. GL_REFLECTIONJ№ и GL_NORMAL_MAP можно использовать для кубических текстур: GL_REFLECTION_MAP передает вектор отражения как координаты текстуры, GL_NORMAL_MAP просто передает вычисленную нормаль в системе координат обзора как текстурную координату.