Compartilhar via


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

No pipeline de vértice de função fixa, processar os 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 sinalizadores de clipe e extensões de atualização, 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 . Esse sinalizador se aplica somente ao processamento de vértice 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 método IDirect3DDevice9::P rocessVertices . O método aceita cinco parâmetros que descrevem o local e a quantidade de vértices direcionados pelo método, 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, o segundo e o terceiro parâmetros, SrcStartIndex, DestIndex e VertexCount, refletem o índice do primeiro vértice a ser carregado, 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 como o endereço da interface IDirect3DVertexBuffer9 do objeto 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 para otimizar o processamento em algumas situações. Você também pode combinar o valor D3DPV_DONOTCOPYDATA com um ou mais valores 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 vértice 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 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á habilitada, ou seja, D3DRS_LIGHTING é definida como TRUE. A cor especular é gerada quando a iluminação está habilitada e a especificação está habilitada, ou seja, D3DRS_SPECULARENABLE e D3DRS_LIGHTING são definidos como TRUE. A cor especular também é gerada quando a neblina está habilitada. As coordenadas de textura são geradas quando a transformação de textura ou a geração de textura está habilitada. 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értice.

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 por meio de D3DFVF_XYZB5 são inválidos.
  • Os sinalizadores D3DFVF_NORMAL, D3DFVF_RESERVED0 e D3DFVF_RESERVED2 não devem ser definidos.
  • O sinalizador D3DFVF_DIFFUSE deve ser definido se uma operação OR das seguintes condições retornar true:
    • A iluminação está habilitada; ou seja, D3DRS_LIGHTING é TRUE.
    • A iluminação está desabilitada, a cor difusa está presente nos fluxos de vértice 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á habilitada e a cor especular está habilitada; ou seja, D3DRS_SPECULARENABLE é TRUE.
    • A iluminação está desabilitada, a cor especular está presente nos fluxos de vértice de entrada e D3DPV_DONOTCOPYDATA não está definida.
    • A neblina de vértice está habilitada; ou seja, D3DRS_FOGVERTEXMODE não está definido como 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 ativa 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 aos das coordenadas de textura do vértice de entrada. Se D3DPV_DONOTCOPYDATA for definido e a transformação de textura e a geração de textura estiverem desabilitadas, 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 fase de textura ativa, o vértice de saída poderá precisar conter mais conjuntos de coordenadas de textura do que o vértice de entrada. Isso ocorre devido à proliferação de coordenadas de textura das que estão sendo geradas pela geração de textura ou derivadas por transformações de textura. Observe que uma proliferação semelhante de coordenadas de textura ocorre durante as chamadas IDirect3DDevice9::D rawPrimitive , mas não é visível para o programador de aplicativos. 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. Sempre que um novo conjunto é necessário, ele é alocado em ordem crescente. Observe que o requisito máximo e típico é um conjunto por estágio, embora possa ser menor devido ao compartilhamento de coordenadas de textura nãotransformadas por meio de D3DTSS_TEXCOORDINDEX.

Assim, para cada estágio de textura, um novo conjunto de coordenadas de textura será gerado se uma textura estiver associada 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 textura está habilitada para esse estágio.
  • As coordenadas de textura de entrada nãotransformadas são referenciadas por meio 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 de FVF apropriado.
  2. Reprogramar o 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 chamadas IDirect3DDevice9::D rawPrimitive e IDirect3DDevice9::D rawIndexedPrimitive .

Por fim, a dimensionalidade da coordenada de textura (D3DFVF_TEX0 por meio de 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 desabilitada e a geração de textura estiver habilitada, a dimensionalidade de saída deverá corresponder às configurações do modo de geração de textura; Atualmente, todos os modos geram três valores float.

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