// normal = точка на поверхности сферы (0, 0, 0) normal = р; Рассеянная часть освещения вычисляется следующими тремя строками кода: intensity - 0.2: // ambient

intensity += 0.8 * clarap(dot(LightDir, normal). 0.0. 1.0): surfColor *= intensity: Результат вычисления только рассеянного освещения показан на цветном рис. 7, й. Последний шаг - добавление зеркального компонента следующими тремя строками кода:

intensity - clamp(dot(HVector. normal), 0.0. 1,0): intensity = powfintensity. SpecularColor.a): surfColor += SpecularColor * intensity: Как видно на цветном рис. 17, б, зеркальное освещение идеально. Так как нормаль поверхности вычисляется очень точно для каждого фрагмента, здесь нет эффекта мозаики, который обычно наблюдается. На последнем шаге значение записывается в gl_FragColor и посылается для окончательной обработки перед тем, как отправиться в буфер кадров.

gl_FragColor = vec4 (surfColor, 1.0): Вот и все, игрушечный шар создан. Полностью код фрагментного шейдера приведен в листинге 11.5.

Листинг 11.5. Фрагментный шейдер для рисования игрушечного шара

varying vec4 ECposltion: И Координаты поверхности в пространстве обзора

varying vec4 ECbal 1 Center; !J Центр шара в пространстве обзора

uniform vec4 LightDir; // направление освещения, нужна нормализация

uniform vec4 HVector: // вектор отражения для освещения

uniform vec4 SpecularColor:

uniform vec4 Red, Yellow. Blue;

uniform vec4 HalfSpaceO; // полупространства, определяющие звезду

uniform vec4 HalfSpacel:

uniform vec4 HalfSpaceS:

uniform vec4 HalfSpace3;

uniform vec4 HalfSpace4:

uniform float InOrOutlnit: // = -3

uniform float StripeWidth; // = 0.4

uniform float FWidth; 11 = TBD

void main(void)

{

vec4 normal: // Аналитически вычисленная нормаль

vec4 p; И Точка

vec4 surfColor; // Вычисленный цвет поверхности

float intensity: // Вычисленная интенсивность освещения

vec4 distance; // Вычисленные значения расстояния

float inorout; // Счетчик для вычисления звезды

p.xyz = normalize(ECpos'ition.xyz - ECbal 1 Center.xyz); p.w =■ 1.0;

inorout = InOrOutlnit: // инициализация inorout в -3


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