Листинг 9.10. Цикл для вычисления суммарного освещения от всех источников
// Инициализация переменных для накопления интенсивности света
amb = vec4 (0.0): „ .
прадолжяше
Традиционные шейдеры
Листинг 9.10 (продолжение)
diff = vec4 (0.0); spec = vec4 (0.0):
// Цикл по включенным источникам for Ci = 0: i < NumEnabledLights: (
if Cgl_LightSource[i].position.w == 0.0)
DirectionalLightti. normal, amb, diff. spec): else if (gl_LightSource[i].spotCutoff = 180.0)
PointLightd, eye. ecPosition3. normal, amb. diff. spec): else
SpotLightCi. eye, ecPosition3. normal, amb. diff. spec):
}
Одна из дополнительных возможностей OpenGL 1.2 - функциональность для расчета цвета вершины за два этапа: сначала как обычно вычисляется первичный цвет, включая компоненты излучения, рассеяния и отражения; затем вторичный цвет, который содержит только компонент зеркального отражения. Если этот режим не включен (по умолчанию), первичный цвет будет содержать все компоненты: излучения, рассеяния, отражения и зеркального отражения.
Вычисление зеркального отражения отдельно от остальных позволяет накладывать его после текстурирования. Значение зеркального отражения накладывается на вычисленный цвет после текстурирования для того, чтобы отраженный свет был окрашен в цвет источника освещения, а не в цвет поверхности. Вычисление цвета поверхности без компонента зеркального отображения показано в листинге 9.11.
Листинг 9.11. Вычисление цвета поверхности без компонента зеркального отражения
color = gl_FrontLightModelProduct.sceneColor + amb * gl_FrontMaterial.ambient + diff * gl_FrontMaterial .diffuse;
Язык тендеров OpenGL предоставляет удобную встроенную переменную gl_FrontLi ghtModel Product. sceneCol or, в которой содержится значение излучающего свойства материала для передних поверхностей и общее значение рассеянного освещения (то есть gl_FrontMaterial.emission + gl_FrontMaterial.ambient * gl_LightModel .ambi ent). Можно сложить его с интенсивностью отраженного света и интенсивностью рассеянного света. В дальнейшем нужно поступать в зависимости от того, указан ли режим отдельного наложения компонента зеркального отражения (листинг 9.12).