Заставить всю сцену перейти в оттенки серого

20

Когда игрок теряет всю свою жизнь, я хочу, чтобы весь экран игры становился серым, но не прекращал обновление немедленно. Я также предпочел бы, чтобы он постепенно исчезал в оттенках серого, а не внезапно терял весь цвет. Все, что я нашел до сих пор, - это либо сделать снимок экрана и сделать его в оттенках серого, либо сделать специальную текстуру в оттенках серого. Есть ли способ изменить все игровое поле и все объекты в оттенках серого, не просматривая все?

Fibericon
источник

Ответы:

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, в которой используются разные (но примерно одинаковые) значения (0,222, 0,707, 0,071).
Джордж Дакетт
1
Вот одна ссылка для значений, которая поддерживает номера клапанов, но перечисляет оба. poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC9
Адам
1
Есть вопрос о коэффициентах
серой шкалы
я могу подтвердить, что этот шейдер работал для меня в XNA 4.0
Roboblob
0

РЕДАКТИРОВАТЬ

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

Однако, если у вас разные оттенки на разных объектах, цикл foreach может сработать.

Конец Править

В моих ограниченных знаниях я бы попробовал это: Объявите цвета, которые вы используете при рисовании конкретных объектов, напр. 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 Color.White к Color.Gray. (назовите это что-то вроде Color NoTint = Color.White и поместите это на все ваши нарисованные объекты)

Вероятно, есть лучший способ, но я надеюсь, что это поможет!

AndrewAchilles
источник
1
-1 Это сделает весь экран одним сплошным цветом, а не станет серым. Оттенки серого измеряют цвет по его яркости (цвет воспринимает разные цвета как имеющие разные яркости), он не просто на полпути между цветом и серым (который все еще имеет цвет).
doppelgreener
Превосходно. Я надеюсь, что кто-то еще учится на этом, как я. Благодарность!
AndrewAchilles