Partilhar via


Controles gama (Direct3D 9)

Os controlos gama permitem-lhe alterar a forma como o sistema apresenta 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 à medida que saem de uma superfície e antes de serem renderizados na tela.

Os controles gama são uma propriedade de uma cadeia de permuta. Os controles gama permitem alterar dinamicamente como os níveis vermelho, verde e azul de uma superfície são mapeados para os níveis reais que o sistema exibe. Ao definir níveis gama, você pode fazer com que a tela do usuário pisce cores - vermelho quando o personagem do usuário é disparado, verde quando o personagem 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 viés de cor às imagens no buffer traseiro.

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

O SetGammaRamp e métodos de GetGammaRamp permitem manipular os níveis de rampa que afetam os componentes de cor vermelho, verde e azul dos pixels da superfície antes de serem enviados para o conversor digital-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 é realizado por meio de três tabelas de pesquisa, uma para cada componente de cor.

Funciona assim: o Direct3D tira um pixel do buffer de quadros e avalia seus componentes individuais de cores vermelha, verde e azul. Cada componente é representado por um valor de 0 a 65535. O Direct3D pega o valor original e o usa para indexar uma matriz de 256 elementos (a rampa), onde 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 de todos os pixels na tela.

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

gráficos dos valores de rampa gama

Os elementos da matriz para o gráfico à esquerda contêm valores idênticos ao seu í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 que eles sejam exibidos. O gráfico à direita fornece mais variação; sua rampa contém valores que variam de 0 no primeiro elemento a 32768 no último elemento, com valores variando uniformemente entre eles. O efeito é que o componente de cor que usa essa rampa aparece silenciado na tela. Você não está limitado a usar gráficos lineares; se o seu aplicativo puder atribuir mapeamento arbitrário, se necessário. Você pode até mesmo definir as entradas para todos os zeros para remover completamente um componente de cor da tela.

Definindo e recuperando níveis de rampa gama

Os níveis de rampa gama são efetivamente tabelas de pesquisa que o Direct3D usa 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 o SetGammaRamp e GetGammaRamp métodos. 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 vermelha, verde e azul. GetGammaRamp tem um parâmetro que leva um ponteiro para um tipo de 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 de gama. A calibração de rampas gama incorre em alguma sobrecarga de processamento e não deve ser usada com frequência. A definição de uma rampa gama calibrada fornece um valor de gama consistente e absoluto para o utilizador, independentemente da placa gráfica e do monitor.

Nem todos os sistemas suportam calibração gama. Para determinar se a calibração gama é suportada, chame GetDeviceCapse examine o membro Caps2 da estrutura de D3DCAPS9 associada após o retorno do método. Se o sinalizador de capacidade D3DCAPS2_CANCALIBRATEGAMMA estiver presente, a calibração gama será suportada.

Ao definir novos níveis de rampa, lembre-se de que os níveis definidos nas matrizes só são usados quando seu aplicativo está no modo exclusivo de tela cheia. Sempre que o aplicativo muda para o modo normal, os níveis de rampa são deixados de lado, entrando em vigor novamente quando o aplicativo restabelece o modo de tela cheia.

Se o dispositivo não suportar rampas gama no modo de apresentação atual da cadeia de permuta (tela cheia ou janela), nenhum valor de erro será retornado. Os aplicativos podem verificar os bits de capacidade D3DCAPS2_FULLSCREENGAMMA e D3DCAPS2_CANCALIBRATEGAMMA no membro Caps2 do tipo D3DCAPS9 para determinar as capacidades do dispositivo e se um calibrador está instalado.

de superfícies Direct3D