Mapeamento de deslocamento (Direct3D 9)

Mapas de deslocamento são semelhantes aos mapas de textura, mas são acessados pelo mecanismo de vértice.

Diagrama de Bloco

Um estágio de amostra adicional está presente na parte inicial do pipe de vértice, conforme mostrado no diagrama a seguir, que pode amostrar um mapa de deslocamento para fornecer dados de deslocamento de vértice.

diagrama do estágio do sampler no pipe de vértice

O estado do sampler do mapa de deslocamento pode ser definido pelo SetSamplerState usando o número de estágio 256, que é um novo número de estágio. A textura do mapa de deslocamento é definida por SetTexture.

O mapa pode ser pré-carregado ou não, o que significa que ele pode ser ordenado de uma forma que permita a pesquisa dos valores de deslocamento sem filtragem.

  • Mapas de deslocamento são análogos a mapas de textura, mas são acessados pelo mecanismo de vértice.
  • Um estágio de amostra adicional está presente na parte inicial do pipe de vértice que pode amostrar um mapa de deslocamento. Esse estágio é acessado pela API SetSamplerState usual, mas o número de estágio é D3DDMAPSAMPLER = 256.
  • O estado do amostrador do mapa de deslocamento pode ser definido pelo SetSamplerState(D3DDMAPSAMPLER, ...) API.
  • A textura do mapa de deslocamento é definida pela API SetTexture(D3DDMAPSAMPLER, texture).
  • O mapa pode ser pré-amostrado ou não. Isso significa que ele pode ser ordenado de uma maneira específica que permite a pesquisa dos valores de deslocamento sem filtragem.
  • As alterações na estrutura de declaração permitem a especificação da coordenada de textura usada para pesquisar o mapa de textura. Por exemplo, Stream0, Offset, FLOAT2, LOOKUP Displacement_value. Isso instrui o mosaico a usar o vetor float 2D no fluxo0 em um determinado deslocamento como uma coordenada de textura para pesquisar o mapa de deslocamento e associar a semântica de uso do Displacement_value a ele. A declaração do sombreador de vértice conteria uma linha semelhante a {dcl_texture0, v0} indicando que a semântica texture0 deve ser associada ao registro de entrada v0. O valor de deslocamento pesquisado é copiado para o registro de entrada v0.
  • Há um tipo especial de mapeamento de deslocamento quando o mapa de textura é pré-amostrado. O índice sequencial de vértices gerados é usado como uma coordenada de textura para um mapa de textura. Por exemplo, 0,0,(D3DDECLTYPE)0,D3DDECLMETHOD_LOOKUPPRESAMPLED, Uso, UsageIndex.
  • A saída da pesquisa é de 4 floats.
  • O mapeamento de deslocamento só tem suporte com N-patches.
  • Os drivers precisarão ignorar D3DDMAPSAMPLER em SetTextureStageState se não lidarem com mapas de deslocamento.
  • não há suporte para D3DTEXF_ANISOTROPIC modo de filtro.
  • Quando D3DSAMP_MIPFILTER no amostrador de mapa de deslocamento não é D3DTEXF_NONE, o nível de detalhes é calculado da seguinte maneira (Observe que o estado de mosaico adaptável é usado mesmo se o D3DRS_ENABLEADAPTIVETESSELLATION for FALSE): Tmax = renderizar estado D3DRS_MAXTESSELLATIONLEVEL
  • Compute o nível de mosaico Te para um vértice Vi: (Xi, Yi, Zi) da mesma maneira descrita na seção "Mosaico adaptável". Nível de detalhe L = log2(Tmax) – log2 (Te).
  • As operações de filtragem e amostragem de textura seguem as mesmas regras que o pipeline de pixel (nível de detalhe (LOD) é aplicado etc.).
  • Nem todos os formatos podem ser usados como mapas de deslocamento, mas apenas aqueles que dão suporte ao D3DUSAGE_DMAP. O aplicativo pode consultar isso com CheckDeviceFormat CheckDeviceFormat.
  • D3DUSAGE_DMAP deve ser especificado em CreateTexture para notificar o driver de que essa textura deve ser usada como um mapa de deslocamento.
  • D3DUSAGE_DMAP só pode ser usado com texturas. Ele não pode ser usado com mapas de cubo ou volumes.
  • Texturas e destinos de renderização criados com D3DUSAGE_DMAP podem ser definidos em estágios de amostragem regulares e como destinos de renderização.
  • Os estados de renderização para definir o modo de encapsulamento para as coordenadas de textura são ignorados no mapeamento de deslocamento. Em geral, não há modos de encapsulamento para o mecanismo de mosaico.
  • Um amostrador de mapa de deslocamento tem um comportamento idêntico ao dos amostradores de textura de pixel. Se uma textura com menos de quatro canais (como R32f) for pesquisada, os valores pesquisados vão para os canais apropriados do registro de destino (o registro de entrada do sombreador de vértice marcado com o _sample semântico), enquanto os outros canais assumem como padrão (1, 1, 1). Quando pesquisado, D3DFMT_L8 é transmitido para os canais R, G, B e A assume como padrão 1. O rasterizador de referência tem os detalhes completos da implementação.

Mapeamento de deslocamento pré-amostrado

  • Novo estado de amostragem é introduzido: D3DSAMP_DMAPOFFSET (DWORD) – deslocamento (em vértices) em um mapa de deslocamento pré-amostrado.
  • Novo método de declaração é introduzido: D3DDECLMETHOD_LOOKUPPRESAMPLED.
  • O mosaico adaptável deve ser desabilitado.
  • As configurações de filtro de textura são ignoradas. A amostragem de ponto é feita. O filtro de textura mip é considerado D3DTEXF_NONE. Todos os outros modos de filtro de textura são considerados D3DTEXF_POINT.
  • As coordenadas de textura são computadas como: U = (Index % TextureWidthInPixeles) / (float)(TextureWidthInPixeles) V = (Index / TextureWidthInPixeles) / (float)(TextureHeightInPixeles) em que Index é um índice sequencial de vértices gerados mais TSS[D3DSAMP_DMAPOFFSET]. O índice sequencial é definido como zero no início de cada primitivo e é aumentado depois que um vértice é gerado.

Essas são as alterações de API que dão suporte ao mapeamento de deslocamento.

  • Um formato de canal único adicionado, D3DFMT_L16.
  • Um novo sinalizador de uso, D3DUSAGE_DMAP.
  • Um estágio de textura especial, usado para definir uma textura de mapa de deslocamento, D3DDMAPSAMPLER.
  • Novas tampas de hardware foram adicionadas, D3DDEVCAPS2_DMAPNPATCH e D3DDEVCAPS2_PRESAMPLEDDMAPNPATCH. Consulte D3DDEVCAPS2.

Pipeline de vértice