Usando vários buffers de vértice no DX10 / DX11

Eu tenho um renderizador C ++ DirectX 11 que eu tenho escrito.

Eu escrevi um carregador COLLADA 1.4.1 para importar dados COLLADA para uso no suporte a animações esqueléticas.

Eu estou validando o carregador neste momento (e eu suportei o COLLADA antes em outro renderizador que eu escrevi anteriormente usando tecnologia diferente) e estou com um problema que combina o COLLADA com o DX10 / 11.

Eu tenho 3 buffers de dados de vértices separados:

Um buffer de vértices de posições de vértices exclusivas. Um buffer de vértices de normalidades únicas. Um buffer de vértices de coordenadas de textura exclusivas.

Esses buffers de vértices contêm comprimento de matriz diferente (as posições têm 2910 elementos, as normais têm mais de 9000 e as coordenadas de textura têm aproximadamente 3200.)

COLLADA fornece uma lista triangular que me dá os índices em cada um desses arrays para um determinado triângulo (detalhado e curiosamente feito no começo, mas no final ele se torna simples quando você trabalha com ele).

Sabendo que o DX10 / 11 suporta múltiplos buffer de vértices, eu imaginei que eu estaria preenchendo o buffer do índice DX10 / 11 com índices em cada um desses buffers* e * (esta é a parte importante), esses índices podem ser diferentes para um determinado ponto de um triângulo.

Em outras palavras, eu poderia definir os três buffers de vértices, definir o layout de entrada correto e, em seguida, no buffer de índice, colocaria o equivalente a:

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 )
}

A documentação sobre o uso de vários buffers de vértices no DirectX não parece fornecer informações sobre como isso afeta o buffer de índice (mais sobre isso mais adiante).

Executar o código dessa maneira gerou resultados de renderização estranhos onde eu podia ver a malha que estava sendo desenhada intermitentemente corretamente (polígonos estranhos, mas cerca de um terço dos pontos estavam no lugar correto - dica - dica)

Eu percebi que eu tinha estragado meus dados ou meus índices neste momento (ontem), então eu validamente validei tudo, e então eu percebi que estava enroscando na minha entrada ou algo mais. Eu eliminei isso usando os valores dos buffers normal e de textura para alternativamente definir o valor de cor usado pelo pixel shader, as cores estavam corretas, então eu não estava sofrendo um problema de preenchimento.

Por fim, cheguei à conclusão de que o DX10 / 11 deve esperar que os dados sejam ordenados de maneira diferente, então tentei armazenar os índices desta maneira:

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 )

Estranhamente, isso produziu uma malha renderizada que parecia 1/3 correta - dica - dica.

Eu então supus que talvez o DX10 / DX11 quisesse que os índices fossem armazenados pelo buffer de vértices significando que eu adicionaria todos os índices de posição para todos os triângulos primeiro, então todos os índices normais para todos os triângulos, então todos os índices de coordenadas de textura para todos os triângulos.

Isso rendeu outra malha 1/3 correta (olhando).

Isso me fez pensar - bem, com certeza o DX10 / 11 não daria a você a habilidade de fazer streaming de múltiplos buffers de vértices e então realmente esperar apenas um índice por ponto triangular?

Somente a inclusão de índices no buffer de posições de vértices produz uma malha renderizada corretamente que infelizmente usa as coordenadas normais e de textura incorretas.

Parece que colocar os índices de coordenadas normais e de textura no buffer de índice causou um desenho incorreto sobre a malha renderizada corretamente.

Este é o comportamento esperado?

Buffers de múltiplos vértices - Um buffer de índice e o buffer de índice só podem ter um único índice para um ponto de um triângulo?

Isso realmente não faz sentido para mim.

Socorro!

questionAnswers(1)

yourAnswerToTheQuestion