समस्या यह है कि विंडोज फोन पर 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 डी गेम के लिए भी काम करना चाहिए; हालाँकि आपको कण थरथराहट और विकृति शैडर के लिए अधिक विचार समर्पित करना पड़ सकता है।