Membuat seluruh adegan memudar menjadi abu-abu

20

Ketika pemain kehilangan seluruh hidup mereka, saya ingin seluruh layar permainan menjadi abu-abu, tetapi tidak berhenti memperbarui segera. Saya juga lebih suka memudar menjadi abu-abu daripada tiba-tiba kehilangan semua warna. Semua yang saya temukan sejauh ini adalah tentang mengambil tangkapan layar dan membuatnya skala abu-abu, atau membuat skala abu-abu tekstur tertentu. Apakah ada cara untuk mengubah seluruh lapangan bermain dan semua objek di dalam menjadi skala abu-abu tanpa mengulangi semuanya?

Fibericon
sumber

Jawaban:

23

Cara termudah untuk melakukan ini adalah membuat shader untuknya (Lihat kode di bawah). Gambar semuanya ke target render, lalu gunakan shader untuk menggambar itu ke buffer belakang Anda

Dalam catatan kode permainan Anda saat pemain meninggal, maka dalam render berikutnya, sisipkan parameter shader antara 1 (warna penuh) dan 0 (skala abu-abu penuh) sesuai dengan
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();
    }
}

Alasan untuk 0,3, 0,59 dan 0,11 adalah karena mata manusia tidak memperlakukan warna secara sama, nilai-nilai tersebut memberikan citra skala abu-abu yang lebih baik.

George Duckett
sumber
Beberapa waktu yang lalu saya mengubah rgb menjadi abu-abu tetapi tidak dapat menemukan sumber yang dapat dipercaya, jadi saya hanya menggunakan 1.0 / 3,1.0 / 3,1.0 / 3 ... Dapatkah Anda memberikan sumber untuk konstanta numerik 0.2.0.59.0.11?
Trevor Boyd Smith
Saya telah berusaha mencari dari mana saya mendapatkan kode itu, tetapi belum dapat menemukannya. Berikut adalah halaman Pengembang Katup yang menggunakan nilai yang berbeda (tetapi hampir serupa) (0,222, 0,707, 0,071).
George Duckett
1
Berikut ini satu referensi untuk nilai-nilai yang mendukung nomor-nomor Valve tetapi mencantumkan keduanya. poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC9
Adam
1
Ada pertanyaan tentang koefisien skala abu-abu di stackoverflow: stackoverflow.com/questions/5311774/…
Exilyth
saya dapat mengonfirmasi shader ini berfungsi untuk saya di XNA 4.0
Roboblob
0

EDIT

Setelah memikirkannya, jika Anda tidak memberi warna pada apa pun, tetapi menggunakan warna orisinal grafis yang bisa Anda miliki (seperti yang saya sebutkan di bawah) semua warna objek yang diambil diatur ke variabel Warna yang dideklarasikan diatur ke putih. (Color NoTint = Color.White;) lalu Lerp bahwa jika hidup pemain sama dengan nol. Setiap objek yang digambar dengan Warna NoTint perlahan akan berubah (sesuai dengan tingkat interpolasi Anda yang disebutkan di bawah) menjadi apa pun yang Anda inginkan.

Namun jika Anda memiliki warna yang berbeda pada objek yang berbeda, loop foreach di bawah ini mungkin berfungsi.

Akhiri Edit

Dalam pengetahuan saya yang terbatas, saya akan mencoba ini: Nyatakan warna yang Anda gunakan saat menggambar objek tertentu, mis. Color catColor = Color.Brown, lalu tambahkan semua warna gim Anda ke daftar.

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

Anda bahkan dapat melakukan ini untuk item yang Anda gambar tanpa warna dan Lerp the Color. Putih ke Color.Gray. (beri nama sesuatu seperti Color NoTint = Color.White, dan letakkan di semua objek yang Anda gambar)

Mungkin ada cara yang lebih baik, terlepas dari saya harap ini membantu!

AndrewAchilles
sumber
1
-1 Ini akan memudar seluruh layar menjadi satu warna solid, bukan mengubahnya menjadi abu-abu. Skala abu-abu mengukur warna dengan kecerahannya (dengan warna yang merasakan warna berbeda memiliki kecerahan berbeda), ia bukan hanya setengah antara warna dan abu-abu (yang masih memiliki warna).
doppelgreener
Luar biasa. Saya harap orang lain belajar dari ini seperti yang saya lakukan. Terima kasih!
AndrewAchilles