inDTDut = clamptinorout, 0.0. 1.0);

На этом этапе можно вычислять цвет поверхности фрагмента. Мы используем вычисленное значение i norout для достижения плавного перехода между желтым и красным цветами, чтобы определить звезду. Если остановиться здесь, результат

Процедурные текстурные шейдеры

будет таков, как на цветном рис. 16, а. Если же выполнить плавный переход к цвету полосы, результат будет таким, как на цветном рис. 16, б. Так как использовалась функция smoothstep, значения inorout и distance.у позволят получить хорошо сглаженный край между цветами:

surfColor = mixCYellow. Red, inorout); surfColor = mix(surfColor, Blue, distance.y);
Промежуточные результаты вычислений

Рис. 11.2. Промежуточные результаты вычислений: а - белым цветом обозначены точки на поверхности, находящиеся внутри по отношению ко всем пяти полуплоскостям, а серым - внутри по отношению только к четырем полуплоскостям; б- значение inorout приведено к диапазону [0, 1] (ATI Research, Inc.)

На этом этапе результат получается плоский и нереалистичный, и чтобы улучшить его, нужно рассчитать параметры освещения. Первый шаг - аналитически вычислить нормаль для данного фрагмента, что мы можем сделать, поскольку известны координаты центра шара в пространстве координат обзора (их можио получить из varying-переменной ЕСЬа 11 Center) и известны координаты фрагмента в пространстве координат обзора (из Exposition). (Этот подход можно использовать также в шейдере земного шара, создаваемого в разделе 10.2, чтобы не передавать нормаль поверхности и использовать интерполированные результаты.) На самом деле мы уже вычислили это значение и сохранили в р:

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

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


⇐ Предыдущая| |Следующая ⇒