Introdução a texturas
Um recurso de textura é uma estrutura de dados para armazenar texels, que são a menor unidade de uma textura que pode ser lida ou gravada. Quando a textura é lida por um sombreador, ela pode ser filtrada por amostradores de textura.
Um recurso de textura é uma coleção estruturada de dados projetada para armazenar texels. Um texel representa a menor unidade de uma textura que pode ser lida ou gravada pelo pipeline. Ao contrário dos buffers, as texturas podem ser filtradas por amostradores de textura à medida que são lidas por unidades de sombreador. O tipo de textura afeta a forma como a textura é filtrada. Cada texel contém de 1 a 4 componentes, organizados em um dos formatos DXGI definidos pela DXGI_FORMAT enumeração.
As texturas são criadas como um recurso estruturado com um tamanho conhecido. No entanto, cada textura pode ser tipada ou sem tipo quando o recurso é criado, desde que o tipo seja totalmente especificado usando uma exibição quando a textura está associada ao pipeline.
Tipos de textura
O Direct3D dá suporte a várias representações de ponto flutuante. Todos os cálculos de ponto flutuante operam sob um subconjunto definido das regras de ponto flutuante de precisão única de 32 bits IEEE 754.
Existem vários tipos de texturas: 1D, 2D, 3D, cada uma das quais pode ser criada com ou sem mipmaps. O Direct3D também dá suporte a matrizes de textura e texturas com várias amostras.
Texturas 1D
Uma textura 1D em sua forma mais simples contém dados de textura que podem ser endereçados com uma única coordenada de textura; Ele pode ser visualizado como uma matriz de texels, conforme mostrado na ilustração a seguir.
A ilustração a seguir mostra uma textura 1D:
Cada texel contém vários componentes de cor, dependendo do formato dos dados armazenados. Adicionando mais complexidade, você pode criar uma textura 1D com níveis de mipmap, conforme mostrado na ilustração a seguir.
Um nível de mipmap é uma textura que é uma potência de dois menor do que o nível acima dele. O nível superior contém mais detalhes, cada nível subsequente é menor. Para um mipmap 1D, o menor nível contém um texel. Além disso, os níveis de MIP sempre reduzem para 1:1.
Quando os mipmaps são gerados para uma textura de tamanho ímpar, o próximo nível inferior é sempre o tamanho par (exceto quando o nível mais baixo atinge 1). Por exemplo, o diagrama ilustra uma textura 5x1 cujo próximo nível mais baixo é uma textura 2x1, cujo próximo (e último) nível mip é uma textura de tamanho 1x1. Os níveis são identificados por um índice chamado LOD (nível de detalhe), que é usado para acessar a textura menor ao renderizar a geometria que não está tão próxima da câmera.
Matrizes de textura 1D
O Direct3D também dá suporte a matrizes de texturas. Uma matriz de texturas 1D se parece conceitualmente com a ilustração a seguir.
Essa matriz de textura contém três texturas. Cada uma das três texturas tem uma largura de textura de 5 (que é o número de elementos na primeira camada). Cada textura também contém um mipmap de 3 camadas.
Todas as matrizes de textura no Direct3D são uma matriz homogênea de texturas; Isso significa que cada textura em uma matriz de textura deve ter o mesmo formato e tamanho de dados (incluindo largura de textura e número de níveis de mipmap). Você pode criar matrizes de textura de tamanhos diferentes, desde que todas as texturas em cada matriz correspondam em tamanho.
Texturas 2D e matrizes de texturas 2D
Um recurso Texture2D contém uma grade 2D de texels. Cada texel é endereçável por um vetor u, v. Como é um recurso de textura, ele pode conter níveis de mipmap e sub-recursos. Um recurso de textura 2D totalmente preenchido se parece com a ilustração a seguir.
Esse recurso de textura contém uma única textura 3x5 com três níveis de mipmap.
Um recurso de matriz de textura 2D é uma matriz homogênea de texturas 2D; Ou seja, cada textura tem o mesmo formato de dados e dimensões (incluindo níveis de mipmap). Ele tem um layout semelhante ao da matriz de textura 1D, exceto que as texturas agora contêm dados 2D, conforme mostrado na ilustração a seguir.
Essa matriz de textura contém três texturas; Cada textura é 3x5 com dois níveis de mipmap.
Usando uma matriz de textura 2D como um cubo de textura
Um cubo de textura é uma matriz de textura 2D que contém 6 texturas, uma para cada face do cubo. Um cubo de textura totalmente preenchido se parece com a ilustração a seguir.
Uma matriz de textura 2D que contém 6 texturas pode ser lida de dentro de sombreadores com as funções intrínsecas do mapa de cubo, depois que elas são associadas ao pipeline com uma exibição de textura de cubo. Os cubos de textura são endereçados a partir do sombreador com um vetor 3D apontando para fora do centro do cubo de textura.
Texturas 3D
Um recurso de textura 3D (também conhecido como textura de volume) contém um volume 3D de texels. Por ser um recurso de textura, ele pode conter níveis de mipmap. Uma textura 3D totalmente preenchida se parece com a ilustração a seguir.
Quando uma fatia de mipmap de textura 3D é vinculada como uma saída de destino de renderização (com uma exibição de destino de renderização), a textura 3D se comporta de forma idêntica a uma matriz de textura 2D com n fatias. A fatia de renderização específica é escolhida no estágio do sombreador de geometria.
Não existe o conceito de uma matriz de textura 3D; portanto, um sub-recurso de textura 3D é um único nível de mipmap.
Os sistemas de coordenadas do Direct3D são definidos para pixels e texels.
Sistema de coordenadas de pixel
O sistema de coordenadas de pixel no Direct3D define a origem de um destino de renderização no canto superior esquerdo, conforme mostrado no diagrama a seguir. Os centros de pixel são deslocados por (0,5f,0,5f) de locais inteiros.
Sistema de coordenadas Texel
O sistema de coordenadas texel tem sua origem no canto superior esquerdo da textura, conforme mostrado no diagrama a seguir. Isso torna a renderização de texturas alinhadas à tela trivial, pois o sistema de coordenadas de pixel está alinhado com o sistema de coordenadas texel.
As coordenadas de textura são representadas com um número normalizado ou em escala; Cada coordenada de textura é mapeada para um texel específico da seguinte maneira:
Para uma coordenada normalizada:
- Amostragem de pontos: Texel # = floor(U * Width)
- Amostragem linear: Texel esquerdo # = floor(U * Largura), Texel direito # = Texel esquerdo # + 1
Para uma coordenada dimensionada:
- Amostragem pontual: Texel # = floor(U)
- Amostragem linear: Texel esquerdo # = floor(U - 0,5), Texel direito # = Texel esquerdo # + 1
Onde a largura, é a largura da textura (em texels).
A quebra automática de endereço de textura ocorre depois que o local do texel é calculado.