Кто-нибудь знает быстрый способ вызвать обработку шейдеров через DirectX?
Сейчас я устанавливаю шейдеры с помощью вызовов D3DXCreateEffectFromFile
, которые создают шейдеры во время выполнения (по одному на каждый шейдер) из *.fx
файлов.
Рендеринг части для каждого объекта ( каждый патч в моем случае - см. Далее ) тогда означает что-то вроде:
// --------------------
// Preprocessing
effect->Begin();
effect->BeginPass(0);
effect->SetMatrix (or Vector or whatever - internal shader parameters) (...)
effect->CommitChanges();
// --------------------
// Geometry rendering
// Pass the geometry to render
// ...
// --------------------
// Postprocessing
// End 'effect' passes
effect->EndPass();
effect->End();
Это нормально, но профилировщик показывает странные вещи - preprocessing
(см. Код) занимает около 60% времени (я рендеринг местностиобъект из 256 патчей, где каждый патч содержит около 10 тыс. вершин) .
Фактический рендеринг геометрии занимает ~ 35%, а постобработка - 5% от общего времени рендеринга.
Это кажется довольно страннымЯ и я думаю, что D3DXEffect
интерфейс не может быть лучшим решением для такого рода вещей.
У меня есть 2 вопроса:
1.Нужно ли мне реализовывать свой собственный контроллер / оболочку шейдера (возможно, низкого уровня) и с чего мне начать?
2.Поможет ли компиляция шейдеров как-то улучшить производительность установки параметров?
Может быть, кто-то знает, как решить эту проблему / какой-то реализованный интерфейс шейдера, или мог бы дать несколько советов о том, как эта проблема решается в современномигровые движки.
Спасибо.