void main(void)
{
vec3 ecPosition = vec3 (gl_ModelViewMatrix * glj/ertex); vec3 tnorm = normalize(gl_NormalMatrix * g1_Norrnal),:
vec3. lightVec = normalize'dightPosition - ecPosition):
vec3 reflectVec = reflecU-1 ightVec. tnorm);
vec3 viewVec = normalizet-ecPosition);
float spec = cl ampСdot СreflectVec, viewVec). 0.0, 1.0);
spec = pow(spec, 8.0):
Specular = vec3 (spec) * vac3 (1.0, 0.941, 0,898) * 0..3;
Diffuse = maxfdotOightVec. tnorm). 0.0):
TexCoord = gl_MultiTexCoord0.st:
gl_Positi on = ftransforrciO;
}
10.3.3. Фрагментный шейдер
Фрагментный шейдер, который работает с множественными текстурами, приведен в листинге 10.4. Приложение загрузило «дневную» текстуру в текстурный модуль с именем EarthDay, «ночную» текстуру - в текстурный модуль EarthNight, а текстуру с облаками и отражением - в текстурный модуль EarthCloudGloss. Вычисление освещения выполняется в вершинном шейдере, учитываются рассеянное и зеркальное отражения, и результат передается во фрагментный шейдер. Текстурные координаты, передаваемые приложениям, также передаются во фрагментный шейдер, и на основании этих координат происходит дальнейшая работа с текстурами.
Во фрагментном шейдере сначала нужно обратиться к текстуре облаков/отражения - эти значения пригодятся при дальнейших вычислениях. Потом считывается значение из «дневной» текстуры, умножается на коэффициент рассеянного освещения и добавляется к коэффициенту отраженного освещения, умноженному на значение из текстуры зеркального отражения. Если фрагмент не скрыт облаками, эти вычисления дают необходимый эффект рассеянного освещения по всей поверхности Земли и эффект зеркального отражения от водной поверхности. Это значение затем умножается на 1,0 минус коэффициент облачности. И наконец, эффект облака получается умножением коэффициента облачности на значение рассеянного освещения, и результат добавляется к результату всех предыдущих вычислений.
Вычисления для ночной стороны проще. Нужно просто прочитать значение из «ночной» текстуры и умножить результат на 1,0 минус коэффициент облачности. Так как данный фрагмент находится в тени, компоненты рассеянного и зеркального отражения отсутствуют. Затем можно вычислить значение для каждого фрагмента. Существует коэффициент рассеянного освещения, больший нуля в освещенных областях, меньший нуля в затененных областях, и около нуля возле терминатора. Используя условные выражения, значение daytime подставляется для освещенных Областей, ni ghttime - для неосвещенных, а возле терминатора задается постепенный переход.
Затем для получения окончательного цвета фрагмента добавляется значение прозрачности 1,0. Полученное изображение с нескольких точек обзора показано на цветном рис. 6. На первом изображении рисунка можно увидеть замечательное зеркальное отражение Мексиканского залива; а если присмотреться к третьему (ночному) изображению, можно увидеть облака, скрывающие центральную часть восточного побережья Соединенных Штатов и северо-западную часть Бразилии.