Что такое хороший способ управления состоянием при замене шейдеров Direct3D 11? - PullRequest
1 голос
/ 25 февраля 2011

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

После рендеринга моей сцены в текстуру я меняю вершинный и пиксельный шейдеры Immediate Context на постпроцессорные, но я не уверен, как мне следует управлять состоянием (например, параметрами текстуры и постоянными буферами). Менять местами шейдеры, а затем вручную сбрасывать постоянные буферы и текстуры дважды в каждом кадре, кажется невероятно расточительным, и в некотором роде побеждать точку постоянных буферов, но, насколько я вижу, вы не можете установить данные для объекта шейдера , оно должно быть передано в контекст.

Что другие люди предлагают для довольно простых и эффективных способов управления переменными и текстурами при включении и выключении шейдеров?

1 Ответ

3 голосов
/ 05 марта 2011

Поскольку у вас не было ответов от экспертов D3D11, я предлагаю свой ограниченный опыт работы с D3D9, за что он стоит.

... дважды каждый кадр кажется невероятно расточительным ...

«Кажется» - это подозрительное слово там. Вы измерили удар производительности? Дважды за кадр звучит не так уж плохо.

Для текстур я назначаю свои регистры текстуры в соответствии с назначением. Я использую регистры = s4 для рендеринга целевых текстур, которые назначаются только один раз в начале игры. Так, например, мой шейдер основной сцены имеет следующее:

sampler2D DiffuseMap : register(s0);
sampler2D DetailMap : register(s1);

sampler2D DepthMap : register(s4);
sampler2D ShadowMap : register(s5);
sampler2D LightMap : register(s6);
sampler2D PrevFrame : register(s7);

Итак, мой шейдер частиц имеет уменьшенный набор, но текстура DepthMap все еще находится в том же слоте ...

sampler2D Tex : register(s0);
sampler2D DepthMap : register(s4);

Я не знаю, насколько это применимо к D3D11, но я надеюсь, что он пригодится.

...