Листинг 9.12. Завершающие вычисления цвета поверхности
if (SeparateSpecular)
gl_FrontSecondaryColor = vec4 (spec *gl_FrontMatenal .specular. 1.0): el se
color +- spec * gl_FrontMaterial.specular: gl_FrontColor = color:
Нет необходимости ограничивать значения (clamping) gl_FrontSecondaryColor и gl_FrontCol or, так как это будет сделано автоматически.
9;5. Сггсутствие освещения
,4. Двухстороннее освещение Чтобы в OpenGL имитировать двухстороннее освещение, нужно инвертировать нормаль поверхности и выполнить те же самые вычисления, что и в предыдущем разделе, но только со значениями задней поверхности материала. Возможно, при необходимости читатель выполнит такие вычисления более оптимально, а сама идея вычислений содержится в листинге 9.13.
Листинг 9.13. Вычисление двухстороннего освещения
normal - -normal:
II Инициализация переменных для накопления интенсивности освещения .amb = vec4 (0.0); diff = vec4 (0.0): Spec - vec4 (0.0);
// Цикл по всем источникам, вычисление компонентов освещения от каждого for (i = 0; i < NumEnabledLights: i++)
{
if (gl_LightSource[i].position.w == 0.0)
DirectionalLight(i. normal, amb, diff, spec); else if (gl_LightSource[i].spotCutoff == 180.0)
PointLightCi. eye. ecPosition3. normal, amb. diff. spec): else
SpotLigfttd, eye. ecPosition3. normal, amb, diff. spec):
}
color = gl_Backl_ightModelProduct.sceneColor + amb * gl_BackMaterial.ambient + diff * glBackMaterial .diffuse;
if (SeparateSpecular)
gIBackSecondaryColor = vec4 (spec *gl_BackMaterial .specular. 1.0); else
color +- spec * gl_BackMaterial.specular: gl_BackColor = color:
Нет необходимости ограничивать значения gl_BackSeconda ryCol or и gl_BackCol or, потому что это выполняется автоматически.
.5. Отсутствие освещения Если ни один источник освещения не включен, можно просто передать первичный и вторичный цвета вершины дальше (листинг 9.14).
Листинг 9.14. Установка значений цвета без освещения
If (SecondaryColor).
gl_FrontSecondaryColor = gl_SecondaryColor:
// Для gl_FrontColor ограничение будет выполнено автоматически gl_FrontColor - gl_Color: