Приведем несколько примеров доступа к состоянию OpenGL через описанные переменные:

gl_FrontMaterial.emission // значение излучения материала передней грани g1_LightSource[0],ambient // параметр рассеяния источника света #0 gl_ClipPlan.e[3][Q] // первый компонент плоскости отсечения #3

gl_fog.color.rgb П г-, д- и Ь-компоненты цвета дымки

gl_TextureMatrix[l][2][3J // 3-й столбец, 4-й компонент второй

// текстурной патрицы

Смысл всех этих'переменных и хранимых в них значений очевидны. За более подробной информацией следует обратиться к спецификации языка OpenGL.

4.4. Встроенные константы

В языке шейдеров Open GL определено много встроенных констант, доступных и для фрагментного, и для вершинного шейдеров. Это освещение, плоскости отсечения, модули текстур - все, что может возвратить функция gl Get для конкретной реализации. Есть также некоторые значения, появившиеся в OpenGL только с языком шейдеров, - максимальное количество числовых значений, которые могут сохраняться как uniform-переменные, доступные и вершинному, и фрагментному шейдерам; такие же значения для varying-переменных; максимальное количество доступных модулей текстур, максимальное количество наборов текстурных координат. Все эти значения можно получить с помощью функции gl Get (см. раздел 7.10).

OpenGL определяет минимальные значения, которые в конкретной реализации могут быть изменены в большую сторону. Эти значения - минимальная приемлемая норма для реализации OpenGL, на которую может рассчитывать любой разработчик: а

// Константы, зависящие от реализации. Эти значения -// установленный стандартом минимум.

//

const int gl_MaxLights = 8; const int gl_MaxClipPlanes - 6: const int gl_MaxTextureUnits ■= 2:

const int gl_MaxTextureCoords = 2;

const int gl JlaxVertexAttribs = 16:

const int glJ4axVertexUniformComponents = 512;

ccr.st int gl_MaxVaryingFloats = 32;

const int gl_MaxVertexTextureImagellnits = 0;

const int glJIaxTexturelmageUnits = 2:

const int gl_MaxFragmentUnifonnComponents = 64;

const int glJiaxCombinedTexturelmageUnits = 2; Перечисленные константы могут понадобиться шейдеру. Например, шейдер может запускать функцию вычисления освещения, которая в цикле будет проходить по всем заданным источникам освещения, учитывая их параметры для вычисления параметров вершины. Такой цикл можно организовать, используя встроенную константу glJIaxLights. Но, скорее всего, приложение будет использовать . даже не эту константу, а функцию gl Get, чтобы можно было определить, следует ли вообще загружать шейдер (см. раздел 7.10).

.5. Взаимодействие со стандартными операциями OpenGL

Этот раздел содержит в основном подробности для опытных разработчиков, которые хорошо знакомы с OpenGL и хотят узнать, как программируемые возможности OpenGL будут взаимодействовать с остальной функциональностью.

4.5.1. Двухсторонний цветовой режим

Вершинные шейдеры могут работать в двухстороннем цветовом режиме. Цвет передней и задней сторон вычисляется вершинным шейдером и записывается в переменные gl_FrontCol or, gl_BackCoT or, g7_FrontSecondaryGol or Hg1_BackSecondaryColor. Если включен именно этот режим, один из этих цветов в OpenGL будет выбран для дальнейшей обработки. Выбор зависит от вида примитива и знака оконных координат этого примитива (за более точным описанием необходимо обратиться к спецификации). Если двухсторонний режим цвета отключен, OpenGL всегда выбирает цвет передней стороны. Этот режим можно переключать функциями gl Enable и gl Disable, передавая константу GL_VERTEX_PROGRAM_TWO_SIDE_ARB.


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