Partilhar via


Processamento de vértice de função fixa (Direct3D 9)

No pipeline de vértices de função fixa, o processamento dos vértices em um buffer de vértice aplica as matrizes de transformação atuais para o dispositivo. Operações de vértice, como iluminação, geração de clip flags e atualização de extensões também podem ser aplicadas, opcionalmente. Ao usar o processamento de vértice de função fixa, a modificação dos elementos no buffer de vértice de destino é controlada pelo sinalizador D3DPV_DONOTCOPYDATA. Este sinalizador aplica-se apenas ao processamento de vértices de função fixa. A interface IDirect3DDevice9 expõe o método IDirect3DDevice9::P rocessVertices para processar vértices. Você processa vértices de um sombreador de vértice para o conjunto de fluxos de dados de entrada, gerando um único fluxo de dados de vértice intercalados para o buffer de vértice de destino chamando o IDirect3DDevice9::P rocessVertices método. O método aceita cinco parâmetros que descrevem o local e a quantidade de vértices que o método visa, o buffer de vértice de destino e as opções de processamento. Após a chamada, o buffer de destino contém os dados de vértice processados.

O primeiro, segundo e terceiro parâmetros, SrcStartIndex, DestIndex e VertexCount, refletem o índice do primeiro vértice a carregar, o índice dentro do buffer de destino no qual os vértices serão colocados e o número total de vértices a serem processados e colocados no buffer de destino, respectivamente. O quarto parâmetro, pDestBuffer deve ser definido para o endereço do IDirect3DVertexBuffer9 interface do objeto de buffer de vértice que receberá os vértices de origem. O parâmetro SrcStartIndex especifica o índice no qual o método deve começar a processar vértices.

O parâmetro final, Flags, determina opções especiais de processamento para o método. Você pode definir esse parâmetro como 0 para processamento de vértice padrão ou para D3DPV_DONOTCOPYDATA otimizar o processamento em algumas situações. Você também pode combinar o valor D3DPV_DONOTCOPYDATA com um ou mais valores de D3DLOCK apropriados para o buffer de destino. Quando você define Sinalizadores como 0, os componentes de vértice do formato de vértice do buffer de destino que não são afetados pela operação de vértice ainda são copiados do sombreador de vértice ou definidos como 0. No entanto, ao usar D3DPV_DONOTCOPYDATA, IDirect3DDevice9::P rocessVertices não substitui as informações de coordenadas de cor e textura no buffer de destino, a menos que esses dados sejam gerados pelo Direct3D. A cor difusa é gerada quando a iluminação está ativada, ou seja, D3DRS_LIGHTING é definida como TRUE. A cor especular é gerada quando a iluminação é ativada e a especular é ativada, ou seja, D3DRS_SPECULARENABLE e D3DRS_LIGHTING são definidas para TRUE. A cor especular também é gerada quando o nevoeiro está ativado. As coordenadas de textura são geradas quando a transformação de textura ou a geração de textura está ativada. IDirect3DDevice9::P rocessVertices usa os estados de renderização atuais para determinar qual processamento de vértice deve ser feito.

Configurações de uso de FVF para buffers de vértice de destino

O método IDirect3DDevice9::P rocessVertices requer configurações específicas para o D3DFVF do buffer de vértice de destino. As configurações de uso do FVF devem ser compatíveis com as configurações atuais para processamento de vértices.

Para processamento de vértice de função fixa, IDirect3DDevice9::P rocessVertices requer as seguintes configurações FVF:

  • O tipo de posição é sempre D3DFVF_XYZRHW; portanto, D3DFVF_XYZ E D3DFVF_XYZB1 através D3DFVF_XYZB5 são inválidos.
  • As bandeiras D3DFVF_NORMAL, D3DFVF_RESERVED0 e D3DFVF_RESERVED2 não devem ser definidas.
  • O sinalizador D3DFVF_DIFFUSE deve ser definido se uma operação OR das seguintes condições retornar true:
    • A iluminação está ativada; ou seja, D3DRS_LIGHTING é VERDADE.
    • A iluminação está desativada, a cor difusa está presente nos fluxos de vértices de entrada e D3DPV_DONOTCOPYDATA não está definida.
  • O sinalizador D3DFVF_SPECULAR deve ser definido se uma operação OR das seguintes condições retornar true:
    • A iluminação está ativada e a cor especular está ativada; ou seja, D3DRS_SPECULARENABLE é VERDADEIRO.
    • A iluminação está desativada, a cor especular está presente nos fluxos de vértices de entrada e D3DPV_DONOTCOPYDATA não está definida.
    • A névoa de vértice está ativada; ou seja, D3DRS_FOGVERTEXMODE não está definido para D3DFOG_NONE.

