Как нарисовать разные геометрии в DirectX? - PullRequest
0 голосов
/ 30 марта 2020

Я хочу нарисовать много кубиков и много линий.

Я имею дело со многими кубами, это нормально. Но что делать, если я тоже хочу рисовать другие фигуры (не треугольники)?

Нужно ли создавать 2 буфера вершин и индексов? Один для кубиков и один для строк? Если да, то буфер вершин строки такой же, как показано ниже?

Vertex vList[] =
{

{ 0.0f, 0.0f, 0.0f},
{ 1.0f, 0.0f, 0.0f}

}

А также, если да, то в UpdatePipeline() я должен проверить, хочу ли я нарисовать треугольник или линию, и сбросить вершину Input Assembler буфер, индексный буфер и топология примитива?


Что я обычно хочу, это рисовать частицы, связанные линией (но не все, связанные друг с другом). Поэтому я собираюсь рисовать кубики (я не знаю, как рисовать сферу), затем я рисую линии.

1 Ответ

0 голосов
/ 31 марта 2020

Существует множество способов рисовать геометрию в DirectX, потому что правильное решение зависит от того, что вы пытаетесь сделать. Основным ограничением является то, что все, что вы рисуете за один вызов Draw , должно использовать одно и то же состояние / шейдеры - обычно это называется "материал". Из соображений производительности вы хотите рисовать тысячи или десятки тысяч вершин в каждом вызове Draw .

Вы можете использовать некоторые приемы для объединения разных материалов в один Draw , но каждый вызов проще воспринимать как отдельный «материал».

Учитывая, что есть три основных c способа рисования геометрии в DirectX:

  • Stati c представление В этом случае вы копируете ваши данные вершин / индексов в буфер вершин / индексов и использовать их много раз. Это наиболее эффективный способ рендеринга, поскольку данные могут быть помещены только в память графического процессора. Вы можете использовать преобразования, объединенные буферы и другие приемы, чтобы повторно использовать те же данные вершины / индекса. Как правило, именно так объекты рисуются в большинстве сцен.

Например, см. Классы GeometricPrimitive и Model в Набор инструментов DirectX .

Из-за модели выгрузки данных DirectX 12 вам необходимо явно преобразовать их из D3D12_HEAP_TYPE_UPLOAD в D3D12_HEAP_TYPE_DEFAULT с помощью метода LoadStaticBuffers, но он достигает того же, что и D3D11_USAGE_DEFAULT DirectX 11, копируя из D3D11_USAGE_STAGING resource.

  • Dynami c submission создает буфер вершин / индексов каждый раз, когда он используется. Это не так эффективно, потому что сам буфер должен находиться в памяти, разделяемой между CPU и GPU, но это очень полезный способ обработки случаев, когда вы создаете геометрию на CPU каждый кадр рендеринга. Для DirectX 12 это ресурс D3D12_HEAP_UPLOAD. См. DX11: Как: использовать динамические c ресурсы для использования D3D11_USAGE_DYNAMIC в DirectX 11.

Примеры этого см. В SpriteBatch и PrimitiveBatch классов в DirectX Tool Kit

  • Как правило, наиболее эффективный способ рисовать связку одинаковой формы (при условии, что вы используете одно и то же состояние / шейдер) ) должен использовать instancing . См. Пример SimpleInstancing для DX11 и DX12 .

Если вы новичок в DirectX, вам настоятельно рекомендуется сначала используйте DirectX 11 вместо DirectX 12. В любом случае, см. Набор инструментов DirectX для DX11 / DX12 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...