Поделиться через


Хранение переменных и типов для совместного использования шейдеров

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

Таким образом, при вызове метода ID3D11ClassLinkage::GetClassInstance для создания экземпляров класса из объекта компоновки класса среда выполнения может получить переменную или тип, соответствующий имени, предоставленному в каждом шейдере (если это имя допустимо для заданного шейдера) и созданного с помощью заданного объекта компоновки класса.

Например, предположим, что у вас есть класс Light , реализующий интерфейс Color , и вы используете этот класс в вершинном шейдере и пиксельном шейдере. При создании шейдера (например, путем вызова ID3D11Device::CreatePixelShader) среда выполнения определяет, что тип класса Light доступен как в вершинных, так и в пиксельных шейдерах, и добавляет тип класса Light в объект компоновки класса. Затем можно создать экземпляр Light в нужном расположении, привязать ресурсы для обоих шейдеров и передать этот экземпляр в массив экземпляров класса при установке шейдера на устройство (например, путем вызова ID3D11DeviceContext::P SSetShader). Затем среда выполнения выполняет следующую последовательность:

  1. Проверяет, был ли экземпляр создан с тем же объектом компоновки класса.
  2. Проверяет, доступен ли тип класса Light как в вершинных, так и в пиксельных шейдерах.
  3. Выбирает правильные таблицы функций, которые могут отличаться для вершинных и пиксельных шейдеров.
  4. Отправляет вниз смещения, которые предоставляет экземпляр.

Объект компоновки класса в конечном счете является репозиторием имен типов и переменных. Максимальное количество имен, доступных для каждого элемента (типа и переменной), составляет 64 КБ. Чем длиннее имена типов и переменных, тем выше требования к хранилищу для метаданных интерфейса, которые хранятся для каждого шейдера. Это связано с тем, что среда выполнения должна хранить сопоставление для этих имен для каждого шейдера.

Динамическое связывание

Динамическое связывание