Объекты состояния (Direct3D 10)

В Direct3D 10 состояние устройства сгруппировано в объекты состояния, что значительно снижает затраты на изменение состояния. Есть несколько объектов состояния и каждый из них разработан для инициализации набора состояний определенной стадии конвейера. Можно создать до 4096 объектов состояния каждого типа.

Состояние макета входных данных

Эта группа состояний (см . D3D10_INPUT_ELEMENT_DESC) определяет, как этап входного ассемблер считывает данные из входных буферов и собирает их для использования вершинным шейдером. Сюда входит такое состояние, как число элементов в буфера ввода и подпись входных данных. Этап сборщика входных данных — это новый этап конвейера, задача которого заключается в потоковой передаче примитивов из памяти в конвейер.

Сведения о создании объекта input-layout-state см. в разделе CreateInputLayout.

Состояние средства прорисовки

Эта группа состояний (см . D3D10_RASTERIZER_DESC) инициализирует этап растеризатора. Этот объект содержит такие состояния, как режимы заливки и отбрасывания, включение прямоугольника обрезки и установка параметров множественной дискретизации. На этой стадии примитивы преобразуются в пиксели с помощью таких операций, как вырезание и сопоставление примитивов с окном просмотра.

Сведения о создании объекта состояния растеризатора см. в разделе CreateRasterizerState.

Состояние трафарета глубины

Эта группа состояний (см . D3D10_DEPTH_STENCIL_DESC) инициализирует часть трафарета глубины на этапе слияния и вывода. В частности этот объект инициализирует тесты глубины и трафарета.

Сведения о создании объекта depth-stencil-state см. в разделе CreateDepthStencilState.

Состояние смешения

Эта группа состояний (см . D3D10_BLEND_DESC) инициализирует часть смешения этапа слияния и вывода.

Сведения о создании объекта blend-state см. в статье CreateBlendState.

Состояние выборки

Эта группа состояний (см . D3D10_SAMPLER_DESC) инициализирует объект sampler. Объект дискретизатора используется стадиями шейдера для фильтрации текстур в памяти.

Различия между Direct3D 9 и Direct3D 10:

  • В Direct3D 10 объект sampler больше не привязан к определенной текстуре, он просто описывает, как выполнять фильтрацию по любому присоединенному ресурсу.

 

Сведения о создании объекта sampler-state см. в разделе CreateSamplerState.

Вопросы производительности

Разработка API-интерфейса с применением объектов состояния дает несколько преимуществ в плане производительности. К ним относятся проверка состояния во время создания объекта, возможность кэширования объектов состояния на аппаратном уровне, значительно сокращает объем состояния, который передается во время вызова API, задающего состояние (путем передачи дескриптора на объект состояния вместо самого состояния).

Для подобного повышения производительности следует создать объекты состояний при запуске приложения, задолго до цикла отрисовки. Объекты состояния постоянны, то есть их нельзя изменить после создания. Вместо этого необходимо их уничтожать и создать заново. Чтобы справиться с этим ограничением, можно создать до 4096 объектов состояния каждого типа. Например, можно создать несколько объектов sampler с различными сочетаниями состояния и состояния выборки. Затем изменение состояния выборки выполняется путем вызова соответствующего API Set, который передает дескриптор объекту (в отличие от состояния выборки). Это значительно сокращает издержки во время формирования каждого кадра на изменение состояния, так как число вызовов и объем данных существенно снижается.

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

Функции API (Direct3D 10)