Pular para o conteúdo principal
Este tópico descreve os formatos de compressão e descompressão de cor de destino de renderização de baixo nível usados pelo hardware gráfico.

Pipeline gráfico

O diagrama a seguir mostra o pipeline gráfico lógico. Os blocos de profundidade e de cor são as duas últimas operações lógicas antes da saída de renderização. Pipeline gráfico lógico Os formatos de compressão de textura são tratados de forma diferente dos de cor e profundidade. Para obter mais informações, consulte Gerenciamento de recursos nativos para XBOX One.

Terminologia para compressão de cor

Veja a seguir termos comuns usados ao descrever sistemas de compressão.

O bloco de cor

O bloco de cor é responsável por transferir para a memória os dados de cor gerados pelo sombreador de pixel. Esse processo inclui o gerenciamento da compressão MSAA, da mesclagem de cores, da formatação de cores, da ROP e da gravação na memória. O bloco de cor permite que a cor de saída do sombreador para um pixel (cor de origem, CS) seja combinada com a cor atual no destino de renderização para esse pixel (cor de destino, CD) usando fatores de mesclagem (BF(S,D)) e uma função de combinação especificada. A equação geral para essa mesclagem é conhecida como equação de mesclagem.
O bloco de cor é responsável por converter a cor de saída do sombreador, formatada como UINT32, SINT32, FP32 ou FP16, para o formato do destino de renderização. Somente as conversões uint->uint, sint->sint, unorm->unorm, snorm->snorm e FP->não inteiro são compatíveis. O sombreador gera UINT32, SINT32 e FP32. O sistema de sombreadores converte FP32 em FP16 ou U/SNORM16, conforme apropriado, por motivos de desempenho. O bloco de cor oferece suporte a vários recursos especiais:
  • Um modo de mesclagem especial chamado mesclagem de origem dupla. Embora a maioria dos fatores de mesclagem seja uma função da cor de origem, da cor de destino ou da cor constante de mesclagem, a mesclagem de origem dupla usa uma segunda cor de saída do sombreador (atribuída a MRT1) como fatores de mesclagem. A cor de origem na equação de mesclagem é obtida de MRT0.
  • MSAA 2x, 4x e 8x. Há vários recursos específicos de MSAA no bloco de cor, como um resolve por hardware de qualquer superfície mesclável usando um filtro de caixa (calculando a média das subamostras de um pixel para obter a cor final do pixel) e a compressão de cor (descrita na seção a seguir).
  • Um buffer de quadros com correção de gama usando o formato 8_8_8_8 sRGB.
  • Limpeza rápida da superfície de cor. Isso é feito limpando apenas os bits de CMask associados a cada bloco na superfície. À medida que quads são desenhados em blocos com limpeza rápida, o bloco de cor tem um hardware especial para preencher posteriormente as partes dos blocos que não foram tocadas.
Um destino de renderização com limpeza rápida pode precisar ter sua cor de limpeza gravada em blocos que não se cruzam com a geometria renderizada após a limpeza no momento em que a superfície de renderização for lida. Isso é conhecido como eliminação de limpeza rápida. Na prática, as áreas limpas na CMask precisam ser replicadas como limpas na superfície principal. O bloco de cor é implementado como um pipeline de três estágios.
  1. O cache de CMask gerencia as informações de compressão em nível de bloco.
  2. O cache de FMask gerencia as informações de compressão em nível de quad.
  3. O cache de cor e o mesclador executam as atualizações de pixels.

Compressão de cor

O antialiasing de várias amostras (MSAA) é um método para reduzir artefatos visuais causados pela resolução limitada dos pixels. No MSAA, o valor final de cada pixel é determinado por 2, 4 ou 8 amostras de cor coletadas dentro do pixel. Cada uma dessas amostras recebe a mesma cor do sombreador de pixel, mas cada amostra passa por teste de profundidade separadamente. Isso resulta em detalhes mais refinados nas bordas da geometria. Pixels com várias amostras têm requisitos de memória e processamento maiores do que pixels de amostra única, e é por isso que um esquema de compressão de cor é implementado. A compressão de cor é um esquema sem perdas, por pixel, cujo objetivo é economizar largura de banda de memória e minimizar a quantidade de ciclos de clock necessários para operar em um pixel com várias amostras. No 8xMSAA (8 amostras por pixel), cada pixel requer potencialmente 8x a largura de banda de memória e 8x o poder de processamento de um pixel simples de amostra única. Normalmente, as amostras de um pixel são muito redundantes, contendo apenas um ou dois valores de cor exclusivos. Raramente todas as amostras de um pixel 8xMSAA têm 8 valores exclusivos. Uma alta disparidade nas amostras não é impossível. Ela pode ocorrer em uma cena com geometria finamente tesselada, ou pode acontecer simplesmente por acaso. O objetivo do esquema de compressão é aproveitar a redundância de amostras em uma cena típica.

