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

Объявление пременной может иметь не более одного спецификатором памяти, указываемого перед типом. Вот они:

Классификатор

Значение

<none: default> локальная память для чтения/записи или параметр принимаемый функцией
const переменная, чье значение не может быть изменено
in переменная привязывается к шейдер посредством копирования из предыдущего этапа
out переменная привязывается к следующему этапу посредством копирования
attribute только для совместимого профиля и только для вершинного языка; аналогично in в вершинном шейдере
uniform значение не изменяется в обрабатываемом примитиве, uniform’ы создают связь между шейдером, OpenGL и приложением
varying только для совместимого профиля и только для вершинного и фрагментного языков; аналогично out в вершинном шейдере и in в фрагментном.
buffer значение хранится в буфере объекта и может быть прочитано или записано посредством вызова из шейдера или API
shared только для вычислительных шейдеров; память переменной в шейдере доступна всем рабочим элементам в локальной рабочей группе

Некоторые входящие и исходящие переменные могут иметь более чем одним спецификатор памяти:

Дополнительный спецификатор памяти

Значение

centroid центроидная интерполяция
sample по-сэмплерная интерполяция
patch атрибут для прохода теселяции

Не все комбинации спецификаторов разрешены. Вспомогательные спецификаторы памяти могут быть использованы только  с спецификаторами памяти in и out. Правила вспомогательных спецификаторов определяются в следующих разделах.

Локальные переменные могут использовать только const спецификатор памяти (или не использовать спецификатор памяти).

Параметры функций могут использовать спецификаторы const, in и out, но в качестве спецификатора параметра. Спецификаторы параметров описываются в разделе  6.1.1 “Function Calling Conventions”.

Функции возвращают типы и члены структур не используя спецификаторов памяти.

Инициализаторы в глобальных объявлениях могут использоваться только в объявлениях глобальных переменных без классификатора памяти, со спецификатором const или со спецификатором uniform. Глобальные переменные без спецификатора памяти, которые не инициализируются во время объявления или приложением, не будут инициализироваться и OpenGL, а вернее  будут попадать в main() с неопределенными значениями.

При не совпадении (или отсутствии) вспомогательных спецификаторов будут не совпадения на выходе одного этапа и входе на другой.

Main Admin

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *