Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
калачева перевод.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
237.97 Кб
Скачать

Указание унифицированных блоков в шейдере

Для доступа к собранию унифицированных переменных с помощью процедур вроде glMapBuffer() (см. Главу 3, “Рисование в OpenGL”, для подробного описания) вам понадобится немного модифицировать их заявку в вашем шейдере. Вместо заявления каждой унифицированной переменной по отдельности, сгруппируйте их, как мы проделывали со структурами, в унифицированный блок. унифицированный блок задается с помощью ключевого слова. После этого вы заключаете все необходимые переменные в этот блок при помощи пары скобок, как в Примере 2.3,

Пример 2.3 Объявление унифицированного блока

uniform Matrices {

mat4 ModelView;

mat4 Projection;

mat4 Color;

};

Помните: типы данных делятся на два вида - прозрачные и непрозрачные. В непрозрачные входять сэмплеры, изображения и ядерные счетчики. Только прозрачные типы допустимы в унифицированном блоке. Дополнительно, унифицированные блоки должны быть заявлены глобально.

Контроль макета унифицированных блоков

Для определения макета переменных внутри унифицированного блока существует много разных квалификаторов. Эти квалификаторы могут быть использованы для каждого отдельного унифицированного блока, или же для указания как все последующие унифицированные блоки должны собираться (после определения заявки макета). Употребимые квалификаторы указаны в Таблице 2.12

Таблица 2.12 Квалификаторы макета для Uniform

Квалификатор Описание

shared Указать, что унифицированный блок общий для нескольких программ

(этот макет по умолчанию не то же, что квалификатор хранилищ shared)

packed Расположить блок так, чтобы минимизировать использование им памяти;

однако, это отключает общее владение им разными программами.

std140 Использовать стандартный макет для блоков uniform или совместное х

ранилище для блоков buffer, как описано в Appendix I, ‘‘Buffer Object

Layouts’’.

std430 Использовать стандартный макет для блоков buffer, как описано в

Appendix I, ‘‘Buffer Object Layouts’’.

row_major Сохранить матрици в унифицированных блоках в виде построчных..

column_major Указать, что матрицы хранятся в постолбцовом виде (по умолчанию)

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

layout (shared, row_major) uniform { ... };

разные опции квалификации должны быть разделены запятыми внутри круглых скобок. Для того, чтобы эти изменения применялись ко всем последующим блокам, воспользуйтесь

layout (packed, column_major) uniform;

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

Доступ к унифицированным переменным заявленным в унифицированном блоке

Хотя блоки проименованы, унифицированные переменные в них не определяются по этому наименованию. То есть, унифицированный блок не включает наименование унифицированной переменной, поэтому указание двух переменных с одним названием в двух разных унифицированных блоках приведет к ошибке. Однако, для доступа к унифицированной переменной не обязательно использовать наименование блока.