Mapeamento de deslocamento (Direct3D 9)
Os mapas de deslocamento são semelhantes aos mapas de textura, mas são acessados pelo mecanismo de vértice.
Diagrama de Blocos
Um estágio adicional do amostrador está presente na parte inicial do tubo de vértice, como mostrado no diagrama a seguir, que pode obter amostras de um mapa de deslocamento para fornecer dados de deslocamento de vértice.
O estado do amostrador 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é-amostrado ou não, o que significa que pode ser ordenado de uma forma que permita a consulta dos valores de deslocamento sem filtragem.
- Os mapas de deslocamento são análogos aos mapas de textura, mas são acessados pelo mecanismo de vértice.
- Um estágio adicional do amostrador está presente na parte inicial do tubo de vértice que pode coletar amostras de um mapa de deslocamento. Este estágio é acessado pela API SetSamplerState usual, mas o número do 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 particular que permite a pesquisa dos valores de deslocamento sem filtragem.
- As alterações na estrutura da declaração permitem especificar a coordenada de textura utilizada para localizar o mapa de textura. Por exemplo, Stream0, Offset, FLOAT2, LOOKUP, Displacement_value. Isto instrui o tessellator a usar o vetor float 2D em stream0, a um determinado deslocamento, como uma coordenada de textura para procurar o mapa de deslocamento e associar a semântica de uso Displacement_value a esta coordenada. 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.
- Existe um tipo especial de mapeamento por deslocamento quando o mapa de textura é previamente 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, Usage, UsageIndex.
- A saída da pesquisa são 4 números de ponto flutuante.
- O mapeamento de deslocamentos é compatível apenas com N-patches.
- Os drivers precisam ignorar D3DDMAPSAMPLER em SetTextureStageState se não manipularem mapas de deslocamento.
- O modo de filtro D3DTEXF_ANISOTROPIC não é suportado.
- Quando D3DSAMP_MIPFILTER no amostrador de mapa de deslocamento não é D3DTEXF_NONE, o nível de detalhe é calculado da seguinte forma (Observe que o estado de tesselação adaptativa é usado mesmo que o D3DRS_ENABLEADAPTIVETESSELLATION seja FALSE): Tmax = estado de renderização D3DRS_MAXTESSELLATIONLEVEL
- Calcule o nível de tesselação Te para um vértice Vi: (Xi, Yi, Zi) da mesma forma descrita na seção "Tesselação adaptativa". Nível de detalhe L = log2(Tmax) - log2 (Te).
- As operações de filtragem e amostragem de textura seguem as mesmas regras do pipeline de pixels (desvio de nível de detalhe (LOD) é aplicado, etc.).
- Nem todos os formatos podem ser usados como mapas de deslocamento, mas apenas aqueles que suportam o D3DUSAGE_DMAP. O aplicativo pode consultar isso com o 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. Não pode ser usado com mapas de cubo ou volumes.
- As texturas e os alvos de renderização criados com D3DUSAGE_DMAP podem ser definidos em estágios regulares do amostrador e como alvos 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 existem modos de encapsulamento para o motor de tesselação.
- Um amostrador de mapa de deslocamento tem 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 a semântica _sample), enquanto os outros canais usam como padrão (1, 1, 1). Quando consultado, D3DFMT_L8 é difundido para os canais R, G, B e A é por padrão 1. O rasterizador de referência tem todos os detalhes de implementação.
Mapeamento de deslocamento pré-amostrado
- É introduzido um novo estado do amostrador: D3DSAMP_DMAPOFFSET (DWORD) - deslocamento (em vértices) num mapa de deslocamento pré-amostrado.
- É introduzido um novo método de declaração: D3DDECLMETHOD_LOOKUPPRESAMPLED.
- A tesselação adaptativa deve ser desativada.
- As configurações do filtro de textura são ignoradas. A amostragem pontual é feita. Presume-se que o filtro de textura mip seja D3DTEXF_NONE. Todos os outros modos de filtro de textura são considerados como D3DTEXF_POINT.
- As coordenadas de textura são calculadas como: U = (Index % TextureWidthInPixeles) / (float)(TextureWidthInPixeles) V = (Index / TextureWidthInPixeles) / (float)(TextureHeightInPixeles) onde 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.
Estas são as alterações de API que suportam o 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.
- Novos limites de hardware foram adicionados, D3DDEVCAPS2_DMAPNPATCH e D3DDEVCAPS2_PRESAMPLEDDMAPNPATCH. Consulte D3DDEVCAPS2.
Tópicos relacionados