Существует ли снижение производительности при создании вершин Direct3D со всеми семантическими типами? - PullRequest
0 голосов
/ 07 октября 2010

В 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 ]

1 голос
/ 08 октября 2010

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

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

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

1 голос
/ 07 октября 2010

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

0 голосов
/ 08 октября 2010

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

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

...