В данном фрагментном шейдере входные текстурные координаты $ и £ (компоненты встроенной varying-переменной g1_TexCoord0) используются для поиска значения в текстуре, связанной с текстурным модулем 0. Результат умножается на значение интенсивности освещения, вычисленное вершинным шейдером и переданное в varying-переменной. Затем значение двета приводится к определенному диапазону и учитывается значение прозрачности 1,0 для получения окончательного цвета фрагмента, отправляемого на завершающую обработку, включая проверку глубины. Полученное изображение сферы показано на цветном рис. 3.

Листинг 10.2, Пример фрагментного шейдера для простого наложения текстуры

varying float Lightlntensity: uniform sampler2D EarthTexture:

void main (void)

{

vec3 lightColor = vec3 (texture2D(EarthTexture, gl_TexCoord[0].st)); gl_FragColor = vec4 (lightColor * Lightlntensity, 1.0);

}

10.3. Пример множественной текстуры

Окончательное изображение выглядит неплохо, однако, приложив немного больше усилий, можно его улучшить. Известно, что на нашей планете огромное количество искусственных источников освещения, и в ночное время большие мегаполисы и города будут видны как пятна света даже из космоса. Используем угол между направлением света и нормалью в каждой точке поверхности и определим, на дневной или ночной стороне находится точка. Для точек, расположенных на дневной поверхности, будет использована «дневная» текстура (обычное изображение, без городского освещения), а для точек на ночной поверхности - «ночная» текстура (без освещения обычным источником освещения, но с учетом городского освещения). Дневная и ночная текстуры показаны на цветном рис. 5.

Другая не совсем реалистичная особенность - отсутствие отражения солнечного света от поверхности океанов и больших озер. Вода очень хорошо отражает свет, и когда линия падения и отражения почти совпадают, мы должны видеть отраженное освещение. Но у пустынь, травы и деревьев такого свойства нет, так что нужно подумать, как создать отражение от воды, но не от суши.

Выйти из положения поможет применение способа, называемого карта отражений (gloss map). Это будет измененная исходная текстура, в которой области, представляющие воду, будут иметь значения 1,0, а все остальные - значения 0. Значение для каждого фрагмента будет считано из этой текстуры, а затем умножено на отражающую составляющую применяемого уравнения освещения. Такую карту очень просто создать почти в любом графическом редакторе. Самый простой способ это сделать - отредактировать красный канал дневного изображения без облаков. В этом канале все водные области будут черными или почти черными, так как красного цвета в них очень мало. Можно применить специальный инструмент для выбора всех черных (вода) областей. После этого все выбранные области окрашиваются в белый цвет. Выборка инвертируется, и все остальные области заполняются черным цветом. В результате получится текстура, в которой значение 1,0 (белый цвет) имеют отражающие области, а значение 0 (черный цвет) - не отражающие. Значение отражения будет множителем при вычислении отражения, так что области с водой будут иметь составляющую отражения, а остальные области - нет. Такая карта отражений представлена на рис. 10.1.


⇐ вернуться назад | | далее ⇒