Спецификаторы памяти по умолчанию (Default Storage Qualifier)

Если глобальная переменная не имеет спецификатора, тогда переменная не привязывается к приложению или шейдерам на других этапах конвейера. Для глобальных или локальных переменных без спецификатора, объявление будет пыделять память, связанную с целевым процессором. Эта переменная будет  предоставлять доступ к выделенной… Continue Reading

Спецификаторы памяти (Storage Qualifiers)

Объявление пременной может иметь не более одного спецификатором памяти, указываемого перед типом. Вот они: Классификатор Значение <none: default> локальная память для чтения/записи или параметр принимаемый функцией const переменная, чье значение не может быть изменено in переменная привязывается к шейдер посредством… Continue Reading

Области видимости (Scoping)

Область видимости переменной определяется тем, где она объявлена. Если она объявлена вне всех функций, то имеет глобальную область видимости, начинающуюся с места объявления и до конца текущего шейдера. Соответственно если объявлена внутри while или for, то область действие до следующей итерации. (Смотри раздел 6.2… Continue Reading

Инициализаторы (Initializers)

При объявлении переменной может быть предоставлено начальное значение, заданное при помощи знака равенства (=), за которым следует инициализатор. Инициализатор представляет собой либо присваиваемое—выражение, либо список инициализаторов, заключенных в фигурные скобки. Грамматика для инициализатора: инициализатор : присваиваемое—выражение {список-инициализаторов} {список-инициализаторов , } список-инициализаторов :… Continue Reading

Неявные преобразования (Implicit Conversions)

В некоторых ситуациях выражение и его типы будут неявно преобразованы в другой тип. В таблице ниже показаны все разрешенные неявные преобразования: Тип выражения Может быть неявно преобразован в int uint int uint float int uint float double ivec2 uvec2 ivec3… Continue Reading

Массивы (Arrays)

Однотипные переменные могут быть объединены в массивы путем объявления имени и последующих квадратных скобок ( [] ), которые могут содержать (но не обязательно) размер массива.  Размер указанный при объявлении должен быть целочисленным постоянным выражением (см. раздел 4.3.3 “Constant Expressions”) больше… Continue Reading

Структуры (Structures)

Пользовательские типы могут быть созданы путем объединения других, уже определенных, типов в структуры, используя ключевое слово struct. Например: struct light { float intensity; vec3 position; } lightVar; В данном примере light является именем нового типа, а lightVar является переменной данного типа. Что… Continue Reading

Атомарные счетчики (Atomic Counters)

Типы атомарных счетчиков (atomic_uint) являются непрозрачными дескрипторами (handles) для счетчиков, которые объявляются и ведут себя как описанные ранее непрозрачные типы. Переменные, которые они объявляют, при использовании встроенных функций счетчика атомов указывают какой счетчик для доступа переменные данного типа указывают какой счетчик будет… Continue Reading

Изображения (Images)

Типы изображений являются непрозрачными типами, объявленными и ведущими себя как описанные ранее непрозрачные типы. Они могут быть дополнительно определены с помощью спецификаторов памяти. При объединении в массивы в шейдере, сэмплеры могут индексироваться только в динамически постоянных целочисленных выражениях, в противном случае результат… Continue Reading

Сэмплеры (Samplers)

Типы сэмплеров (например sampler2D) являются непрозрачными типами, объявленными и ведущими себя как описанные ранее непрозрачные типы. При объединении в массивы в шейдере, сэмплеры могут индексироваться только в динамически постоянных целочисленных выражениях, в противном случае результат не определен. Сэмплерные переменные являются… Continue Reading