Uso de búferes de vértices múltiples en DX10 / DX11

Tengo un renderizador C ++ DirectX 11 que he estado escribiendo.

He escrito un cargador COLLADA 1.4.1 para importar datos de COLLADA para usarlos como soporte de animaciones esqueléticas.

Estoy validando el cargador en este punto (y he apoyado a COLLADA anteriormente en otro renderizador que escribí usando una tecnología diferente) y me estoy topando con un problema al hacer coincidir COLLADA con DX10 / 11.

Tengo 3 buffers de vértices separados de datos:

Un búfer de vértice de posiciones únicas de vértice. Un amortiguador de vértice de normales únicos. Un buffer de vértice de coordenadas de textura única.

Estos buffers de vértices contienen diferentes longitudes de matriz (las posiciones tienen 2910 elementos, las normales tienen más de 9000 y las coordenadas de textura tienen aproximadamente 3200).

COLLADA proporciona una lista de triángulos que me da los índices en cada una de estas matrices para un triángulo dado (al principio, verbosa y extrañamente, pero al final se vuelve simple una vez que has trabajado con ella).

Sabiendo que DX10 / 11 es compatible con múltiples búferes de vértice, pensé que estaría llenando el búfer de índice DX10 / 11 con índices en cada uno de estos búferes* y * (esta es la parte importante), estos índices podrían ser diferentes para un punto dado de un triángulo.

En otras palabras, podría establecer los tres búferes de vértice, establecer el diseño de entrada correcto y luego, en el búfer de índice, pondría el equivalente de:

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

La documentación sobre el uso de múltiples búferes de vértice en DirectX no parece proporcionar información sobre cómo afecta esto al búfer de índice (más sobre esto más adelante).

Ejecutar el código de esa manera produce resultados de renderización extraños donde podía ver la malla que había sido dibujada de manera intermitente correctamente (polígonos extraños, pero aproximadamente un tercio de los puntos estaban en el lugar correcto - sugerencia - sugerencia)

Me di cuenta de que había arruinado mis datos o mis índices en este momento (ayer), así que lo validé minuciosamente, así que me di cuenta de que estaba cargando mi información o algo más. Eliminé esto usando los valores de los buffers normales y de textura para establecer alternativamente el valor del color utilizado por el sombreador de píxeles, los colores eran correctos, así que no estaba sufriendo un problema de relleno.

Finalmente, llegué a la conclusión de que DX10 / 11 debe esperarse de los datos ordenados de una manera diferente, por lo que traté de almacenar los índices de esta manera:

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 )

Por extraño que parezca, esto produjo una malla renderizada que parecía 1/3 correcta - pista - pista.

Entonces supuse que tal vez DX10 / DX11 quería que los índices se almacenaran 'por el búfer de vértice', lo que significa que agregaría primero todos los índices de posición para todos los triángulos, luego todos los índices normales para todos los triángulos, y luego todos los índices de coordenadas de textura para todos los triangulos

Esto produjo otro 1/3 de malla correcta (mirando).

Esto me hizo pensar: bueno, seguramente el DX10 / 11 no le brindaría la capacidad de transmitir desde múltiples búferes de vértice y, de hecho, ¿esperaría solo un índice por punto triangular?

Solo la inclusión de índices en el búfer de posición de vértice produce una malla correctamente renderizada que desafortunadamente usa las normales y las coordenadas de textura incorrectas.

Parece que poner los índices de coordenadas normales y de textura en el búfer de índice provocó un dibujo erróneo sobre la malla correctamente representada.

¿Es este el comportamiento esperado?

Múltiples búferes de vértice: ¿Un búfer de índice y el búfer de índice solo pueden tener un índice único para un punto de un triángulo?

Eso realmente no tiene sentido para mí.

¡Ayuda!

Respuestas a la pregunta(1)

Su respuesta a la pregunta