लहर लहर प्रभाव?


9

मैं पिछले कुछ समय से एक टॉवर-रक्षा खेल पर काम कर रहा था, और अब तक मैं परिणामों से वास्तव में संतुष्ट हूं। हालाँकि, एक बात और जोड़ना चाहूँगा।

मैंने यहां विंडोज फोन 7 के लिए जियोडिफेन्स का एक वीडियो देखा है: http://www.youtube.com/watch?v=YhPr4A4LLPQ

ध्यान दें कि कैसे (जब एक इकाई को मार दिया जाता है या एक प्रक्षेप्य एक इकाई को हिट करता है), पृष्ठभूमि किसी न किसी तरह के लहर प्रभाव में तरंगित होती है।

मैं एक समतुल्य कैसे बना सकता हूं? मैं सोच रहा हूं कि मुझे किसी तरह इसे वर्टीकल शेडर में करने की जरूरत है, जिसमें कई सारे वर्टीकल्स बने हैं।

आपकी कॉल क्या है?

संपादित करें यह ध्यान रखना महत्वपूर्ण है कि मेरा एक्सएनए गेम विंडोज फोन के लिए नहीं, बल्कि विंडोज पीसी के लिए बनाया गया है।

जवाबों:


8

समस्या यह है कि विंडोज फोन पर XNA के पास कस्टम shader का समर्थन नहीं है - इसलिए आप एक वर्टेक्स shader या पिक्सेल shader नहीं लिख सकते हैं । हालांकि, आप कैटलिन ज़िमा द्वारा वर्णित एक चाल का उपयोग कर सकते हैं जो समान प्रभाव को प्राप्त करने के लिए एक शीर्ष ग्रिड को विकृत करता है।

यदि आप विंडोज फोन 7 को लक्षित नहीं कर रहे हैं, तो आप मेरे ब्लॉग पर वर्णित एक ट्रिक का उपयोग कर सकते हैं । संबंधित बिट्स की प्रतिलिपि बनाना:

इन विकृतियों में 2 छवियों की आवश्यकता होती है। सबसे पहले आपको एक टारगेट टारगेट (यानी Texture2D) के साथ-साथ डिस्टॉर्शन रेंडर टारगेट के रूप में पूरे सीन की जरूरत होती है। आमतौर पर आप विरूपण रेंडर लक्ष्य को भरने के लिए एक कण प्रणाली का उपयोग करेंगे; विशेष विरूपण स्प्राइट्स का उपयोग करना (नीचे उदाहरण)।

विरूपण लक्ष्य (और विरूपण स्प्राइट) में प्रत्येक रंग घटक निम्नलिखित का प्रतिनिधित्व करता है:

  • R : dx: X ऑफ़सेट - f (x) = 2x-1 मैपिंग ([0.0f, 1.0f] से [-1.0f, 1.0f])।
  • G : डाई: Y ऑफ़सेट - f (x) = 2x-1 मैपिंग।
  • बी : एम: जेड ताकत - एफ (एक्स) = एक्स मैपिंग।

एक स्प्राइट का एक अच्छा उदाहरण जिसका उपयोग एक लहर के लिए किया जाएगा:

रिपल स्प्राइट

एक लहर के परिणाम का निर्धारण करना लहरों को एक साथ जोड़ना जितना आसान है (मानचित्रण को ध्यान में रखते हुए आपको पहले प्रदर्शन करना होगा [-1.0f, 1.0f]); क्योंकि वास्तविकता में लहरें भी additive हैं यह सिर्फ काम करता है - आपको वास्तविक तरंगों के बहुत अच्छे अनुमान मिलेंगे।

एक बार जब आपके पास दो रेंडर लक्ष्य होते हैं, तो आप निम्नलिखित shader का उपयोग कर सकते हैं:

Texture InputTexture; // The distortion map.
Texture LastTexture; // The actual rendered scene.

sampler inputTexture = sampler_state
{
    texture = <InputTexture>;
    magFilter = POINT;
    minFilter = POINT;
    mipFilter = POINT;
};

sampler lastTexture = sampler_state
{
    texture = <LastTexture>;
    magFilter = LINEAR;
    minFilter = LINEAR;
    mipFilter = LINEAR;
    addressU = CLAMP;
    addressV = CLAMP;
};

struct VS_OUTPUT
{
    float4 Position : POSITION;
    float2 TexCoords : TEXCOORD0;
};

float4 Distort (VS_OUTPUT Input)
{
    float4 color1;
    float4 color2;
    float2 coords;
    float mul;

    coords = Input.TexCoords;
    color1 = tex2D(inputTexture, coords);

    // 0.1 seems to work nicely.
    mul = (color1.b * 0.1);

    coords.x += (color1.r * mul) - mul / 2;
    coords.y += (color1.g * mul) - mul / 2;

    color2 = tex2D(lastTexture, coords);

    return color2;
}

float4 RunEffects (VS_OUTPUT Input) : COLOR0
{
    float4 color;

    color = Distort(Input);

    return color;
}

technique Main
{
    pass P0
    {
        PixelShader = compile ps_2_0 RunEffects();
    }
}

यह अंतिम प्रभाव है:

तरंग प्रभाव

इस तकनीक को 3 डी गेम के लिए भी काम करना चाहिए; हालाँकि आपको कण थरथराहट और विकृति शैडर के लिए अधिक विचार समर्पित करना पड़ सकता है।


मैं विंडोज फोन के लिए गेम नहीं बना रहा हूं। मैंने अपना प्रश्न अपडेट कर दिया है।
मथियास लिकेगार्ड लोरेनजेन

@MathiasLykkegaardLorenzen मैंने अपने ब्लॉग से कुछ सामग्री निकाली और उत्तर में डाल दिया, उम्मीद है कि यह आपको एक अच्छा प्रारंभिक बिंदु देगा।
जोनाथन डिकिंसन

फोन का उदाहरण अच्छा है और ठीक वैसा ही है जैसा मैं करने की कोशिश कर रहा हूं। दुर्भाग्य से, मैं चाहता हूं कि प्रभाव दुनिया के साथ आगे बढ़े, न कि स्क्रीन समन्वय पर आधारित हो। क्या यह संभव है?
बजे मैथियास लाइकेगार्ड लोरेनजेन

@MathiasLykkegaardLorenzen यह निश्चित रूप से संभव है, लेकिन यह अविश्वसनीय रूप से महंगा होगा - जिस स्थिति में मैं आपको मेरे समाधान के लिए जाने की सलाह देता हूं। अगर मुझे मिल जाए तो मैं आपको कोड मेल कर दूंगा; जब तक आप मेरी किसी भी कलाकृति का उपयोग नहीं करने का वादा करते हैं :)।
जोनाथन डिकिन्सन

@ जोनाथन डिकिंसन क्या आप हमें अपडेटेड XNA 4 कोड प्रदान कर सकते हैं?
आमिर रज़ाई
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.