Além disso, a contagem de coordenadas de textura deve ser definida da seguinte maneira:

  • Se a transformação de textura e a geração de textura estiverem desabilitadas para todos os estágios de textura ativos e a D3DPV_DONOTCOPYDATA não estiver definida, o número e o tipo de coordenadas de textura de saída serão necessários para corresponder às coordenadas de textura do vértice de entrada. Se D3DPV_DONOTCOPYDATA estiver definido e a transformação de textura e a geração de textura estiverem desativadas, as coordenadas de textura de saída serão ignoradas.
  • Se a transformação de textura ou a geração de textura estiver habilitada para qualquer estágio de textura ativo, o vértice de saída pode precisar conter mais conjuntos de coordenadas de textura do que o vértice de entrada. Isto deve-se à proliferação de coordenadas de textura daquelas que estão a ser geradas por geração de textura ou derivadas por transformações de textura. Observe que uma proliferação semelhante de coordenadas de textura ocorre durante IDirect3DDevice9::D rawPrimitive chamadas, mas não é visível para o programador do aplicativo. Nesse caso, o Direct3D gera um novo conjunto de coordenadas de textura. O novo conjunto de coordenadas de textura é derivado percorrendo os estágios de textura e analisando as configurações de geração de textura, transformação de textura e índice de coordenadas de textura para determinar se um conjunto exclusivo de coordenadas de textura é necessário para esse estágio. Cada vez que um novo conjunto é necessário, ele é alocado em ordem crescente. Observe que o requisito máximo, e típico, é de um conjunto por estágio, embora possa ser menor devido ao compartilhamento de coordenadas de textura não transformadas através de D3DTSS_TEXCOORDINDEX.

Assim, para cada estágio de textura, um novo conjunto de coordenadas de textura é gerado se uma textura estiver ligada a esse estágio e qualquer uma das seguintes condições for verdadeira:

  • A geração de textura está habilitada para esse estágio.
  • A transformação de textura é habilitada para esse estágio.
  • As coordenadas de textura de entrada não transformadas são referenciadas através de D3DTSS_TEXCOORDINDEX pela primeira vez.

Quando o Direct3D está gerando coordenadas de textura, o aplicativo é necessário para executar as seguintes ações:

  1. Use um buffer de vértice de destino com o uso apropriado de FVF.
  2. Reprograme a D3DTSS_TEXCOORDINDEX do estágio de textura de acordo com o posicionamento das coordenadas de textura pós-processadas. Observe que a reprogramação da configuração de D3DTSS_TEXCOORDINDEX ocorre quando o buffer de vértice processado é usado em subsequentes IDirect3DDevice9::D rawPrimitive e IDirect3DDevice9::D rawIndexedPrimitive chamadas.

Finalmente, a dimensionalidade das coordenadas de textura (D3DFVF_TEX0 a D3DFVF_TEX8 ) deve ser definida da seguinte maneira:

  • Para cada conjunto de coordenadas de textura, se a transformação de textura e a geração de textura estiverem desabilitadas, a dimensionalidade da coordenada de textura de saída deverá corresponder à entrada. Se a transformação de textura estiver habilitada, a dimensionalidade de saída deverá corresponder à contagem definida pelas configurações de D3DTTFF_COUNT1, D3DTTFF_COUNT2, D3DTTFF_COUNT3 ou D3DTTFF_COUNT4. Se a transformação de textura estiver desativada e a geração de textura estiver ativada, a dimensionalidade de saída deverá corresponder às configurações para o modo de geração de textura; Atualmente, todos os modos geram três valores de flutuação.

Quando IDirect3DDevice9::P rocessVertices falha devido a um código FVF de buffer de vértice de destino incompatível, o código esperado é impresso na saída de depuração (somente compilações de depuração).

Buffers de vértice