Partilhar via


Suporte à malha no D3DX (Direct3D 9)

D3DX é uma biblioteca de utilitários que fornece serviços auxiliares. É uma camada acima do componente Direct3D.

Malhas

O D3DX implementa o constructo de malha para carregar, manipular e renderizar o conteúdo do arquivo .x. Uma malha é basicamente uma coleção de vértices que definem alguma geometria e um conjunto de índices que definem as faces. Há vários tipos de malha.

ID3DXBaseMesh fornece os princípios básicos. ID3DXMesh herda do ID3DXBaseMesh e adiciona otimização de malha usando o cache de vértice por chip. ID3DXSkinInfo fornece suporte à malha esfolada.

ID3DXBaseMesh fornece métodos para manipular e consultar objetos de malha ID3DXMesh, que herdam da malha base. Isso inclui operações de adjacência, recuperação de buffer de geometria, operações de bloqueio/desbloqueio (vértice e índice) e cópia, renderização, face e informações de vértice.

Observação

As interfaces ID3DXPMesh e ID3DXSPMesh (para dar suporte a malhas progressivas e simplificadas, respectivamente) disponíveis em versões anteriores do Direct3D 9 foram descartadas.

 

Arquitetura de malha

Uma malha contém os dados de um modelo complexo. É um contêiner de dados abstrato que contém recursos como texturas e materiais e atributos, como dados de posição e dados de adjacência. Há várias operações de malha que melhoram o desempenho do desenho e a aparência de uma superfície. Além disso, há vários outros conceitos de malha que afetarão a funcionalidade das operações de malha. O entendimento desses conceitos de malha para que você possa aplicá-los melhorará o desempenho da malha.

Dados do objeto de malha

Uma malha contém um buffer de vértices, um buffer de índice e um buffer de atributo.

  • O buffer de vértices contém os dados de vértice, que são os vértices de malha.
  • O buffer de índice contém índices de vértice para acessar o buffer de vértices. Isso pode reduzir o tamanho do buffer de vértices reduzindo vértices duplicados. Somente uma malha indexada usa o buffer de índice. Se uma malha for composta por uma lista de triângulos, por exemplo, ela não usará o buffer de índice.
  • O buffer de atributo contém dados de atributo. Atributos são propriedades dos vértices de malha, sem ordem específica. Uma malha D3DX armazena atributos em um grupo de DWORDS para cada face.

Tabelas de atributos

Uma tabela de atributos é uma representação concisa do conteúdo de um buffer de atributo. As tabelas de atributos podem ser criadas chamando um dos métodos Optimize com D3DXMESHOPT_ATTRSORT, bloqueando o buffer de atributos e preenchendo-o com dados ou chamando SetAttributeTable. Uma malha contém uma tabela de atributos quando a malha é reordenada em grupos. Isso acontece quando Optimize é chamado, supondo que uma opção de classificação de atributo (D3DXMESHOPT_ATTRSORT ou superior) seja fornecida. Malhas D3DX usam listas de triângulo indexado e, portanto, são desenhadas com IDirect3DDevice9::DrawIndexedPrimitive.

As tabelas de atributo são criadas como resultado da chamada de Optimize. As faces não precisam ser adjacentes, pois Optimize as reordenará para ficarem adjacentes. Por exemplo, as mãos de uma malha humana podem usar o mesmo atributo. A ID ajuda a classificar as faces em grupos. Malhas de arquivos .x geraram automaticamente atributos para propriedades de material e textura. Você precisa chamar Optimize(ATTRSORT) ou Optimize(VERTEXCACHE) mais eficaz para obter um bom desempenho. As funções de carga tentam apresentar os dados na forma exata em que foram salvos. Se você estiver usando uma malha baseada em buffer de vértices/buffer de índice, a API de malha fornecerá funções de otimização e transformações de esfolamento com pouca sobrecarga.

Os tipos de otimização são cumulativos, começando do menos ideal (D3DXMESHOPT_COMPACT) até o ideal (D3DXMESHOPT_IGNOREVERTS). D3DXMESHOPT_STRIPREORDER faz uma compactação e classificação de atributo. D3DXMESHOPT_VERTEXCACHE é sempre recomendado, mesmo em dispositivos sem um cache de vértice verdadeiro.

Dados do aplicativo

Os dados do aplicativo são dados de malha gerenciados por um aplicativo. Há um acoplamento apertado entre os dados de vértice de malha e os dados gerenciados por esses buffers.

O buffer de materiais contém n materiais. Os materiais são retornados pela função Carregar quando o arquivo .x é carregado. Cada subconjunto pode ter seus próprios materiais e texturas. O buffer de materiais é estático.

O buffer de adjacência contém informações sobre bordas, faces e faces adjacentes. Algumas operações de malha dependem de saber quais faces são adjacentes entre si. Essas informações, chamadas de dados de adjacência, são mantidas em um buffer de adjacência. Elas não fazem parte da malha, mas são mantidas pelo aplicativo e devem ser fornecidas aos métodos de malha quando necessário.

O buffer da instância de efeitos contém uma lista de instâncias de efeito. Uma instância de efeito armazena o estado. Essas informações de estado são usadas para inicializar o pipeline. Uma instância de efeito contém pares nome-valor em um efeito.

Tópicos avançados da malha

As malhas otimizadas baseiam-se na funcionalidade de malha base e adicionam a funcionalidade de otimização de cache de vértice com dois métodos: Optimize, que cria uma nova malha, e OptimizeInPlace, que modifica a malha original.

D3DXGeneratePMesh usa o algoritmo de simplificação D3DX para gerar uma malha progressiva da malha de entrada. D3DXSimplifyMesh gera uma malha padrão do nível de detalhes fornecido de uma malha de entrada usando o mesmo algoritmo de simplificação. O usuário tem controle sobre a métrica de erro usada por meio dos pesos especificados por componente de vértice e pesos especificados por vértice. Os pesos por componente são multiplicados pela parte de componentes do erro calculado por recolhimento de borda. Os pesos por vértice são multiplicados pelo valor da métrica de erro determinado para remoção desse vértice. Por exemplo, se você nunca quiser que um vértice seja removido, defina o peso desse vértice específico como um valor grande. Por outro lado, se você quiser que ele seja removido anteriormente, defina-o como um valor pequeno (menor que 1).

ID3DXSkinInfo dá suporte a caracteres esfolados. Um caractere esfolado é definido por um conjunto de malhas e um conjunto de ossos que afetam os vértices das malhas. Os ossos são representados como uma hierarquia de transformação. Para cada malha, há uma matriz para cada osso que a afeta, que transforma a malha no espaço de coordenada local do osso. Essa matriz é a transformação do espaço do osso para a malha. Isso é definido no momento em que o esqueleto é associado à malha no processo de criação.

Esfolamento

O esfolamento é uma técnica para transformar vértices de malha usando ossos. Ossos são tipicamente organizados em um esqueleto hierárquico, assim como os ossos em um corpo humano. Os vértices de objeto são então associados aos ossos, por exemplo, anexando a pele aos ossos. Quando os ossos são transformados, a pele também é transformada.

Malhas esfoladas usam ossos para influenciar vários vértices. Os dados de transformação óssea são fornecidos pelo usuário, para influenciar como SRT os ossos. A malha usa os ossos transformados para influenciar os vértices associados aos ossos. Paletas são matrizes de transformações SRT. As paletas geralmente são implementadas como matrizes, mas podem conter valores SRT.

Corte progressivo de malha

Áreas de detalhes baixos podem se dar ao luxo de perder vértices que não alteram a aparência renderizada da superfície. Isso é especialmente verdadeiro para objetos à medida que eles se afastam da câmera. Isso é conhecido como nível de detalhes. Os usuários têm controles de renderização no nível de API para definir o nível de detalhes para maximizar a eficiência de renderização.

Objetos de malha progressiva começam com um alto número de faces e usam a simplificação para reduzir este número. Uma malha progressiva que é independente de exibição é conhecida como VIPM (malha progressiva independente de exibição).

Outra maneira de reduzir o número de faces é cortando. Isso remove vértices e faces da malha. O corte pode ser feito na extremidade superior (para limitar o número máximo de faces) ou na extremidade inferior (para limitar o número mínimo de faces). O corte melhora o desempenho do desenho. No entanto, deve-se tomar cuidado para preservar a qualidade visual. O corte é demonstrado no exemplo do SDK de Malha Progressiva.

Para áreas de alta visibilidade, a resolução pode ser aumentada usando o nível progressivo de detalhes (PLOD). Esta é uma técnica para dividir uma face em duas.

Malhas de patch

Também há suporte para dois tipos especializados de malhas de patch: patches de retângulo e triângulo. A malha de patch do retângulo é uma malha de patch cujos pontos de controle estão dispostos em uma sequência retangular sinuosa. Patches de retângulos e triângulo são usados para criar superfícies de ordem superior. Eles não são tão usados como malhas de triângulo.

D3DX