Зробити всю сцену зникає до сірого


20

Коли гравець втрачає все своє життя, я хочу, щоб весь ігровий екран пройшов сірий масштаб, але не переставав оновлюватись одразу. Я також вважаю за краще блякнути у відтінках сірого, а не раптово втрачати всі кольори. Все, що я знайшов до цього часу, - це або зробити знімок екрана, і зробити його масштабним відтінком сірого, або зробити певну текстуру сірого кольору текстури. Чи є спосіб змінити все ігрове поле та всі об'єкти в межах сірого, не повторюючи все?

Відповіді:


23

Найпростіший спосіб зробити це - створити для нього шейдер (див. Код нижче). Намалюйте все до цілі візуалізації, а потім використовуйте шейдер, щоб намалювати це до заднього буфера

У вашому ігровому коді записуйте, коли гравець помирає, то в наступних візуалізаціях інтерполюйте параметр шейдера між 1 (повнокольоровий) та 0 (повна сіра шкала) відповідно до
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();
    }
}

Причиною 0,3, 0,59 та 0,11 є те, що людське око не розглядає кольори однаково, ці значення надають кращому зображенню сірого кольору.


Нещодавно я перетворював rgb в сірий, але не міг знайти надійного джерела, тому я просто використав 1.0 / 3,1.0 / 3,1.0 / 3 ... Чи можете ви надати джерело для числових констант 0.2,0.59,0.11?
Тревор Бойд Сміт

Я намагався знайти, звідки я взяв код, але не зміг його знайти. Ось сторінка Valve Developer, яка використовує різні (але нечітко подібні) значення (0,222, 0,707, 0,071).
Джордж Дакетт

1
Ось одна посилання на значення, які підтримують номери Valve, але перераховує обидва. poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC9
Адам,

1
Там це питання про півтонові коефіцієнтах на StackOverflow: stackoverflow.com/questions/5311774 / ...
Exilyth

я можу підтвердити, що цей шейдер працював для мене в XNA 4.0
Roboblob

0

EDIT

Подумавши про це, якщо ви ні на що не наносите відтінок, але використовуючи оригінальні кольори графіки, ви могли б просто мати (як я констатую нижче) всі ваші кольори намальованих об'єктів, встановлених на оголошену зміну кольору, встановлену на білий. (Color NoTint = Color.White;), а потім Lerp, що якщо гравець живе, дорівнює нулю. Кожен об’єкт, намальований кольором NoTint, повільно змінюватиметься (відповідно до вашої швидкості інтерполяції, зазначеної нижче) до того, до чого ви його шукаєте.

Однак якщо у вас різні відтінки на різних об'єктах, нижній цикл передбачень може працювати.

Завершити редагування

З моїх обмежених знань, я б спробував це: оголосити кольори, які використовуєш для малювання конкретних об'єктів, напр. Color catColor = Color.Brown, а потім додайте до списку всі ваші кольори ігор.

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

Ви можете навіть зробити це для предметів, які ви малюєте, без відтінку, і Lerp the Color.White to Color.Gray. (назвіть, що щось на зразок Color NoTint = Color.White, і покладіть це на всі ваші намальовані об'єкти)

Мабуть, є кращий спосіб, незалежно від того, я сподіваюся, що це допоможе!


1
-1 Це блякло весь екран до одного суцільного кольору, а не перетворило б його в сірий колір. Відтінки сірого вимірюють колір за його яскравістю (коли колір сприймає різні кольори як такі, що мають різну яскравість), це не просто на півдорозі між кольором та сірим (який все ще має колір).
doppelgreener

Відмінно. Я сподіваюся, що хтось інший вчиться на цьому, як і я. Спасибі!
ЕндрюАхілл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.