Использование нескольких вершинных буферов в DX10 / DX11

У меня есть C ++ DirectX 11 рендер, который я писал.

Я написал загрузчик COLLADA 1.4.1 для импорта данных COLLADA для использования в поддержке скелетных анимаций.

я проверяю загрузчик в этой точке (и яя раньше поддерживал COLLADA в другом рендерере I 'Вы писали ранее, используя разные технологии) и яЯ сталкиваюсь с проблемой соответствия COLLADA с DX10 / 11.

У меня есть 3 отдельных вершинных буфера данных:

Буфер вершин уникальных позиций вершин. Буфер вершин уникальных нормалей. Вершинный буфер уникальных текстурных координат.

Эти буферы вершин содержат различную длину массива (позиции имеют 2910 элементов, нормали - более 9000, а координаты текстуры - около 3200).

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

Зная, что DX10 / 11 поддерживает несколько вершинных буферов, я решил, что буду заполнять индексный буфер DX10 / 11 индексами в каждом из этих буферов.* а также * (это важная часть), эти индексы могут быть разными для данной точки треугольника.

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

l_aIndexBuffer[ NumberOfTriangles * 3 ]

for( i = 0; i < NumberOfTriangles; i++ )
{
    l_aIndexBufferData.add( triangle[i].Point1.PositionIndex )
    l_aIndexBufferData.add( triangle[i].Point1.NormalIndex )
    l_aIndexBufferData.add( triangle[i].Point1.TextureCoordinateIndex )
}

Документация относительно использования нескольких вершинных буферов в DirectX неПохоже, он не дает никакой информации о том, как это влияет на буфер индекса (подробнее об этом позже).

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

Я понял, что яЯ облажался с моими данными или моими индексами в этот момент (вчера), поэтому я тщательно проверил все это, и поэтому я решил, что облажался со своими данными или что-то еще. Я устранил это, используя значения из буфера нормалей и текстур, чтобы альтернативно установить значение цвета, используемое пиксельным шейдером, цвета были правильными, поэтому я нене страдает проблемой заполнения.

В конечном итоге я пришел к выводу, что DX10 / 11 следует ожидать, что данные упорядочены по-другому, поэтому я попытался сохранить индексы следующим образом:

indices.add( Point1Position index )
indices.add( Point2Position index )
indices.add( Point3Position index )
indices.add( Point1Normal index )
indices.add( Point2Normal index )
indices.add( Point3Normal index )
indices.add( Point1TexCoord index )
indices.add( Point2TexCoord index )
indices.add( Point3TexCoord index )

Как ни странно, это дало визуализированную сетку, которая выглядела на 1/3 правильно - подсказка - подсказка.

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

Это дало еще одну 1/3 правильную (выглядящую) сетку.

Это заставило меня задуматься - ну, конечно, DX10 / 11 неt предоставить вам возможность потоковой передачи из нескольких буферов вершин, а затем ожидать только один индекс на точку треугольника?

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

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

Это ожидаемое поведение?

Несколько буферов вершин - один индексный буфер и индексный буфер могут иметь только один индекс для точки треугольника?

Это действительно просто нене имеет смысла для меня.

Помогите!

Ответы на вопрос(1)

Ваш ответ на вопрос