Recursos de exemplo de textura de recursos de streaming
Os recursos de amostragem de textura de recursos de streaming incluem obter feedback de status do sombreador sobre as áreas mapeadas, verificar se todos os dados que estão sendo acessados foram mapeados no recurso, fixação para ajudar os sombreadores a evitar áreas em recursos de streaming mipmapped que são conhecidos por não serem mapeados, e descobrir o que será o LED mínimo que está totalmente mapeado para um volume de filtro de textura inteiro.
Requisitos de recursos de amostragem de textura de recursos de streaming
Os recursos de amostragem de textura descritos aqui exigem suporte a recursos de streaming de nível 2 de nível 2.
Comentários sobre o status do sombreador sobre áreas mapeadas
Qualquer instrução de sombreador que lê e/ou grava em um recurso de streaming faz com que as informações de status sejam registradas. Esse status é exposto como um valor de retorno extra opcional em cada instrução de acesso a recursos que entra em um registro temporário de 32 bits. O conteúdo do valor retornado é opaco. Ou seja, a leitura direta pelo programa shader não é permitida. No entanto, você pode usar a função CheckAccessFullyMapped para extrair as informações de status.
Verificação totalmente mapeada
A função CheckAccessFullyMapped interpreta o status retornado de um acesso à memória e indica se todos os dados que estão sendo acessados foram mapeados no recurso. CheckAccessFullyMapped retornará true (0xFFFFFFFF) se os dados foram mapeados ou false (0x00000000) se os dados foram desmapeados.
Durante as operações de filtro, às vezes o peso de um determinado texel acaba sendo 0,0. Um exemplo é uma amostra linear com coordenadas de textura que caem diretamente em um centro de texel: 3 outros texels (quais são podem variar de acordo com o hardware) contribuem para o filtro, mas com peso 0. Esses texels de peso 0 não contribuem para o resultado do filtro, portanto, se eles caírem em blocos NULL , eles não contarão como um acesso não mapeado. Observe que a mesma garantia se aplica a filtros de textura que incluem vários níveis de mip; Se os texels em um dos mipmaps não estiverem mapeados, mas o peso nesses texels for 0, esses texels não contarão como um acesso não mapeado.
Ao fazer a amostragem de um formato que tem menos de 4 componentes (como DXGI_FORMAT_R8_UNORM), todos os texels que se enquadram em blocos NULL resultam em um acesso mapeado NULL sendo relatado, independentemente de quais componentes o sombreador realmente examina no resultado. Por exemplo, ler de R8_UNORM e mascarar o resultado da leitura no sombreador com .gba/.yzw não parece precisar ler a textura. Mas se o endereço texel for um bloco mapeado NULL , a operação ainda contará como um acesso ao mapa NULL .
O sombreador pode verificar o status e seguir qualquer curso de ação desejado em caso de falha. Por exemplo, um curso de ação pode ser registrar 'erros' (digamos, via gravação UAV) e/ou emitir outra leitura presa a um LOD mais grosseiro conhecido por ser mapeado. Um aplicativo também pode querer rastrear acessos bem-sucedidos para ter uma noção de qual parte do conjunto mapeado de blocos foi acessada.
Uma complicação para o registro em log é que não existe nenhum mecanismo para relatar o conjunto exato de blocos que teriam sido acessados. O aplicativo pode fazer suposições conservadoras com base no conhecimento das coordenadas usadas para acesso, bem como no uso da instrução LOD; por exemplo, tex2Dlod) retorna o cálculo de LOD de hardware.
Outra complicação é que muitos acessos serão para os mesmos blocos, portanto, muitos registros redundantes ocorrerão e possivelmente contenção na memória. Pode ser conveniente se o hardware puder ter a opção de não se preocupar em relatar acessos de bloco se eles foram relatados em outro lugar antes. Talvez o estado desse rastreamento possa ser redefinido a partir da API (provavelmente nos limites do quadro).
Grampo MinLOD por amostra
Para ajudar os sombreadores a evitar áreas em recursos de streaming mipmapeados que são conhecidos por não serem mapeados, a maioria das instruções de sombreador que envolvem o uso de um sampler (filtragem) tem um modo que permite que o sombreador passe um parâmetro de grampo float32 MinLOD adicional para o exemplo de textura. Esse valor está no espaço numérico mipmap da exibição, em oposição ao recurso subjacente.
O hardware é executadomax(fShaderMinLODClamp,fComputedLOD)
no mesmo local no cálculo de LOD em que ocorre o grampo MinLOD por recurso, que também é um max().
Se o resultado da aplicação do grampo de LOD por amostra e quaisquer outros grampos de LOD definidos no amostrador for um conjunto vazio, o resultado será o mesmo resultado de acesso fora dos limites que o grampo minLOD por recurso: 0 para componentes no formato de superfície e padrões para componentes ausentes.
A instrução LOD (por exemplo, tex2Dlod), que antecede o grampo minLOD por amostra descrito aqui, retorna um LOD fixado e não fixado. O LOD fixado retornado desta instrução de LOD reflete toda a fixação, incluindo o grampo por recurso, mas não um grampo por amostra. O grampo por exemplo é controlado e conhecido pelo sombreador de qualquer maneira, portanto, o autor do sombreador pode aplicar manualmente esse grampo ao valor retornado da instrução LOD, se desejar.
Filtragem de redução mínima/máxima
Os aplicativos podem optar por gerenciar suas próprias estruturas de dados que os informam sobre a aparência dos mapeamentos de um recurso de streaming. Um exemplo seria uma superfície que contém um texel para armazenar informações para cada bloco em um recurso de streaming. Pode-se armazenar o primeiro LOD mapeado em um determinado local de bloco. Por meio de uma amostragem cuidadosa dessa estrutura de dados de maneira semelhante à que o recurso de streaming deve ser amostrado, pode-se descobrir qual será o LOD mínimo totalmente mapeado para um volume de filtro de textura inteiro. Para ajudar a facilitar esse processo, o Direct3D 11.2 apresenta um novo modo de amostrador de uso geral, filtragem mínima/máxima.
A utilidade da filtragem mínima/máxima para rastreamento de LOD pode ser útil para outros fins, como, talvez, a filtragem de superfícies de profundidade.
A filtragem de redução mínima/máxima é um modo em samplers que busca o mesmo conjunto de texels que um filtro de textura normal buscaria. Mas, em vez de combinar os valores para produzir uma resposta, ele retorna o min() ou max() dos texels buscados, por componente (por exemplo, o mínimo de todos os valores de R, separadamente do mínimo de todos os valores de G e assim por diante).
As operações mínimas/máximas seguem as regras de precisão aritmética do Direct3D. A ordem das comparações não importa.
Durante operações de filtro que não são min/max, às vezes o peso de um determinado texel acaba sendo 0,0. Um exemplo é um exemplo linear com coordenadas de textura que caem diretamente em um centro de texel; Nesse caso, 3 outros texels (quais são podem variar de acordo com o hardware) contribuem para o filtro, mas com peso 0. Para qualquer um desses texels que teria peso 0 em um filtro não mínimo/máximo, se o filtro for mínimo/máximo, esses texels ainda não contribuirão para o resultado (e os pesos não afetarão a operação do filtro mínimo/máximo).
O suporte para esse recurso depende do suporte da Camada 2 para recursos de streaming.
Tópicos relacionados
Acesso pipeline aos recursos de streaming