Использование индексных буферов в DirectX 11; как это узнать?

Допустим, я создаю два буфера вершин для двух разных сеток.

     (I'm assuming creating separate buffers for separate meshes is how it's usually done)

Теперь, скажем, я хочу нарисовать одну из сеток, используя индексный буфер.
Глядя на книгу Практичный рендеринг и вычисления с Direct3D 11 не похоже, что создание индексного буфера каким-либо образом ссылается на буфер вершин, так как же буфер индекса знает (во время сборки ввода), на какой буфер вершин действовать?

Я провел поиск в Google без ответов, что заставляет меня предположить, что в этом есть что-то очевидное, что я упускаю.

1

Решение

Вы правы, индексные буферы не ссылаются на конкретные вершинные буферы. В течение DrawIndexed активный индексный буфер используется для подачи индексов в активные вершинные буферы (те, которые вы устанавливаете с помощью SetIndexBuffer / SetVertexBuffers).

2

Другие решения

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

Индексный буфер будет знать о VertexBuffer во время отрисовки (например, когда оба связаны с конвейером)

Вы можете думать о индексном буфере как о «Таблице подстановки», где вы сохраняете списки или индексы элементов для рисования.

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

Разделение обоих имеет много преимуществ, вот несколько примеров:

  • Вы можете повторно использовать индексный буфер (например, две смещенные сетки с одинаковым разрешением могут использовать один и тот же индексный буфер). Это может быть приличное увеличение памяти.
  • Вы можете нарисовать свой буфер Vertex самостоятельно и выполнить некоторую обработку для каждой вершины (например, нарисуйте список точек для спрайтов или примените скиннинг / смещение в буфере Stream Output, затем нарисуйте результирующий буфер вершин, используя DrawIndexed)
  • Оба буфера Vertex / Index также могут быть связаны как ByteAddressBuffer, так что вы также можете обрабатывать свою геометрию в Compute Shader и создавать другой оптимизированный буфер индекса, например, с выделенными треугольниками, а затем обрабатывать Indexed Draw с оптимизированным буфером. Применение этих ячеек с индексами вместо вершин часто быстрее, чем вершина, так как вы будете перемещать намного меньше памяти.
  • Это нишевый случай, но иногда мне приходится рисовать сетку в виде набора треугольников, а затем рисовать в виде набора линий (некоторая форма каркаса). Если в качестве примера вы возьмете один блок, вам не нужно рисовать диагонали в виде линий, поэтому у меня есть общий Vertexbuffer с вершинами блоков, затем один IndexBuffer, предназначенный для рисования списка треугольников, и другой для рисования списка линий. В случае больших моделей это также может быть эффективным увеличением памяти.
1

По вопросам рекламы [email protected]