Compartilhar via


Convertendo dados para o espaço de cores

Para compor na tela ou executar operações de ponto flutuante, você precisa trabalhar no espaço de cores correto. Recomendamos que você execute operações de ponto flutuante em um espaço de cores linear. Em seguida, para apresentar suas imagens na tela, converta os dados em dados RGB padrão (sRGB, gama 2.2-corrigido) espaço de cores. Apresentar para a tela no espaço de cores sRGB é importante para a precisão da cor. Se as imagens não forem corrigidas pela gama 2.2, elas alocam muitos bits ou muita largura de banda para destaques que as pessoas não podem diferenciar, e poucos bits ou largura de banda para valores de sombra aos quais as pessoas são sensíveis e, portanto, exigiriam mais bits ou largura de banda para manter a mesma qualidade visual. Portanto, para garantir a melhor precisão de cor, apresente imagens na tela que são corrigidas pela gama 2.2.

Estritamente falando, a função de transferência sRGB real é uma fórmula fragmentada (segmento linear + 2.4 potência), que é ligeiramente diferente de uma gama de potência bruta de 2.2. Mas, para simplificar, vamos usá-los alternadamente.

Precisão de cor

Para apresentação, os formatos de exibição com valor inteiro (como DXGI_FORMAT_B8G8R8A8_UNORM_SRGB, DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM e assim por diante) sempre contêm dados corrigidos por gama sRGB. Os formatos de exibição com valor flutuante (atualmente apenas DXGI_FORMAT_R16G16B16A16_FLOAT) contêm dados com valor linear.

O modificador de formato _SRGB indica ao sistema operacional para ajudar o aplicativo a colocar dados sRGB na tela. O aplicativo sempre deve colocar dados sRGB em buffers traseiros com formatos com valor inteiro para apresentar os dados sRGB à tela, mesmo que os dados não tenham esse modificador de formato em seu nome de formato. Para obter uma lista completa de formatos de digitalização de exibição:

Ao gravar valores de saída de ponto flutuante do sombreador de pixel em modos de exibição de destino de renderização (RenderTargetViews) com o modificador de formato _SRGB que estão vinculados ao pipeline, você os converte em espaço de cores corrigido por gama 2.2. Da mesma forma, quando as exibições de recurso de sombreador (ShaderResourceViews) com o modificador de formato _SRGB são vinculadas ao pipeline, você converte os valores do espaço de cores corrigido pela gama 2.2 em espaço de cores linear ao lê-los do ShaderResourceViews. O sombreador pode então executar operações neles.

Por exemplo, use código semelhante a este para gravar valores de saída de ponto flutuante de um sombreador em um formato RenderTargetView :

struct PSOut
{
    float4 color : SV_Target;
};

PSOut S( PSIn input )
{
    PSOut output;
    output.color = float4( 1.0, 0.0, 0.0, 1.0 );
    return output;
}

Quando a rotina 'S' retorna, os valores de ponto flutuante (1, 0, 0, 1) são convertidos para o formato RenderTargetView . Em seguida, se você atribuir o modificador de formato _SRGB para o RenderTargetView, a conversão gama ocorre.

Estas são etapas a serem seguidas para garantir que o conteúdo exibido na tela tenha a melhor precisão de cor.

Para garantir a precisão da cor no pipeline

  1. Se uma textura tiver conteúdo sRGB, verifique se ShaderResourceView tem o modificador de formato _SRGB para que, ao ler o ShaderResourceView no sombreador, você converta o conteúdo da textura do espaço de cores corrigido pela gama 2.2 em espaço de cores linear.
  2. Verifique se o RenderTargetView também tem o modificador de formato _SRGB para que os valores de saída do sombreador sejam convertidos em gama.

Se você seguir as etapas anteriores, ao chamar o método IDXGISwapChain1::P resent1 , o conteúdo exibido na tela terá a melhor precisão de cor.

Você pode usar o método ID3D11Device::CreateRenderTargetView para criar exibições DXGI_FORMAT_*_SRGB em buffers traseiros de uma cadeia de permuta que você cria somente com um formato DXGI_FORMAT_*_UNORM . Essa é uma exceção especial à regra para criar exibições de destino de renderização, que afirma que você pode usar um formato diferente com ID3D11Device::CreateRenderTargetView somente se tiver criado o recurso que deseja exibir com DXGI_FORMAT_*_TYPELESS.

Para saber mais sobre regras para converter dados, veja Regras de conversão de dados.

Para obter informações sobre como ler e gravar simultaneamente em uma textura, consulte Descompactando e empacotando DXGI_FORMAT para edição de imagem in-loco.

Aprimorando a apresentação com o modelo flip, retângulos sujos e áreas roladas