Sahneyi tamamen gri tonlamalı yapmak


20

Oyuncu hayatlarının tamamını kaybederse, tüm oyun ekranının gri tonlamalı olmasını istiyorum, ancak hemen güncellemeyi bırakmam. Ayrıca aniden tüm rengini kaybetmek yerine gri tonlamaya gitmesini tercih ederim. Şimdiye kadar bulduğum her şey bir ekran görüntüsünü almak ve gri tonlamalı yapmak veya belirli bir doku gri tonlamalı yapmak ile ilgili. Tüm oyun alanını ve içindeki tüm nesneleri gri tonlamaya dönüştürmenin bir yolu var mı?

Yanıtlar:


23

Bunu yapmanın en kolay yolu, bunun için bir gölgelendirici oluşturmaktır (Aşağıdaki koda bakın). Her şeyi bir oluşturma hedefine çizin, ardından arka tamponunuza çizmek için gölgelendiriciyi kullanın

Oyun kodunuzda, oyuncu öldüğü zaman, daha sonraki renderlarda, göre 1 (tam renkli) ile 0 (tam gri skala) arasında bir gölgelendirici parametresi enterpolasyon yapar.
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 ve 0.11'in nedeni, insan gözünün renkleri eşit şekilde işlememesi, bu değerlerin daha iyi gri tonlamalı bir görüntü vermesidir.


Bir süre önce rgb'yi griye dönüştürüyordum ama güvenilir bir kaynak bulamadım, bu yüzden sadece 1.0 / 3,1.0 / 3,1.0 / 3 kullandım ... Sayısal sabitler için bir kaynak sağlayabilir misiniz 0.2.0.59.0.11?
Trevor Boyd Smith

Kodu nereden aldığımı bulmaya çalıştım, ancak bulamadım. Farklı (ancak belli belirsiz) değerleri kullanan bir Vana Geliştirici sayfası (0.222, 0.707, 0.071).
George Duckett

1
Valf numaralarını destekleyen, ancak her ikisini de listeleyen değerlere bir referans. poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC9
Adam

1
Stackoverflow'taki gri tonlama katsayıları hakkında bir soru var: stackoverflow.com/questions/5311774/…
Exilyth

Bu gölgelendiricinin benim için XNA 4.0'da çalıştığını onaylayabilirim
Roboblob

0

DÜZENLE

Bunu düşündükten sonra, herhangi bir şeye bir ipucu koymuyorsanız, grafik orijinal renklerini kullanarak, beyaza ayarlı bir Renk değişkenine ayarlanmış çizilen nesnelerin tüm renklerini sadece (aşağıda belirttiğim gibi) elde edebilirsiniz. (Color NoTint = Color.White;) ve ardından Lerp, eğer oyuncu yaşıyorsa sıfıra eşittir. NoTint Color ile çizilen her nesne yavaşça değişecektir (aşağıda belirtilen enterpolasyon hızınıza göre).

Bunu yaparsanız Ancak aşağıdaki foreach döngüsü farklı nesneler üzerinde farklı tonları var kudreti işi.

Düzenlemeyi Sonlandır

Sınırlı bilgime göre şunu deneyeceğim: Belirli nesneleri çizerken kullandığınız renkleri beyan edin, ör. Color catColor = Color.Brown, ardından tüm oyun renklerinizi bir listeye ekleyin.

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

Tonsuz çizdiğiniz öğeler için bunu bile yapabilirsiniz ve Color.White'ı Color.Gray'a Lerp ile katlayın. (Color NoTint = Color.White gibi bir şeye isim verin ve tüm çizilen nesnelerinize koyun)

Muhtemelen daha iyi bir yol var, umarım bu yardımcı olur umarım!


1
-1 Bu, tüm ekranı gri bir renge döndürür, gri tonlamayı döndürmez. Gri tonlama bir rengi parlaklığıyla (farklı renkleri farklı parlaklıklara göre algılayan renkle) ölçer, bir rengin ve gri arasında (hala renkli olan) yarı yarıya değildir.
doppelgreener

Mükemmel. Umarım benim gibi başka birinden bunu öğrenir. Teşekkürler!
AndrewAchilles
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.