Ajustar o brilho / contraste / gama de cena no DirectX?

votos
1

Em um aplicativo Direct3D cheio de objetos Sprite de D3DX, eu gostaria de ser capaz de globalmente ajustar o brilho eo contraste. O contraste é importante, se possível.

Eu vi esta pergunta aqui sobre OpenGL: Ajuste o brilho / gama de toda a cena em OpenGL

Mas isso não me dá o que eu precisaria em um contexto DirectX. Eu sei que isso é algo que eu provavelmente poderia fazer com um pixel shader, também, mas que parece ser tiro uma mosca com uma bazuca e eu se preocupar com compatibilidade com GPUs mais velhas que teriam de fazer qualquer shaders em software. Parece que isso deve ser possível, eu me lembro jogos ainda muito mais antigos como o original Half Life que têm configurações como este bem antes dos dias de shaders.

EDIT: Também, por favor note que este não é um aplicativo de tela cheia, de modo que este teria de ser algo que só iria afetar a um dispositivo Direct3D e que não é uma configuração global para o monitor geral.

Publicado 27/08/2009 em 02:22
fonte usuário
Em outras línguas...                            


6 respostas

votos
4

Um monte de jogos que aumentando o brilho por, literalmente, a aplicação de um poli tela cheia sobre a tela com aditivo de mistura. ou seja

SRCBLEND = ONE
DESTBLEND = ONE

e em seguida, aplicar uma textura com uma cor de (1, 1, 1, 1) irá aumentar o brilho (ish) de cada pixel por 1.

Para ajustar o contraste, então você precisa fazer semelhante, mas multiplicar por um fator constante. Isso exigirá configurações de mistura como se segue

SRCBLEND = DESTCOLOR
DESTBLEND = ZERO

Dessa forma, se você misturar um pixel com um valor de (2, 2, 2, 2), então você vai alterar o contraste.

Gamma é uma besta muito mais complicado e eu não estou ciente de uma maneira que você pode fingir gostar acima.

Nenhuma destas soluções é inteiramente precisa, mas eles vão te dar um resultado que parece "um pouco" corretas. É muito mais complicado fazer qualquer forma adequada, mas usando esses métodos você vai ver os efeitos que parecem incrivelmente semelhante a vários jogos anteriores, e isso é porque isso é exatamente o que estão fazendo;)

Respondeu 27/08/2009 em 22:05
fonte usuário

votos
2

Para um jogo que eu fiz em XNA, eu usei um pixel shader. Aqui está o código. [Disclaimer] Eu não sou inteiramente certo a lógica é certo e algumas configurações pode ter efeitos estranhos (!) [/ aviso]

float offsetBrightness = 0.0f;    //can be set from my C# code, [-1, 1]
float offsetContrast   = 0.0f;    //can be set from my C# code  [-1, 1]

sampler2D screen : register(s0);  //can be set from my C# code

float4 PSBrightnessContrast(float2 inCoord : TEXCOORD0) : COLOR0
{
    return (tex2D(screen, inCoord.xy) + offsetBrightness) * (1.0 + offsetContrast);
}

technique BrightnessContrast
{
    pass Pass1 { PixelShader = compile ps_2_0 PSBrightnessContrast(); }
}
Respondeu 28/08/2009 em 03:15
fonte usuário

votos
1

Basta usar um shader. Qualquer coisa que não, pelo menos, apoiar SM 2.0 é antiga neste momento.

Respondeu 27/08/2009 em 23:13
fonte usuário

votos
1

Outra abordagem é a editar todas as suas texturas. Ele seria basicamente a mesma abordagem que o mapa gama, exceto que você aplicar a rampa manualmente para os dados de pixel em cada um dos seus arquivos de imagem para gerar as texturas.

Respondeu 27/08/2009 em 23:12
fonte usuário

votos
1

Você não especificou qual versão do DirectX que você está usando, então eu vou assumir 9. Provavelmente, o melhor que você pode fazer é usar a funcionalidade gamma-ramp . Empurrando as rampa cima e para baixo aumenta ou diminui o brilho. Aumentando ou diminuindo o contraste altera gradiente.

Respondeu 27/08/2009 em 10:03
fonte usuário

votos
0

As respostas neste fórum pode ser de grande ajuda, como eu nunca tentei isso.

http://social.msdn.microsoft.com/Forums/en-US/windowsdirectshowdevelopment/thread/95df6912-1e44-471d-877f-5546be0eabf2

Respondeu 27/08/2009 em 02:30
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more