पूरे दृश्य को ग्रेस्केल के लिए फीका बनाना


20

जब खिलाड़ी अपने सभी जीवन खो देता है, तो मैं चाहता हूं कि पूरी गेम स्क्रीन ग्रेस्केल पर जाए, लेकिन तुरंत अपडेट करना बंद न करें। मैं भी इसे पसंद करने के बजाय अचानक सभी रंग खोना पसंद करता हूँ। अब तक मैंने जो कुछ भी पाया है, वह या तो स्क्रीनशॉट लेने और इसे ग्रेस्केल बनाने, या एक विशिष्ट बनावट ग्रेस्केल बनाने के बारे में है। वहाँ सब कुछ के माध्यम से पुनरावृत्ति के बिना पूरे खेल मैदान और सभी वस्तुओं को ग्रेस्केल में बदलने का एक तरीका है?

जवाबों:


23

ऐसा करने का सबसे आसान तरीका इसके लिए एक shader बनाना है (नीचे कोड देखें)। रेंडर टार्गेट के लिए सब कुछ ड्रा करें, फिर शैडर का उपयोग करके उसे अपने बैक बफर पर आकर्षित करें

आपके गेम कोड रिकॉर्ड में जब खिलाड़ी की मृत्यु हो जाती है, तो बाद के रेंडर में 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 का कारण यह है कि मानव आंख समान रूप से रंगों का इलाज नहीं करती है, वे मान एक बेहतर ग्रीसी छवि देते हैं।


कुछ समय पहले मैं आरजीबी को ग्रे में परिवर्तित कर रहा था, लेकिन एक विश्वसनीय स्रोत नहीं पा रहा था, इसलिए मैंने सिर्फ 1.0 / 3,1.0 / 3,1.0 / 3 का उपयोग किया ... क्या आप संख्यात्मक स्थिरांक 0.2,0.59,0.11 के लिए एक स्रोत प्रदान कर सकते हैं?
ट्रेवर बॉयड स्मिथ

मैं खोजने की कोशिश कर रहा हूं कि मुझे कहां से कोड मिला है, लेकिन इसे खोजने में सक्षम नहीं है। यहां एक वाल्व डेवलपर पेज है जो विभिन्न (लेकिन अस्पष्ट समान) मूल्यों (0.222, 0.707, 0.071) का उपयोग करता है।
जॉर्ज डकेट

1
यहां उन मानों के लिए एक संदर्भ दिया गया है जो वाल्व संख्याओं का समर्थन करते हैं लेकिन दोनों को सूचीबद्ध करते हैं। poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC9
एडम


मैं इस बात की पुष्टि कर सकता हूं कि मेरे लिए यह एक्सएनए 4.0
रोबोब्लोब

0

संपादित करें

इसके बारे में सोचने के बाद, यदि आप किसी चीज पर टिंट नहीं लगा रहे हैं, लेकिन ग्राफिक्स मूल रंगों का उपयोग करके आप बस (जैसे मैं नीचे नीचे बता सकते हैं) आपके सभी तैयार किए गए रंगों के रंग एक घोषित रंग चर सेट में सफेद हो जाते हैं। (कलर नॉटइन = कलर.हाईट;) और फिर लीरप कि अगर खिलाड़ी रहता है तो शून्य के बराबर है। NoTint Color के साथ खींची गई प्रत्येक ऑब्जेक्ट धीरे-धीरे बदल जाएगी (आपके नीचे दिए गए प्रक्षेप दर के अनुसार) जो भी आप इसे लेरिंग कर रहे हैं।

हालाँकि, यदि आपके पास अलग-अलग वस्तुओं पर अलग-अलग चिह्न हैं, तो नीचे की ओर लूप काम कर सकता है

अंत संपादित करें

अपने सीमित ज्ञान में मैं यह कोशिश करूंगा: विशिष्ट वस्तुओं को खींचते समय आपके द्वारा उपयोग किए जाने वाले रंगों को घोषित करें, पूर्व। 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 रंग के साथ आकर्षित आइटम के लिए यह कर सकते हैं। (नाम जो कि कलर नॉटइंट = कलर. वाइट जैसा कुछ है, और अपनी सभी तैयार वस्तुओं पर डालें)

वहाँ शायद एक बेहतर तरीका है, मुझे आशा है कि यह मदद करता है!


1
-1 यह पूरी स्क्रीन को एक ठोस रंग में बदल देगा, इसे ग्रेस्केल को चालू न करें। ग्रेस्केल अपनी चमक से एक रंग को मापता है (रंग अलग-अलग रंगों को अलग-अलग चमक के साथ मानते हुए), यह एक रंग और ग्रे (जो अभी भी रंग है) के बीच सिर्फ आधा नहीं है।
doppelgreener

अति उत्कृष्ट। मुझे आशा है कि जैसा मैंने किया था उससे कोई और सीखता है। धन्यवाद!
एंड्रयूअकिल्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.