Far svanire l'intera scala in scala di grigi


20

Quando il giocatore perde tutta la vita, voglio che l'intera schermata di gioco diventi in scala di grigi, ma non smetta di aggiornarsi immediatamente. Preferirei anche che sbiadisca in scala di grigi invece di perdere improvvisamente tutto il colore. Tutto quello che ho trovato finora è o di fare uno screenshot e renderlo in scala di grigi, o fare una scala di grigi specifica. C'è un modo per cambiare l'intero campo di gioco e tutti gli oggetti all'interno in scala di grigi senza scorrere tutto?

Risposte:


23

Il modo più semplice per farlo è quello di creare uno shader per esso (vedi codice sotto). Disegna tutto su un target di rendering, quindi usa lo shader per disegnarlo sul back buffer

Nel tuo record di codice di gioco quando il giocatore muore, nei successivi rendering interpolare un parametro shader tra 1 (colore pieno) e 0 (scala di grigi completa) in base a
CurrentTime-DeadTime / FadeTime

float ColourAmount;
Texture coloredTexture;

sampler coloredTextureSampler = sampler_state
{
    texture = <coloredTexture>;
};

float4 GreyscalePixelShaderFunction(float2 textureCoordinate : TEXCOORD0) : COLOR0
{
    float4 color = tex2D(coloredTextureSampler, textureCoordinate); 
    float3 colrgb = color.rgb;
    float greycolor = dot(colrgb, float3(0.3, 0.59, 0.11));

    colrgb.rgb = lerp(dot(greycolor, float3(0.3, 0.59, 0.11)), colrgb, ColourAmount);

    return float4(colrgb.rgb, color.a);
}

technique Grayscale
{
    pass GreyscalePass
    {
        PixelShader = compile ps_2_0 GreyscalePixelShaderFunction();
    }
}

Il motivo di 0,3, 0,59 e 0,11 è perché l'occhio umano non tratta i colori allo stesso modo, quei valori danno una migliore immagine in scala di grigi.


Qualche tempo fa stavo convertendo rgb in grigio ma non riuscivo a trovare una fonte affidabile, quindi ho appena usato 1.0 / 3.1.0 / 3,1.0 / 3 ... Potete fornire una fonte per le costanti numeriche 0.2,0.59,0.11?
Trevor Boyd Smith,

Ho cercato di trovare da dove ho preso il codice, ma non sono riuscito a trovarlo. Ecco una pagina sviluppatore di valvole che utilizza valori diversi (ma vagamente simili) (0,222, 0,707, 0,071).
George Duckett,

1
Ecco un riferimento per i valori che supportano i numeri delle valvole ma li elenca entrambi. poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC9
Adam

1
C'è una domanda circa i coefficienti di scala di grigi su StackOverflow: stackoverflow.com/questions/5311774/...
Exilyth

posso confermare che questo shader ha funzionato per me in XNA 4.0
Roboblob,

0

MODIFICARE

Dopo averci pensato, se non stai mettendo una tinta su qualcosa, ma usando i colori originali della grafica potresti semplicemente avere (come ho indicato in basso) tutti i tuoi colori degli oggetti disegnati impostati su una variabile Colore dichiarata impostata su bianco. (Color NoTint = Color.White;) e poi Lerp che se il giocatore vive è uguale a zero. Ogni oggetto disegnato con il colore NoTint cambierà lentamente (in base al tasso di interpolazione di seguito indicato) in qualunque cosa tu stia eseguendo.

Tuttavia, se hai tinte diverse su oggetti diversi, il ciclo foreach di seguito potrebbe funzionare.

Fine modifica

A mia conoscenza limitata, proverei questo: dichiarare i colori che usi quando disegni oggetti specifici, ad es. Color catColor = Color.Brown, quindi aggiungi tutti i colori dei tuoi giochi a un elenco.

public static Color catColor = Color.Brown;
List<Color> colorList = new List<Color>(){ catColor }; // and other colors
float interpolation = 0f;
float interpolationRate = .01f;
.
.
.
if(playerLives == 0) 
{
   interpolation += interpolationRate;
   if (interpolation >= 1)
      {interpolation = 1;}

   foreach(Color c in colorList)
   {
      Color.Lerp(c, Color.Gray, interpolation);
   }
}

Puoi anche farlo per gli oggetti che disegni senza tinta e Lerp the Color.White to a Color.Gray. (dai un nome a qualcosa come Color NoTint = Color.White e mettilo su tutti i tuoi oggetti disegnati)

Probabilmente c'è un modo migliore, a prescindere, spero che questo aiuti!


1
-1 Ciò sbiadirebbe l'intero schermo a un colore uniforme, non trasformandolo in scala di grigi. La scala di grigi misura un colore in base alla sua luminosità (con il colore che percepisce colori diversi come con diverse luminosità), non è solo a metà strada tra un colore e il grigio (che ha ancora colore).
doppelgreener,

Eccellente. Spero che qualcun altro impari da questo come ho fatto io. Grazie!
Andrew Achille
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.