Direct3D 10 и управление шейдерами - PullRequest
2 голосов
/ 09 мая 2009

Я кодирую 3D-приложение с DirectX 10, и мне интересно, как обстоят дела с шейдерным управлением.

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

Также мне интересно, насколько быстрым является порядок рендеринга с помощью шейдера, чтобы переключатели шейдера были минимизированы.

Ответы [ 2 ]

2 голосов
/ 09 мая 2009

Я не работал с DX10, только с DX9, но, полагаю, эти вещи все те же.

В зависимости от вашего приложения вы можете создавать шейдеры во время выполнения (многие современные сложные 3D-игры делают это).

Предварительная загрузка шейдеров - неплохая идея, в зависимости от того, генерируете ли вы шейдеры, сколько их, каковы ваши соображения по поводу памяти - это зависит. Однако предварительная загрузка шейдера (под которым я предполагаю, что вы имеете в виду создание экземпляра ID3DXEffect) занимает только память во время выполнения, без использования ЦП.

Заказ по шейдеру - хорошая идея. В целом, сортировка по материалам является хорошей идеей, потому что переключение шейдеров сопряжено с некоторыми накладными расходами (не чрезмерно, но заметно в зависимости от сложности вашего приложения).

Для сортировки ваших вызовов, прочитайте это: http://realtimecollisiondetection.net/blog/?p=86

1 голос
/ 18 июля 2009

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

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

Но что вы на самом деле спрашиваете: «Является ли метод X быстрее, чем метод Y для моего приложения?» и хотя D3D10 упрощает управление состояниями для ускорения переключения, единственный способ ответить на поставленный выше вопрос - выполнить измерение производительности с вашим приложением и вашими данными.

В блоге realtimecollectiondetection.net просто говорится о сортировке ваших вызовов. Это приведет к меньшему переключению состояний. Неважно, насколько быстро происходит переключение состояний, меньшее выполнение всегда быстрее. Так что это хороший общий совет.

...