Как реализовать статическое пакетирование, как в единстве, в DirectX 11

Как пользователь единства, я запутался в том, как я мог бы реализовать нечто подобное их статическому пакетированию. Множественные сетки (разные сетки, но один и тот же материал) отображаются как визуализированные в 1 вызове отрисовки, однако я не нахожу, как я мог бы сделать это в DirectX.

Я вижу, как рисовать в DirectX, используя Draw(). Я знаю, что вы можете рисовать одни и те же сетки несколько раз за один вызов (DrawiInstanced()?), Однако я не понимаю, как можно рисовать несколько разных сеток за один вызов отрисовки. Мне бы очень хотелось, чтобы меня указали в правильном направлении или дали образец, показывающий, например, куб и треугольник, отображаемые в ходе одного розыгрыша с общим материалом.

Я использую DirectX11.1 и делаю это через SharpDX, пример SharpDX предпочтительнее, но пример DX - это хорошо, но нет примеров DX9/10, если правильный способ сделать это изменился, меня строго интересует только DX11.

Благодарю.

1 ответ

Решение

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

В качестве примера, который рисует куб и треугольник, просто настройте свой VB, чтобы содержать оба:

float cubeAndTriangleVertices[] = 
{
  -1, -1, -1, // cube vertices
  -1, -1,  1,
  -1,  1, -1,
  -1,  1,  1,
   1, -1, -1,
   1, -1,  1,
   1,  1, -1,
   1,  1,  1,
   2,  0,  0, // triangle vertices
   2,  1,  0,
   3,  0,  0,
};
D3D11_SUBRESOURCE_DATA cubeAndTriangleVData = { cubeAndTriangleVertices };
device->CreateVertexBuffer(&cubeAndTriangleVData, &vb);

unsigned short cubeAndTriangleIndices[] =
{
  0, 2, 1, 2, 3, 1, // -x face
  7, 6, 5, 6, 4, 5, // +x face
  0, 1, 4, 4, 1, 5, // -y face
  2, 6, 3, 6, 7, 3, // +y face
  6, 2, 0, 4, 6, 0, // -z face
  3, 7, 1, 7, 5, 1, // +z face
  8, 9, 10, // triangle
}

D3D11_SUBRESOURCE_DATA cubeAndTriangleIData = { cubeAndTriangleIndices };
device->CreateIndexBuffer(&cubeAndTriangleIData, &ib);

// ...pipeline setup

context->DrawIndexed(6 * 6 + 3, 0, 0);
Другие вопросы по тегам