Хранение переменных и типов для совместного использования шейдерами
Объект связи класса — это пространство имен для переменных и типов, которые могут совместно использовать несколько шейдеров. При передаче объекта компоновки класса в вызове для создания шейдера среда выполнения собирает список переменных и типов, которые могут реализовать каждый интерфейс в шейдере и сохраняет имена этих переменных и типов в объекте компоновки класса.
Поэтому при вызове метода ID3D11ClassLinkage::GetClassInstance для создания экземпляров классов из объекта компоновки класса среда выполнения может получить переменную или тип, соответствующую имени, предоставленному в каждом шейдере (если это имя допустимо для данного шейдера) и создается с заданным объектом компоновки классов.
Например, предположим, что у вас есть класс Light, реализующий интерфейс Color, и этот класс используется в шейдере вершин и шейдере пикселей. При создании шейдера (например, вызовом ID3D11Device::CreatePixelShader), среда выполнения определяет, что тип класса Light доступен как в вершинах, так и в шейдерах пикселей и добавляет тип класса Light в объект компоновки классов. Затем можно создать экземпляр Light в выбранном вами месте, привязать ресурсы для обоих шейдеров и передать этот экземпляр в массив экземпляров классов при задании шейдера устройству (например, путем вызова ID3D11DeviceContext::PSSetShader). Затем среда выполнения выполняет следующую последовательность:
- Проверяет, был ли экземпляр создан с тем же объектом связи класса.
- Проверяет, доступен ли тип класса Light как в шейдерах вершин, так и в шейдерах пикселей.
- Выбирает правильные таблицы функций, которые могут отличаться для вершин и шейдеров пикселей.
- Передаёт смещения, которые предоставляет экземпляр.
Объект компоновки класса в конечном счете является репозиторием имен типов и переменных. Максимальное число имен, доступных для каждого элемента (типа и переменной), равно 64K. Чем дольше имена типов и переменных, тем выше требование к хранилищу для метаданных интерфейса, хранящихся на шейдере. Это связано с тем, что среда выполнения должна хранить сопоставление для этих имен для каждого шейдера.
Связанные разделы
Связанные разделы