Типы доступных дискретизаторов:

□ sampl erlD - предоставляет доступ к одномерной текстуре;

□ sampl er2D - предоставляет доступ к двухмерной текстуре;

□ sampl er3D - предоставляет доступ к трехмерной текстуре;

□ sampl erCube - предоставляет доступ к кубической текстуре;

□ sampl erlDShadow - предоставляет доступ к одномерной текстуре глубины со сравнением;

□ sampl er2DShadow - предоставляет доступ к двухмерной текстуре глубины со сравнением.

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

Объявить семплер можно, например, таким образом:

uniform sampler20 Grass: (О модификаторе uniform подробно рассказывается в разделе 3.5.)

Эту переменную затем можно передать в соответствующую функцию поиска текстур:

vec4 color - texture2D(Grass. coord):

Здесь coord - переменная типа vec2, в которой содержится двухмерная координата текстуры Grass, и color - результат выполнения поиска по текстурам. И компилятор, и OpenGL API проверят, что Grass действительно двухмерная текстура и что она передается только двухмерным семплерам.

Шейдеры не могут сами работать со значениями семплеров. Например, нельзя написать выражение Grass + 1. Если в шейдере нужно совместить несколько текстур по какому-то особому правилу, используется массив семплеров, как в примере:

const int NumTextures = 4;
uni form sampler2D textures[NumTextures];

Потом их можно поместить в цикл:

for (int i = 0: i < NumTextures; ++i) … = texture2D(textures[i]. …);

После этого необходимое, но недоступное выражение Grass + 1 может выглядеть как вполне доступное [Grassindex + 1].

3.2. Типы данных

3.2.5. Структуры

Ётруктуры. в языке шейдеров OpenGL похожи на структуры языка С: struct light


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