> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Compressão de cor e profundidade

> Compressão de cor e profundidade

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](#ID4EY)
* [Terminologia para compressão de cor](#ID4ELB)
* [O bloco de cor](#ID4ECE)
* [Compressão de cor](#ID4EMF)
* [Esquema de compressão de cor](#ID4EVF)
* [Antialiasing de qualidade aprimorada (EQAA)](#ID4EJG)
* [Compatibilidade de recursos](#ID4EUG)
* [APIs para compressão de cor](#ID4E5G)
* [Desempenho e depuração](#ID4ESBAC)

<a id="ID4EY" />

## 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. <img src="https://mintcdn.com/microsoft-4404708b/6hkHc7s12mHcTMCE/images/gdk/features/graphics/logical_graphics_pipeline.png?fit=max&auto=format&n=6hkHc7s12mHcTMCE&q=85&s=2f67ad622842ab04b29990e77b7573cb" alt="Pipeline gráfico lógico" width="561" height="528" data-path="images/gdk/features/graphics/logical_graphics_pipeline.png" />

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](/pt-BR/build/core-features/graphics/directx/native-resource-management).

<a id="ID4ELB" />

## Terminologia para compressão de cor

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

| Termo | Descrição |
| - | - |
| CMask | Dados para compressão de cor em nível de bloco (tile). |
| FMask | Dados para compressão de cor em nível de quad. |
| Quad | Um grupo de 2 × 2 pixels. |
| Tile | Um grupo de 8 × 8 pixels, ou um grupo de 4 × 4 quads. |
| Fragment | Uma amostra de um pixel comprimido. |
| Resolve | Produz uma superfície de amostra única a partir de uma superfície de várias amostras usando um filtro de caixa alinhado a pixels. |
| MRT | Vários destinos de renderização. Várias superfícies que podem ser renderizadas em um único estado. Às vezes, elas são sobrecarregadas para funções especiais (por exemplo, resolve e mesclagem de origem dupla). Espera-se que o desempenho caia linearmente com o número de MRTs, embora haja muitos fatores que podem tornar o desempenho pior do que linear. Esses fatores limitantes de desempenho incluem a eficiência de largura de banda do controlador de memória e a redução da capacidade do cache de aproveitar a localidade espacial, já que o tamanho do cache em pixels diminui linearmente com o número de MRTs. |
| ROP | Operação raster. Uma operação lógica bit a bit executada na cor de origem, na cor de destino e em um campo definido pelo usuário. Uma ROP é uma operação bit a bit que usa a cor de origem e de destino para alterar a cor gravada na memória. A ROP3 padrão é uma função do destino, da origem e de um pincel. O destino é o conteúdo do destino de renderização em forma formatada. A origem é a cor de saída do sombreador formatada quando não há mesclagem, ou a saída formatada do mesclador quando há mesclagem. No bloco de cor, o pincel é idêntico à origem. |
| MSAA | Antialiasing de várias amostras. Uma técnica para reduzir o aliasing de geometria armazenando mais informações de profundidade do que o necessário para a renderização. Sem compressão, há um valor de cor de fragmento exclusivo por amostra. |
| EQAA | Antialiasing de qualidade aprimorada. Uma versão do MSAA que utiliza menos fragmentos armazenados do que posições de amostra, potencialmente gerando imagens de maior qualidade para um determinado volume de memória. |

<a id="ID4ECE" />

## 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*.

```cpp theme={null}
NewDestinationColor = CombinationFunction(BFS*CS, BFD*CD)  
```

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.

<a id="ID4EMF" />

## 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.

<a id="ID4EVF" />

## 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. <img src="https://mintcdn.com/microsoft-4404708b/EHFikhsC0GyEu9Ca/images/gdk/features/graphics/fmask_sample.png?fit=max&auto=format&n=EHFikhsC0GyEu9Ca&q=85&s=5fa4dc5da634d854be7134c0e6be4246" alt="Três cores exclusivas ocupando o espaço de oito" width="200" height="200" data-path="images/gdk/features/graphics/fmask_sample.png" />

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. <img src="https://mintcdn.com/microsoft-4404708b/EHFikhsC0GyEu9Ca/images/gdk/features/graphics/fmask_pointers.png?fit=max&auto=format&n=EHFikhsC0GyEu9Ca&q=85&s=340dd298656ad179146ce148de87a27d" alt="Memória FMask e memória de cor" width="368" height="262" data-path="images/gdk/features/graphics/fmask_pointers.png" />

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. <img src="https://mintcdn.com/microsoft-4404708b/EHFikhsC0GyEu9Ca/images/gdk/features/graphics/cmask_bitplanes.png?fit=max&auto=format&n=EHFikhsC0GyEu9Ca&q=85&s=3e0f07a3514b6739e2abfce0f099c5d3" alt="Planos de bits da CMask" width="478" height="109" data-path="images/gdk/features/graphics/cmask_bitplanes.png" />

<a id="ID4EJG" />

## 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.

<a id="ID4EUG" />

## Compatibilidade de recursos

A tabela a seguir mostra as combinações de operações permitidas no bloco de cor. <img src="https://mintcdn.com/microsoft-4404708b/EHFikhsC0GyEu9Ca/images/gdk/features/graphics/cb_features.png?fit=max&auto=format&n=EHFikhsC0GyEu9Ca&q=85&s=dd2ec170803d2c0dd0960e87d345173e" alt="Combinações de operações permitidas no bloco de cor" width="344" height="168" data-path="images/gdk/features/graphics/cb_features.png" />

<a id="ID4E5G" />

## 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](/pt-BR/reference/graphics/d3d12_x/interfaces/id3d12device/methods/id3d12device_createcomponentplacedresourcex).

Observe que as chamadas para [ID3D12GraphicsCommandList::RSSetMSAAParametersX](/pt-BR/reference/graphics/d3d12_x/interfaces/id3d12graphicscommandlist/methods/id3d12graphicscommandlist_rssetmsaaparametersx) ou [ID3D12GraphicsCommandList1::SetSamplePositions](https://learn.microsoft.com/windows/desktop/api/d3d12/nf-d3d12-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:

* [D3D12XBOX\_MSAA\_SAMPLE\_LOCATIONS](/pt-BR/reference/graphics/d3d12_x/structs/d3d12xbox_msaa_sample_locations)
* [D3D12XBOX\_MSAA\_CENTROID\_PRIORITIES](/pt-BR/reference/graphics/d3d12_x/structs/d3d12xbox_msaa_centroid_priorities)
* [D3D12XBOX\_MSAA\_PARAMETERS](/pt-BR/reference/graphics/d3d12_x/structs/d3d12xbox_msaa_parameters)

<a id="ID4ESBAC" />

## 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](/pt-BR/tools/tools-console/pix/gpu/pix-drpix).

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](/pt-BR/tools/tools-console/pix/gpu/pix-table-of-hardware-counters).

<a id="ID4EDCAC" />

## Consulte também

[Decodificação de CMask](/pt-BR/build/core-features/graphics/overviews/cmask-decoding)


## Related topics

- [OMSetDepthBounds](/pt-BR/reference/graphics/d3d12/interfaces/id3d12graphicscommandlist1/methods/id3d12graphicscommandlist1_omsetdepthbounds_public.md)
- [D3D12_DEPTH_STENCIL_DESC1](/pt-BR/reference/graphics/d3d12/structs/d3d12_depth_stencil_desc1_public.md)
- [D3D12_DEPTH_STENCIL_DESC](/pt-BR/reference/graphics/d3d12/structs/d3d12_depth_stencil_desc_public.md)
- [Visão geral do SHAPE](/pt-BR/build/console-features/audio/overviews/shape-overview.md)
- [D3D12_DEPTH_WRITE_MASK](/pt-BR/reference/graphics/d3d12/enums/d3d12_depth_write_mask_public.md)
