}:
uniform gl_LightModelProducts gl_FrontLightModelPraduct; uni form gl_LigfitWodelProducts gl_BackLightMode1Product:
struct gl_LightProdiicts {■
vec4 ambient: // Acn * Acli
v.ec4 diffuse: // Dcm * Deli
vec4 specular: .// Scm * Scli
}:
uniform gl_LightProducts gl_FrontLightProduct[gl_Maxlights]: uniform gl_LightProducts g1_BackLightProduct[gl_MaxLights]:
/■/
Jt, Текстуры И
uniform vec4 gl_TextureEnvColor[gl_MaxTextureImageLlnits]; uniform vec4 gl_EyePlaneS[gl_MsxTextureCoords]: gniform vec4 g1_EyePlaneT[gl_MaxfextureCoords]: uniform vec4 gl_EyePlaneR[gl_MaxTextureCoords]: uniform vec4 gl_EyePlaneQ[gl_MaxTextureCoords]: uniform vec4 gl_ObjectPlaneS[gl_MaxTextureCoords]; uniform vec4 gl^O&jectPlaneTCgl^axTextureCoords]; uniform vec4 gl_ObjectPlaneR[gl_MaxTextureCoords]: uniform vec4 gl_ObjectPlaneQ[gl_HaxTextureCoords]:
//
.// Дымка
//
struct gl^FogParameters {
vec4 color: float density: float start: float end:
float scale: // 1 / Cgl_Fog.end - gl_Fog.start)
}:
uniferm g1_FagParameters glFog: Приведенные здесь встроенные uniform-переменные определены таким образом, чтобы получить наибольшее преимущество от возможностей языка. Параметры сгруппированы в структуры, например: параметры диапазона глубины, параметры материала, параметры освещения и дымки. Для определения источников света и плоскостей отсечения используются массивы. Определение uniform-перемен-ных.в таком виде улучшает удобочитаемость кода и позволяет шейдерам, например, обрабатывать такие данные с помощью циклов.
В приведенном списке встроенных uniform-переменных (см. листинг 4.1) есть несколько переменных, которые хранят вторичные значения. Это значит, что значения не устанавливаются приложением через функции OpenGL, а реализация OpenGL сама определяет их значения, исходя из ранее установленных величин. Это удобнее, чем если бы пришлось вычислять эти значения самостоятельно в шейдере. Пример таких значений - матрица нормалей gl_NormalMatrix. Она получена простым обратным транспонированием верхнего левого угла матрицы модели-вида размером 3x3. Но матрица нормали обычно используется так часто, что нет смысла требовать от шейдеров вычислять ее самостоятельно. Вместо этого OpenGL по необходимости сам вычисляет нужное значение, доступное шейдерам через встроенную uniform-переменную.
Вот несколько примеров использования подобных переменных. Вершинный шейдер может преобразовать координаты вершины gl_Vertex с помощью матрицы проекции и модели-вида с помощью следующего кода: gl_Position = gl_Mo.delViewProjectionMatrix * gl Vertex: Таким же способом вычисляется нормаль: triorm = gl_NormalMatrix * gl Normal; Преобразованная нормаль должна быть дополнительно нормализована для вычисления освещения. Это можно сделать встроенной функцией norma 1 i ze (см. раздел 5.4),