Существует ли снижение производительности при создании вершин Direct3D со всеми семантическими типами?

В Direct3D вы можете создавать любые типы вершин, которые вам нравятся. У вас может быть простая вершина с только позиционной информацией, или вы можете добавить информацию о цвете, текстуре и т. Д. И т. Д. При создании входного макета вы определяете, какие части вершины вы реализовали:

D3D10_INPUT_ELEMENT_DESC layout[] =
{
    { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 },
    { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D10_APPEND_ALIGNED_ELEMENT, D3D10_INPUT_PER_VERTEX_DATA, 0 },
};

Мой вопрос, должен ли я определить структуру вершин со всеми типами ввода (положение, цвет, текстура и т. Д.). Или я должен создать несколько структур вершин, каждая с разными типами ввода.

Недостатками использования нескольких классов является то, что вам нужно создавать и поддерживать несколько классов, и это может сбивать с толку, зная, какой тип вершины использовать. Каковы недостатки наличия 1 вершинной структуры?

3 ответа

Решение

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

http://code.google.com/p/woof/source/browse/trunk/Libraries/WOOF3D/Direct3D10Vertices.cpp?r=24

Вы загрузите неиспользуемые данные вершин в 3D-ускоритель, и он будет использовать некоторую полосу пропускания. Это не должно иметь большого значения, если вы не играете в какую-нибудь первоклассную видеоигру (у вас наверняка есть узкое место где-то еще).

Не делайте этого, используйте специализированные структуры. Загрузка данных вершин в GPU потребляет большую часть вашей полосы пропускания и быстро становится узким местом (учитывая, что проблема тривиальна для решения - оберните Vertexbuffer в пользовательский класс, чтобы автоматически выполнить преобразование в наиболее эффективную схему ввода).

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

Однако я рекомендую установить какое-то соглашение о порядке появления компонентов вершин в структуре данных. Это поможет вам при написании ваших шейдеров, потому что они в конечном счете связаны с вершинным макетом ввода.

Другие вопросы по тегам