Gamma (Direct3D 9)

O conteúdo da textura geralmente é armazenado no formato sRGB. Tradicionalmente, os pipelines de pixels assumiam que as cores eram lineares, de modo que as operações de combinação eram realizadas no espaço linear. No entanto, como o conteúdo sRGB usa a correção gama, as operações de combinação no espaço linear produzirão resultados incorretos. Agora, as placas de vídeo podem corrigir esse problema, desfazendo a correção gama quando leem qualquer conteúdo sRGB, e converter dados de pixel de volta para o formato sRGB ao gravar pixels. Nesse caso, todas as operações dentro do pipeline de pixels são executadas no espaço linear.

Correção de gama

O Direct3D 9 pode:

  • Indicar se uma textura usa a correção gama 2.2 ou não (sRGB ou não). O driver converterá em um gama linear para operações de combinação no tempo SetTexture, ou o amostrador vai convertê-lo em dados lineares no tempo de pesquisa.
  • Indicar se o pipeline de pixels deve usar a correção gama de volta para o espaço sRGB ao gravar no destino de renderização.

Presume-se que todas as outras cores (cor clara, cor do material, cor do vértice etc.) estejam no espaço linear. Os aplicativos podem fazer a correção gama das cores gravadas no buffer de quadro usando as instruções de sombreador de pixel. A linearização deve ser aplicada apenas aos canais RGB e não ao canal alfa.

Nem todos os formatos de superfície podem ser linearizados. Somente os formatos que passam CheckDeviceFormat com D3DUSAGE_QUERY_SRGBREAD podem ser linearizados. O estado da amostra D3DSAMP_SRGBTEXTURE é ignorado para o resto. Espera-se que apenas os formatos de textura não assinados ofereçam suporte a essa conversão. Os formatos de textura não assinados incluem apenas os componentes R, G, B e L. Se o canal alfa estiver presente, será ignorado. Se os formatos combinados aceitarem a linearização sRGB, somente os canais não assinados serão afetados. O hardware deve, de preferência, executar a linearização antes da filtragem; porém, no Direct3D 9, o hardware tem permissão para executar a linearização após a filtragem.

Nem todos os formatos de superfície podem ser gravados no espaço sRGB. Somente os formatos que passam o CheckDeviceFormat com o sinalizador de uso D3DUSAGE_QUERY_SRGBWRITE podem ser linearizados. O estado de renderização D3DRS_SRGBWRITEENABLE é ignorado para o restante. Espera-se que os formatos RGB não assinados de oito bits por canal exponham essa capacidade.

O hardware deve, de preferência, executar as operações de combinação de buffer de quadro no espaço linear, mas o hardware tem permissão para executá-las após o sombreador de pixel, mas antes da combinação de buffer de quadro. Isso significa que as operações de combinação de buffer de quadro que ocorrem no espaço sRGB produzirão resultados incorretos. D3DRS_SRGBWRITEENABLE é aceito ao executar uma limpeza do destino de renderização. Para hardware que oferece suporte a Multiple Render Targets (Direct3D 9) ou texturas de vários elementos (Direct3D 9), somente o primeiro destino de renderização ou elemento é gravado.

Alterações na API

// New sampler state (DWORD)
// If this is nonzero, the texture is linearized on lookup.
D3DSAMP_SRGBTEXTURE       // Default FALSE

// New render state (DWORD)
D3DRS_SRGBWRITEENABLE     // Default FALSE

// New usage flags
D3DUSAGE_QUERY_SRGBWRITE
D3DUSAGE_QUERY_SRGBREAD

Cadeias de troca de janela

É importante para os aplicativos manter os buffers de fundo de suas cadeias de troca no espaço linear para permitir operações de combinação corretas. Como a área de trabalho normalmente não está no espaço linear, uma correção gama é necessária para que o conteúdo do buffer de fundo possa ser apresentado. O aplicativo pode afetar essa correção alocando um buffer adicional e executando sua própria cópia de correção do buffer linear para o buffer de fundo. Isso requer uma cópia extra que pode ser evitada caso o driver execute a correção gama como parte da transferência de bits de apresentação.

No Direct3D 9, um novo sinalizador, D3DPRESENT_LINEAR_CONTENT, está disponível para Present que permite que a apresentação converta implicitamente o espaço linear em sRGB/gama 2.2. Os aplicativos devem especificar esse sinalizador caso o formato de buffer de fundo seja o ponto flutuante de 16 bits para corresponder o modo de janela presente ao comportamento gama de tela inteira, desde que D3DCAPS3_LINEAR_TO_SRGB_PRESENTATION seja retornado para recursos de dispositivos recuperados por meio de GetDeviceCaps.

Buffer de quadro