В приведенном списке встроенных uniform-переменных (см. листинг 4.1) есть несколько переменных, которые хранят вторичные значения. Это значит, что значения не устанавливаются приложением через функции OpenGL, а реализация OpenGL сама определяет их значения, исходя из ранее установленных величин. Это удобнее, чем если бы пришлось вычислять эти значения самостоятельно в шей-дере. Пример таких значений - матрица нормалей gl_NormalMatrix. Она получена

Программируемая часть операций OpenGL

простым обратным транспонированием верхнего левого угла матрицы модели-вида размером 3x3. Но матрица нормали обычно используется так часто, что нет смысла требовать от тендеров вычислять ее самостоятельно. Вместо этого OpenGL по необходимости сам вычисляет нужное значение, доступное шейдерам через встроенную uniform-переменную.

Вот несколько примеров использования подобных неременных. Вершинный шейдер может преобразовать координаты вершины gl_Vertex с помощью матрицы проекции и модели-вида с. помощью следующего кода:

gl_Position = gl_Mode1 ViewProjectionMatriх * gî_Vertex: Таким же способом вычисляется нормаль:

Worm = gl_NormalMatrix * gi Normal :

Преобразованная нормаль должна быть дополнительно нормализована для вычисления освещения. Это можно сделать встроенной функцией norma 1 i ze (см. раздел 5.4).

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

gl_FrontMaterial.emission // значение излучения материала передней грани gl_LightSource[0].ambient // параметр рассеяния источника света #0 gl_Clip.Plane[3][0] // первый компонент плоскости отсечения #3

gl_Fog.color.rgb // г-, g- и b-компоненты цвета дымки

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

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

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


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