Sprawia, że ​​cała scena przechodzi w skalę szarości


20

Gdy gracz straci całe swoje życie, chcę, aby cały ekran gry był w odcieniach szarości, ale nie powinien natychmiast przerywać aktualizacji. Wolałbym też, aby zanikał niż w skali szarości, zamiast nagle stracić cały kolor. Wszystko, co do tej pory znalazłem, polega na zrobieniu zrzutu ekranu i zrobieniu go w skali szarości lub stworzeniu określonej tekstury w skali szarości. Czy istnieje sposób na zmianę całego pola gry i wszystkich obiektów w skali szarości bez powtarzania wszystkiego?

Odpowiedzi:


23

Najłatwiej to zrobić, tworząc dla niego moduł cieniujący (patrz kod poniżej). Narysuj wszystko do celu renderowania, a następnie użyj modułu cieniującego, aby narysować to w buforze tylnym

W swoim kodzie gry zapisz, kiedy gracz umiera, a następnie w kolejnych renderach interpoluj parametr modułu cieniującego między 1 (pełny kolor) a 0 (pełna skala szarości) zgodnie z
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();
    }
}

Powodem dla 0.3, 0.59 i 0.11 jest to, że ludzkie oko nie traktuje kolorów jednakowo, wartości te dają lepszy obraz w skali szarości.


Jakiś czas temu konwertowałem rgb na szary, ale nie mogłem znaleźć wiarygodnego źródła, więc właśnie użyłem 1.0 / 3,1.0 / 3,1.0 / 3 ... Czy możesz podać źródło stałych liczbowych 0.2,0.59,0.11?
Trevor Boyd Smith

Próbowałem znaleźć skąd mam kod, ale nie byłem w stanie go znaleźć. Oto strona Valve Developer, która używa różnych (ale nieco podobnych) wartości (0,222, 0,707, 0,071).
George Duckett,

1
Oto jedno odniesienie dla wartości, które obsługują liczby zaworów, ale zawierają oba. poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC9
Adam

1
Jest pytanie o współczynniki skali szarości w stackoverflow: stackoverflow.com/questions/5311774/…
Exilyth

mogę potwierdzić, że ten moduł cieniujący pracował dla mnie w XNA 4.0
Roboblob

0

EDYTOWAĆ

Po przemyśleniu tego, jeśli nie dodajesz odcienia, ale używając oryginalnych kolorów grafiki, możesz po prostu (jak zaznaczam poniżej) wszystkie kolory rysowanych obiektów ustawić na zadeklarowaną zmienną Color ustawioną na biały. (Color NoTint = Color.White;), a następnie Lerp, że jeśli gracz żyje, jest równy zero. Każdy obiekt narysowany kolorem NoTint będzie powoli zmieniał się (zgodnie ze współczynnikiem interpolacji wymienionym poniżej) na cokolwiek, do czego go wybierasz.

Jeśli jednak masz różne odcienie na różnych obiektach, poniższa pętla foreach może działać.

Zakończ edycję

Przy mojej ograniczonej wiedzy spróbowałbym tego: zadeklaruj kolory używane podczas rysowania określonych obiektów, np. Color catColor = Color.Brown, a następnie dodaj wszystkie kolory gier do listy.

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);
   }
}

Możesz to zrobić nawet w przypadku przedmiotów, które rysujesz bez odcienia i Lerp the Color.White to a Color.Gray. (nazwij to jak Kolor NoTint = Color.White i umieść to na wszystkich rysowanych obiektach)

Prawdopodobnie jest lepszy sposób, niezależnie od tego, mam nadzieję, że to pomoże!


1
-1 Spowoduje to wyblaknięcie całego ekranu do jednego jednolitego koloru, a nie zmianę skali szarości. Skala szarości mierzy kolor według jego jasności (kolor postrzega różne kolory jako mające różne jaskrawości), nie jest to tylko połowa odległości między kolorem a szarością (która wciąż ma kolor).
doppelgreener

Doskonały. Mam nadzieję, że ktoś inny uczy się z tego tak, jak ja. Dzięki!
AndrewAchilles,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.