Malhas de renderização com múltiplos índices

Eu tenho alguns dados de vértices. Posições, normais, coordenadas de textura. Eu provavelmente o carreguei de um arquivo .obj ou algum outro formato. Talvez eu esteja desenhando um cubo. Mas cada pedaço de dados de vértices tem seu próprio índice. Posso renderizar esses dados de malha usando o OpenGL / Direct3D?

No sentido mais geral, não. O OpenGL e o Direct3D permitem apenas um índice por vértice; o índice busca de cada stream de dados de vértice. Portanto, cada combinação exclusiva de componentes deve ter seu próprio índice separado.

Então, se você tem um cubo, onde cada face tem seu próprio normal, você precisará replicar muito a posição e os dados normais. Você precisará de 24 posições e 24 normais, mesmo que o cubo tenha apenas 8 posições únicas e 6 normais únicas.

Sua melhor aposta é simplesmente aceitar que seus dados serão maiores. Um grande número de formatos de modelos usará vários índices; você precisará corrigir esses dados de vértice antes de poder renderizá-los. Muitas ferramentas de carregamento de malha, como o Open Asset Importer, executarão essa correção para você.

GL 3.xe D3D10

Para o hardware da class D3D10 / OpenGL 3.x, é possível evitar a execução da correção e usar vários atributos indexados diretamente. No entanto, esteja ciente de que isso provavelmente diminuirá o desempenho da renderização.

A discussão a seguir usará a terminologia do OpenGL, mas o Direct3D v10 e superior têm funcionalidade equivalente.

A ideia é acessar manualmente os diferentes atributos de vértices do shader de vértice. Em vez de enviar diretamente os atributos do vértice, os atributos que são passados ​​são, na verdade, os índices desse vértice específico. O shader de vértice usa os índices para acessar o atributo real por meio de uma ou mais texturas de buffer .

Atributos podem ser armazenados em várias texturas de buffer ou todos dentro de um. Se o último for usado, o shader precisará de um deslocamento para adicionar a cada índice para encontrar o índice inicial do atributo correspondente no buffer.

Os atributos regulares de vértices podem ser compactados de várias maneiras. As texturas de buffer têm menos meios de compression, permitindo apenas um número relativamente limitado de formatos de vértices (através dos formatos de imagem que suportam).

Observe novamente que qualquer uma dessas técnicas pode diminuir o desempenho geral do processamento de vértices. Portanto, ele deve ser usado apenas nas circunstâncias mais limitadas pela memory, depois que todas as outras opções de compactação ou otimização tiverem sido esgotadas.

O OpenGL ES 3.0 também fornece texturas de buffer. Versões mais altas do OpenGL permitem que você leia objects buffer mais diretamente via SSBOs em vez de texturas de buffer, que podem ter melhores características de desempenho.