Compartilhar via


Controles gama (Direct3D 9)

Os controles gama permitem que você altere a forma como o sistema exibe o conteúdo da superfície, sem afetar o conteúdo da própria superfície. Pense nesses controles como filtros muito simples que o Direct3D aplica aos dados, pois ele sai de uma superfície e antes de ser renderizado na tela.

Os controles gama são uma propriedade de uma cadeia de troca. Os controles gama possibilitam alterar dinamicamente como os níveis vermelho, verde e azul de uma superfície são mapeados para os níveis reais exibidos pelo sistema. Ao definir níveis gama, você pode fazer com que a tela do usuário flash cores - vermelho quando o caractere do usuário é filmado, verde quando o caractere pega um novo item e assim por diante - sem copiar novas imagens para o buffer de quadros para obter o efeito. Ou você pode ajustar os níveis de cor para aplicar um desvio de cor às imagens no buffer de fundo.

Há sempre pelo menos uma cadeia de troca (a cadeia de troca implícita) para cada dispositivo porque o Direct3D 9 tem uma cadeia de troca como propriedade do dispositivo. Como a rampa gama é uma propriedade da cadeia de troca, a rampa gama pode ser aplicada quando a cadeia de troca é janelada. A rampa gama entra em vigor imediatamente. Não há espera por uma operação de sincronização vertical.

Os métodos SetGammaRamp e GetGammaRamp permitem manipular níveis de rampa que afetam os componentes de cores vermelho, verde e azul de pixels da superfície antes de serem enviados para o CONVERSor digital para analógico (DAC) para exibição.

Níveis de rampa gama

No Direct3D, o termo rampa gama descreve um conjunto de valores que mapeiam o nível de um componente de cor específico - vermelho, verde, azul - para todos os pixels no buffer de quadros para novos níveis recebidos pelo DAC para exibição. O remapeamento é executado por meio de três tabelas de pesquisa, uma para cada componente de cor.

Veja como funciona: o Direct3D usa um pixel do buffer de quadros e avalia seus componentes de cor vermelho, verde e azul individuais. Cada componente é representado por um valor de 0 a 65535. O Direct3D usa o valor original e o usa para indexar uma matriz de 256 elementos (a rampa), em que cada elemento contém um valor que substitui o original. O Direct3D executa esse processo de pesquisa e substituição para cada componente de cor de cada pixel no buffer de quadros, alterando assim as cores finais para todos os pixels na tela.

É útil visualizar os valores de rampa grafando-os, conforme mostrado nos dois gráficos a seguir. O grafo à esquerda mostra uma rampa que não modifica as cores. O grafo correto mostra uma rampa que impõe um desvio negativo ao componente de cor ao qual ele é aplicado.

grafos dos valores de rampa gama

Os elementos de matriz para o grafo à esquerda contêm valores idênticos ao índice – 0 no elemento no índice 0 e 65535 no índice 255. Esse tipo de rampa é o padrão, pois não altera os valores de entrada antes de serem exibidos. O grafo correto fornece mais variação; sua rampa contém valores que variam de 0 no primeiro elemento a 32768 no último elemento, com valores que variam uniformemente entre eles. O efeito é que o componente de cor que usa essa rampa aparece mudo na tela. Você não está limitado ao uso de grafos lineares; se o aplicativo puder atribuir mapeamento arbitrário, se necessário. Você pode até mesmo definir as entradas para todos os zeros para remover um componente de cor completamente da exibição.

Configurando e recuperando níveis de rampa gama

Os níveis de rampa gama são tabelas de pesquisa efetivamente usadas pelo Direct3D para mapear os componentes de cor do buffer de quadros para novos níveis que serão exibidos. Você pode definir e recuperar níveis de rampa para a superfície primária chamando os métodos SetGammaRamp e GetGammaRamp . SetGammaRamp aceita dois parâmetros e GetGammaRamp aceita um parâmetro. Para SetGammaRamp, o primeiro parâmetro é D3DSGR_CALIBRATE ou D3DSGR_NO_CALIBRATION. O segundo parâmetro, pRamp, é um ponteiro para uma estrutura D3DGAMMARAMP . A estrutura D3DGAMMARAMP contém três matrizes de 256 elementos de WORDs, uma matriz cada para conter as rampas gama vermelhas, verdes e azuis. GetGammaRamp tem um parâmetro que leva um ponteiro para um tipo D3DGAMMARAMP que será preenchido com a rampa gama atual.

Você pode incluir o valor D3DSGR_CALIBRATE para o primeiro parâmetro de SetGammaRamp para invocar o calibrador ao definir novos níveis gama. A calibragem de rampas gama incorre em alguma sobrecarga de processamento e não deve ser usada com frequência. Definir uma rampa gama calibrada fornece um valor gama consistente e absoluto para o usuário, independentemente do adaptador de vídeo e do monitor.

Nem todos os sistemas dão suporte à calibragem gama. Para determinar se há suporte para calibragem gama, chame GetDeviceCaps e examine o membro Caps2 da estrutura D3DCAPS9 associada após o retorno do método. Se o sinalizador de funcionalidade D3DCAPS2_CANCALIBRATEGAMMA estiver presente, a calibragem gama terá suporte.

Ao definir novos níveis de rampa, tenha em mente que os níveis definidos nas matrizes só são usados quando o aplicativo está em modo exclusivo e em tela inteira. Sempre que o aplicativo muda para o modo normal, os níveis de rampa são reservados, tendo efeito novamente quando o aplicativo restabelece o modo de tela inteira.

Se o dispositivo não der suporte a rampas gama no modo de apresentação atual da cadeia de troca (tela inteira ou janelas), nenhum valor de erro será retornado. Os aplicativos podem marcar os bits de funcionalidade D3DCAPS2_FULLSCREENGAMMA e D3DCAPS2_CANCALIBRATEGAMMA no membro Caps2 do tipo D3DCAPS9 para determinar os recursos do dispositivo e se um calibrador está instalado.

Superfícies Direct3D