□ sampl er3D - предоставляет доступ к трехмерной текстуре;
□ sampl erCube - предоставляет доступ к кубической текстуре;
□ sampl erlDShadow - предоставляет доступ к одномерной текстуре глубины со сравнением;
□ sampl er2DShadow - предоставляет доступ к двухмерной текстуре глубины со сравнением.
При инициализации дискретизатора реализация OpenGL записывает в него все необходимое для поиска текстур. Сами шейдеры не могут ничего туда записывать. Они могут только получить доступ к семплерам через соответствующую uniform-переменную или передать их пользователю или во встроенные функции. Семплер как входной параметр не может быть изменен, так что шейдеры не могут их редактировать.
Объявить семплер можно, например, таким образом: uniform samplerZO Grass:
(О модификаторе uniform подробно рассказывается в разделе 3.5.)
Эту переменную затем можно передать в соответствующую функцию поиска текстур:
vec4 color = texture2D(Grass, coord): Здесь coord - переменная типа vec2, в которой содержится двухмерная координата текстуры Grass, и color - результат выполнения поиска по текстурам. И компилятор, и OpenGL API проверят, что Grass действительно двухмерная текстура и что она передается только двухмерным семплерам.
Шейдеры не могут сами работать со значениями семплеров. Например, нельзя написать выражение Grass + 1. Если в шейдере нужно совместить несколько текстур по какому-то особому правилу, используется массив семплеров, как в примере:
const int NumTextures = 4:
uniform sampler2D textures[NumTextures]; Потом их можно поместить в цикл:
for (int 1=0: i < NumTextures; ++i)
… = texture2D(textures[i].
После этого необходимое, но недоступное выражение Grass + 1 может выглядеть как вполне доступное [Grasslndex + 1].
3.2.5. Структуры
Структуры в языке шейдеров OpenGL похожи на структуры языка С:
■struct light
I
vec3 position; vec3 color;
}: Как и в C++, имя структуры является типом данных, и ключевое слово typedef в данном случае использовать не обязательно. Переменная типа light из этого примера может быть объявлена так: light ceilingLight; Все прочие особенности работы со структурами такие же, как в С. Структуры можно делать Членами других структур или объявлять внутри других структур, но тогда они не могут быть безымянными. В состав структур могут входить массивы. У каждого уровня вложенности есть собственное пространство имен для членов структуры.
Битовые поля (объявление целых чисел как набора битов) не поддерживаются. Сейчас все структуры являются только типами, определенными пользователем. Ключевые слова union, enum и class зарезервированы для возможного использования в будущем.
3.2.6. Массивы
В языке шейдеров OpenGL можно создавать массивы любых типов. Определение vec4 pointsCIO]: создает массив из десяти элементов типа vec4 с номерами от 0 до 9. Массив можно объявить только с помощью квадратных скобок, так как в языке нет указателей. Объявляются массивы без указания размера. Например, объявление vec4 points[]: