Mapeando códigos FVF para uma declaração do Direct3D 9 (Direct3D 9)

Esta tabela mapeia códigos FVF para uma estrutura D3DVERTEXELEMENT9 .

FVF Tipo de dados Uso Índice de uso
D3DFVF_XYZ D3DDECLTYPE_FLOAT3 D3DDECLUSAGE_POSITION 0
D3DFVF_XYZRHW D3DDECLTYPE_FLOAT4 D3DDECLUSAGE_POSITIONT 0
D3DFVF_XYZW D3DDECLTYPE_FLOAT4 D3DDECLUSAGE_POSITION 0
D3DFVF_XYZB5 e D3DFVF_LASTBETA_UBYTE4 D3DVSDT_FLOAT3, D3DVSDT_FLOAT4, D3DVSDT_UBYTE4 D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT, D3DDECLUSAGE_BLENDINDICES 0
D3DFVF_XYZB5 e D3DFVF_LASTBETA_D3DCOLOR D3DVSDT_FLOAT3, D3DVSDT_FLOAT4, D3DVSDT_D3DCOLOR D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT, D3DDECLUSAGE_BLENDINDICES 0
D3DFVF_XYZB5 D3DDECLTYPE_FLOAT3, D3DDECLTYPE_FLOAT4, D3DDECLTYPE_FLOAT1 D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT, D3DDECLUSAGE_BLENDINDICES 0
D3DFVF_XYZBn (n=1..4) D3DDECLTYPE_FLOAT3, D3DDECLTYPE_FLOATn D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT 0
D3DFVF_XYZBn (n=1..4) e D3DFVF_LASTBETA_UBYTE4 D3DDECLTYPE_FLOAT3, D3DDECLTYPE_FLOAT(n-1), D3DDECLTYPE_UBYTE4 D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT, D3DDECLUSAGE_BLENDINDICES 0
D3DFVF_XYZBn (n=1..4) e D3DFVF_LASTBETA_D3DCOLOR D3DDECLTYPE_FLOAT3, D3DDECLTYPE_FLOAT(n-1), D3DDECLTYPE_D3DCOLOR D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT, D3DDECLUSAGE_BLENDINDICES 0
D3DFVF_NORMAL D3DDECLTYPE_FLOAT3 D3DDECLUSAGE_NORMAL 0
D3DFVF_PSIZE D3DDECLTYPE_FLOAT1 D3DDECLUSAGE_PSIZE 0
D3DFVF_DIFFUSE D3DDECLTYPE_D3DCOLOR D3DDECLUSAGE_COLOR 0
D3DFVF_SPECULAR D3DDECLTYPE_D3DCOLOR D3DDECLUSAGE_COLOR 1
D3DFVF_TEXCOORDSIZEm(n) D3DDECLTYPE_FLOATm D3DDECLUSAGE_TEXCOORD n

 

Declarações de vértice com D3DDECLUSAGE_POSITIONT

A presença de um elemento de vértice com (D3DUSAGE_POSITIONT, 0) é usada para indicar ao dispositivo que os dados de vértice recebidos já passaram pelo processamento de vértice (como um FVF com D3DFVF_XYZRHW conjunto de bits). No momento do desenho, se a declaração definida no momento tiver um elemento com a semântica (D3DUSAGE_POSITIONT, 0), todo o processamento de vértice será ignorado (como se um FVF com D3DFVF_XYZRHW bit tivesse sido definido).

Há algumas restrições em declarações de vértice com (D3DDECLUSAGE_POSITIONT, 0):

  • Somente o fluxo zero pode ser usado nessas declarações.
  • Os elementos de vértice devem ser classificados aumentando o deslocamento de fluxo.
  • O deslocamento de fluxo deve ser alinhado ao DWORD.
  • O mesmo par (Uso, Índice de Uso) deve ser listado apenas uma vez.
  • Somente o método D3DDECLMETHOD_DEFAULT pode ser usado.
  • Outros elementos de vértice não podem ter a semântica (D3DDECLUSAGE_POSITION, 0).

Além disso, há algumas restrições sobre essa declaração relacionadas à versão do driver do dispositivo. Essas restrições estão em vigor porque o Direct3D envia essas declarações diretamente para o driver sem fazer nenhuma conversão.

Declarações de vértice sem D3DDECLUSAGE_POSITIONT

O runtime valida a criação de declarações. A seguir estão as regras gerais para quais declarações são legais.

  • Todos os elementos de vértice de um fluxo devem ser consecutivos e classificados por deslocamento.
  • O deslocamento de fluxo deve ser alinhado ao DWORD.
  • O mesmo par (Uso, Índice de Uso) deve ser listado apenas uma vez.
  • Se o D3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET estiver definido, então
    • Vários elementos de vértice podem compartilhar o mesmo deslocamento em um fluxo.
    • Os elementos de vértice podem ser de diferentes tipos que podem ter tamanhos diferentes.
    • Os elementos de vértice podem se sobrepor arbitrariamente. Por exemplo, um elemento pode começar em um local de um fluxo que é, ao mesmo tempo, no meio de outro elemento.
    • Elementos de vértice têm permissão para ter deslocamento de fluxo em qualquer ordem.
  • O número de elementos de vértice não pode ser maior que 64.
  • UsageIndex deve estar no intervalo [0-15].
  • A declaração, usada com a API DrawPrimitive, não deve ter elementos de vértice diferentes de D3DDECLMETHOD_DEFAULT, D3DDECLMETHOD_LOOKUPPRESAMPLED ou D3DDECLMETHOD_LOOKUP.
  • A declaração, que contém D3DDECLMETHOD_LOOKUP ou LOOKUPPRESAMPLED, deve ser usada apenas com o pipeline de vértice programável.
  • A declaração, usada com a API DrawRectPatch/DrawTriPatch, não pode ter elementos de vértice com D3DDECLMETHOD_LOOKUPPRESAMPLED ou D3DDECLMETHOD_LOOKUP.
  • A declaração deve ter apenas um elemento com D3DDECLMETHOD_LOOKUP ou método D3DDECLMETHOD_LOOKUPPRESAMPLED.
  • A declaração com D3DDECLMETHOD_LOOKUP ou D3DDECLMETHOD_LOOKUPPRESAMPLED não deve ter elementos diferentes de D3DDECLMETHOD_DEFAULT, pois o mapeamento de deslocamento é feito apenas para N patches.
  • Elementos de vértice com D3DDECLMETHOD_LOOKUP ou D3DDECLMETHOD_LOOKUPPRESAMPLED só podem ser usados com a semântica (D3DDECLUSAGE_SAMPLE, n) e vice-versa.
  • Se um elemento de vértice com D3DDECLMETHOD_LOOKUP método tiver um índice de fluxo e deslocamento de um elemento de vértice já existente, esse elemento de vértice deverá ter o mesmo tipo de dados.
  • Um elemento de vértice com o método D3DDECLMETHOD_LOOKUP deve ter o tipo de dados D3DDECLTYPE_FLOAT2/3/4
  • Elementos de vértice com tipos D3DDECLMETHOD_CROSSUV, D3DDECLMETHOD_PARTIALU e D3DDECLMETHOD_PARTIALV devem ter um deslocamento de um elemento de vértice com um tipo de dados compatível.
  • Um elemento de vértice com o método D3DDECLMETHOD_UV ou D3DDECLMETHOD_LOOKUPPRESAMPLED deve ter tipo D3DDECLTYPE_UNUSED, índice de fluxo zero e deslocamento de fluxo zero.
  • Declarações com métodos D3DDECLMETHOD_UV, D3DDECLMETHOD_PARTIALU e D3DDECLMETHOD_PARTIALV só podem ser usadas com DrawRectPatch.
  • O D3DDECLUSAGE_TESSFACTOR de uso deve ser usado somente com o tipo de dados D3DDECLTYPE_FLOAT1 e o índice de uso 0.
  • Quando uma declaração é usada para mosaico (DrawRectPatch, DrawTriPatch, N-patches), o tipo de dados deve ser menor ou igual a D3DDECLTYPE_SHORT4.
  • Declarações que contêm métodos que exigem determinados recursos de dispositivo (por exemplo, mapeamento de deslocamento, patches RT) só poderão ser criadas se o dispositivo der suporte a eles.
  • Uma declaração de vértice usada para desenhar pontos e linhas não pode ter métodos diferentes de D3DDECLMETHOD_DEFAULT.
  • As declarações que podem ser criadas também dependem dos recursos do driver.

Considerações sobre o driver

Drivers pré-Direct3D 9

  • A declaração de entrada deve ser traduzida para um FVF válido (ter a mesma ordem de elementos de vértice e seus tipos de dados).
  • Não são permitidas lacunas nas coordenadas de textura. Isso significa que, se houver um elemento de vértice com (D3DDECLUSAGE_TEXCOORD, n), também deverá haver um elemento de vértice com (D3DDECLUSAGE_TEXCOORD, n-1).

Drivers direct3D 9 sem suporte para sombreador de pixel versão 3

  • A declaração de entrada deve ser traduzida para um FVF válido (ter a mesma ordem de elementos de vértice e seus tipos de dados).
  • Lacunas nas coordenadas de textura são permitidas.

Drivers direct3D 9 com suporte ao sombreador de pixel versão 3

Declarações mais gerais são permitidas.

  • Os elementos de vértice podem estar em ordem arbitrária e podem ter qualquer tipo de dados.
  • Vários elementos de vértice podem compartilhar o mesmo deslocamento de fluxo e ser de um tipo diferente ao mesmo tempo se D3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET for definido pelo dispositivo.

Uso da declaração de vértice com o pipeline de vértice programável

  • No momento do desenho, o Direct3D procura a mesma combinação de "uso – índice de uso" na declaração de vértice atual e na função de sombreador de vértice atual. Quando a combinação é encontrada, o registro da função de sombreador DCL é usado como o destino do elemento de vértice.
  • Quando um elemento de vértice na declaração de vértice atual tem um uso que não é encontrado no sombreador de vértice atual, esse elemento de vértice é ignorado.
  • Ao usar uma versão de sombreadores de vértice menor que 2.0, todas as semânticas mencionadas no código do sombreador precisam estar presentes na declaração associada no momento do desenho. Ao usar sombreadores de vértice 2.0 e superiores, essa restrição que permite que os aplicativos usem declarações de vértice diferentes com o mesmo sombreador de vértice não existe. Isso é útil quando um sombreador de vértice lê dados de entrada com base em condições estáticas. Os registros de sombreador de vértice não inicializados devido a isso terão valores indefinidos.

Há restrições adicionais ao usar com o processamento de vértice de hardware em um driver DirectX 8:

  • Elementos de vértice não podem se sobrepor ou compartilhar o mesmo deslocamento.
  • Os tipos de dados são limitados ao que o driver DirectX 8 pode entender.

A CreateVertexDeclaration poderá falhar se a declaração fornecida não puder ser convertida em uma declaração de estilo DirectX 8. Para um dispositivo de modo misto, essa falha ocorrerá no momento do desenho* porque é a única vez que pode se saber se esse sombreador está sendo usado com processamento de hardware ou vértice de software.

Uso da declaração de vértice com o pipeline de função fixa

Somente declarações que aderem às seguintes regras podem ser usadas:

  • Não deve haver lacunas entre elementos de vértice (SKIP não foi permitido em uma declaração DirectX 8, que é usada para o pipeline de função fixa).
  • A semântica (D3DDECLUSAGE_POSITION, 0) deve ser especificada e deve ter D3DDECLTYPE_FLOAT3 tipo de dados.
  • Um elemento de vértice com método D3DDECLMETHOD_UV deve especificar D3DDECLUSAGE_TEXCOORD de uso ou D3DDECLUSAGE_BLENDWEIGHT.
  • Um elemento de vértice com método D3DDECLMETHOD_PARTIALU, _PARTIALV ou _CROSSUV só pode ser usado com D3DDECLUSAGE_POSITION, _NORMAL, _BLENDWEIGHT ou _TEXCOORD e deve usar o tipo de entrada D3DDECLTYPE_FLOAT3.

Quando uma declaração é usada com processamento de vértice de hardware em um driver DirectX 8, o runtime do Direct3D a converte em uma declaração de estilo DirectX 8 com as seguintes regras:

  • Os elementos de vértice não podem compartilhar o mesmo deslocamento em um fluxo e não podem se sobrepor.
  • O tipo de dados deve ser menor ou igual D3DDECLTYPE_SHORT4.
  • Somente os seguintes métodos são permitidos: D3DDECLMETHOD_DEFAULT, D3DDECLMETHOD_CROSSUV e D3DDECLMETHOD_UV
  • O mapeamento entre uma Declaração do Direct3D 9 e uma Declaração do Direct3D 8 (Direct3D 9) mostra qual semântica do Direct3D 9 pode ser convertida em declaração de estilo DirectX 8. Usage e UsageIndex são convertidos em um valor de registro.
  • Se houver n elementos de vértice em uma declaração e 0 - m (m < n) for mapeado para um FVF (elementos descritos no Mapeamento entre uma Declaração Direct3D e códigos FVF (Direct3D 9)), mas m + 1 não, então:
    • Se qualquer um dos elementos de vértice m + 2 até n - 1 mapear para FVF/dx8decl, a declaração será inválida.
    • Os elementos de 0 a m são convertidos (pelo runtime para drivers DirectX 8 e mais antigos e pelos drivers direct3D 9) usando o Mapeamento entre uma Declaração Direct3D e códigos FVF (Direct3D 9), m + 1, m + 2 até n - 1 serem mapeados para texcoord(k) contíguo, texcoord(k+1), começando de qualquer texcoord nos elementos 0 - m.
    • O tipo de dados em um texcoord mapeado é considerado float[1234] substituindo qualquer tipo de dados que o elemento atual contenha (mas do mesmo tamanho). Portanto, o tipo de dados existente pode ser algo que não está em Mapeamento entre uma Declaração Direct3D e códigos FVF (Direct3D 9).
    • Se k atingir 8, a declaração será inválida para FVF/dx8decl.
    • Se algum mapeamento para texcoords tiver ocorrido, toda a declaração será necessária para não ter elementos com método de geração diferente de DEFAULT ou a declaração será inválida para FVF/dx8decl.

Usando declarações de vértice com ProcessVertices

Uma declaração de vértice pode ser usada para descrever a saída de ProcessVertices. Essa declaração deve seguir as seguintes regras:

  • Somente o fluxo 0 deve ser usado.
  • Somente métodos D3DDECLMETHOD_DEFAULT são permitidos.
  • Somente tipos de dados D3DDECLTYPE_FLOATn ou D3DDECLTYPE_D3DCOLOR podem ser usados.
  • Elementos de vértice não podem compartilhar o mesmo deslocamento ou sobrepor uns aos outros.
  • Elementos de vértice com (D3DDECLUSAGE_POSITION, 0) ou (D3DDECLUSAGE_POSITIONT,0) não são necessários.
  • Elementos de vértice com (D3DDECLUSAGE_POSITION, 0) e (D3DDECLUSAGE_POSITIONT,0) não podem estar presentes na mesma declaração.
  • O sombreador de vértice atual deve ser versão 3.0 ou superior quando essa declaração é usada.

Declaração de vértice