সমস্যাটি হ'ল উইন্ডোজ ফোনে এক্সএনএ-তে কাস্টম শেডার সমর্থন নেই - সুতরাং আপনি একটি ভার্টেক্স শেডার বা পিক্সেল শেডার লিখতে পারবেন না । তবে, আপনি ক্যাটালিন জিমার দ্বারা বর্ণিত একটি কৌশল ব্যবহার করতে পারেন যা একই প্রভাব অর্জনের জন্য একটি ভার্টেক্স গ্রিডকে বিকৃত করে।
আপনি যদি উইন্ডোজ ফোন 7 লক্ষ্য করে না নিচ্ছেন তবে আপনি আমার ব্লগে বর্ণিত একটি কৌশল ব্যবহার করতে পারেন । এতে সম্পর্কিত বিটগুলি অনুলিপি করা:
এই বিকৃতিগুলির জন্য 2 টি চিত্রের প্রয়োজন। প্রথমত আপনার পুরো দৃশ্যটি রেন্ডার টার্গেট হিসাবে (যেমন টেক্সচার 2 ডি) পাশাপাশি বিকৃতি রেন্ডার লক্ষ্য হিসাবে প্রয়োজন। সাধারণত আপনি বিকৃতি লক্ষ্য পূরণ করতে একটি কণা সিস্টেম ব্যবহার করবেন; বিশেষ বিকৃতি স্প্রিট ব্যবহার করে (নীচে উদাহরণস্বরূপ)।
বিকৃতি লক্ষ্য (এবং বিকৃতি স্প্রিটস) এর প্রতিটি রঙের উপাদান নীচের প্রতিনিধিত্ব করে:
- আর : ডিএক্স: এক্স অফসেট - চ (এক্স) = 2x-1 ম্যাপিং ([0.0f, 1.0f] থেকে [-1.0f, 1.0f])।
- জি : ডাই: ওয়াই অফসেট - চ (এক্স) = 2 এক্স -1 ম্যাপিং।
- বি : এম: জেড শক্তি - চ (এক্স) = এক্স ম্যাপিং।
একটি স্প্রাইটের একটি ভাল উদাহরণ যা একটি রিপলের জন্য ব্যবহৃত হত:
রিপলের ফলাফল নির্ধারণ করা তরঙ্গগুলি একসাথে যুক্ত করার মতোই সহজ (ম্যাপিংয়ের বিষয়টি মাথায় রেখে আপনাকে প্রথমে [-1.0f, 1.0f] এ সম্পাদন করা প্রয়োজন); কারণ বাস্তবে তরঙ্গগুলিও যুক্ত হয় এটি ঠিক কাজ করে - আপনি বাস্তব তরঙ্গগুলির খুব ভাল আনুমানিকতা পাবেন।
আপনার দুটি রেন্ডার লক্ষ্যমাত্রা হয়ে গেলে আপনি নীচের শেডারটি ব্যবহার করতে পারেন:
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 ডি গেমগুলির জন্যও কাজ করা উচিত; যদিও আপনাকে আরও চিন্তাধারা কণার শেডার এবং বিকৃতি শেডারে উত্সর্গ করতে হতে পারে।