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

Листинг 10.4. Фрагментный шейдер «как вращается мир»

uniform sampler2D EarthDay: uniform sampler2D EarthNight: uniform sampler2D EarthCloudGloss:

varying float Diffuse: varying vec3 Specular: varying vec2 TexCoord:

void main (void)

{

II Монохромное значение облачного покрытия будет в clouds.г // Значение отражения от воды будет в clouds.g И clouds.b не будет использоваться

vec3 clouds = texture2D(EarthCloudGloss, fexCoord).stp; vec3 daytime = Ctexture2D(EarthDay. TexCoord).stp * Diffuse +

Specular * clouds.g) * (1.0 - clouds.r) + clouds.r * Diffuse: vec3 nighttime = texture2D(EarthNight. TexCoord).stp *

(1.0 - clouds.r):

vec3 color = daytime: if (Diffuse < -0.1) color - nighttime: if (abs(Diffuse) < 0.1)

color = mix(nighttime, daytime, (Diffuse + 0.1) * 5.0):

gl_FragColor = vec4 (color, 1.0):

}

10.4. Пример наложения карты среды

Способ моделирования отражения в сложной среде без использования трассировки лучей называется наложение карты окружающей среды. Чтобы реализовать этот способ, нужна одна или несколько текстурных карт, имитирующих отражение среды вокруг объекта, над которым выполняется рендеринг. Лучше всего использовать этот способ на объектах, которые имеют хорошие зеркальные свойства поверхности. Существует несколько вариантов наложения карты среды, в том числе кубическое наложение и сферическое наложение, и оба они поддерживаются стандартом OpenGL.

Если от нужного эффекта не требуется совершенство изображения, самый простой способ выполнить наложение карты среды - использовать простую текстурную карту из равных прямоугольников. Можно получить этот тип текстуры с помощью фотографий реальной окружающей среды или создать имитирующее изображение, Пример показан на цветном рис. 7.

Как бы ни было получено изображение, результатом является простая картинка, охватывающая 360° по горизонтали и 180° по вертикали. Изображение искривлено, чтобы после наложения на объект оно получилось пропорциональным.

Основная идея наложения карты среды - в том, чтобы определить цвет отражения из «среды», хранимой в текстуре, используя вектор отражения от поверхности объекта. Если все сделать правильно, результат выглядит так, как будто объект блестит и отражает свое окружение.

Для того чтобы использовать текстуру из равных прямоугольников как карту окружения, нужно вычислить пару углов, которые затем использовать для доступа к текстуре. Угол возвышенности вычисляется определением угла между направлением отражения и плоскостью XZ. Значение угла возвышенности должно оказаться в диапазоне от 180 (отражение прямо вверх) до -180° (отражение прямо вниз). Синус этого угла будет колебаться от 1,0 до -1,0, и его можно использовать, чтобы получить текстурную координату в диапазоне [0,1].


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