2013-11-30 5 views
1

У меня есть быстрый вопрос о том, какой более правильный подход к чему-то есть.Динамическое изменение в шейдере

Я использую C++ DirectX11 для следующего примера.

Пример: Если вы нажмете клавишу, она активирует текстуры, если вы нажмете другую клавишу, она отключит текстуры.

Подход № 1: Первоначально, как я собирался сделать это, нужно добавить переменную bool в cbuffer, а затем просто передать результат этой переменной для определения того, создает ли шейдер текстуры или нет.

Подход №2: Как я читал книгу, которую я купил на DirectX, я заметил, что у него есть отдельный метод для каждого объекта, а затем для каждого метода он устанавливает кучу переменных, которые передаются в пиксельный шейдер , Я попытался сделать это с приведенным выше примером, чтобы у меня было два метода: один с текстурами и один без текстур, а затем основанный на ключевом вводе, чтобы просто изменить имя метода.

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

ответ

2

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

Смежные вопросы