Esquema de compressão de cor

Para comprimir um pixel MSAA, a redundância é aproveitada armazenando cada cor exclusiva apenas uma vez. Por exemplo, no 8xMSAA, as 8 amostras podem ter as cores mostradas na tabela a seguir. Há apenas três cores exclusivas, mas atualmente elas ocupam o espaço de 8. Três cores exclusivas ocupando o espaço de oito O nível mais baixo de compressão, chamado compressão FMask, remove essa redundância atribuindo um ponteiro a cada amostra de um pixel. O ponteiro informa ao esquema de compressão qual amostra contém a cor real dessa amostra. Um ponteiro 8xMSAA tem apenas 3 bits, enquanto os de 4xMSAA e 2xMSAA têm 2 e 1 bits, respectivamente. Como mostra a tabela anterior, isso reduz a quantidade de dados de cor necessários. Como sempre precisamos ser capazes de ter um pixel com a quantidade máxima de cores de amostra exclusivas, o esquema de compressão não reduz o volume de memória. Em vez disso, o esquema de compressão nos permite economizar largura de banda de memória lendo/gravando apenas os locais de amostra apontados por pelo menos um ponteiro FMask. Na tabela anterior, passamos de ler/gravar 8 cores para ler/gravar apenas 3. Além disso, quaisquer operações do bloco de cor (como mesclagem ou ROP) operam apenas em 3 cores em vez de 8, como mostrado nas tabelas a seguir. Memória FMask e memória de cor O esquema de compressão também implementa um nível mais alto de compressão chamado compressão CMask. Na tabela anterior, embora economizemos largura de banda com menos dados de cor, ainda precisamos ler 8 ponteiros FMask por pixel. A compressão CMask economiza largura de banda de memória minimizando a quantidade de dados de ponteiro lidos. No caso comum, há apenas 1 ou 2 ponteiros exclusivos. A CMask é um valor de quatro bits que codifica quais regiões têm limpeza rápida e quantos planos de bits precisam ser carregados para um determinado bloco. Há 1 bit de dados de limpeza rápida por região. Um valor 0 significa que a região tem limpeza rápida. Há uma codificação de dois bits de quantos planos de bits precisam ser carregados para um determinado bloco, como mostrado na tabela a seguir. Planos de bits da CMask

Antialiasing de qualidade aprimorada (EQAA)

O antialiasing de qualidade aprimorada (EQAA) é uma compressão com perdas para antialiasing. É uma extensão do algoritmo de compressão de cor sem perdas. O armazenamento de cores é reduzido de modo que não há armazenamento suficiente para ter uma cor exclusiva por amostra. Na maioria das vezes, um pixel tem apenas um pequeno número de cores exclusivas. A FMask pode mapeá-las para cobrir o pixel inteiro. Para EQAA, o bloco de cor oferece suporte a até 16 amostras. O bloco de cor não oferece suporte a 16 amostras para MSAA normal devido ao volume excessivo de memória. O bloco de cor não tenta adivinhar nem interpolar cores. Quando não consegue determinar qual deve ser uma cor ou não pode armazená-la, o bloco de cor marca a amostra correspondente como desconhecida na FMask. A renderização para EQAA acontece normalmente como no MSAA, mas está sujeita à limitação de que apenas um determinado número de amostras está correto. Há um limite para o número de amostras por superfície.

Compatibilidade de recursos

A tabela a seguir mostra as combinações de operações permitidas no bloco de cor. Combinações de operações permitidas no bloco de cor

APIs para compressão de cor

MSAA, EQAA, FMask e CMask são referenciados por várias APIs, estruturas e enumerações. A biblioteca XG fornece um layout para as configurações de FMask e CMask. Para obter mais informações, consulte ID3D12Device::CreateComponentPlacedResourceX. Observe que as chamadas para ID3D12GraphicsCommandList::RSSetMSAAParametersX ou ID3D12GraphicsCommandList1::SetSamplePositions devem incluir configurações completas de estado de MSAA. Observe também que as funções intrínsecas da linguagem de sombreador de alto nível (HLSL) para obter o número de amostras e as posições de amostra retornam posições de amostra incorretas quando essas APIs são usadas. Para obter mais informações, consulte os campos e comentários das seguintes estruturas e enumerações:

Desempenho e depuração

A ferramenta PIX tem vários testes específicos para o desempenho de MSAA. Para obter mais informações, consulte Dr. PIX. Há muitos contadores, começando com CB_PERF_SEL_CM_FC_TILE_VALID_READY, que fazem referência às operações de FMask e CMask. Para obter mais informações, consulte Tabela de contadores de hardware do PIX.

Consulte também

Decodificação de CMask
Última modificação em 6 de outubro de 2026