Bunu - Sorun Windows Phone XNA özel shader desteği yok olmasıdır edemez bir vertex shader veya pixel shader yazın. Ancak, aynı etkiyi elde etmek için köşe ızgarasını deforme eden Catalin Zima tarafından tarif edilen bir numara kullanabilirsiniz .
Windows Phone 7'yi hedeflemiyorsanız, blogumda açıkladığım bir hile kullanabilirsiniz . İlgili bitlerin kopyalanması:
Bu deformasyonlar 2 resim gerektirir. Öncelikle tüm sahneyi bir oluşturma hedefi (örn. Texture2D) ve deformasyon oluşturma hedefi olarak gerekir. Genellikle, bozulma oluşturma hedefini doldurmak için bir parçacık sistemi kullanırsınız; özel distorsiyon sprite kullanarak (aşağıdaki örnek).
Bozulma hedefindeki (ve bozulma spritelarındaki) her renk bileşeni aşağıdakileri temsil eder:
- R : dx: X ofseti - f (x) = 2x-1 eşleme ([0,0f, 1,0f] ila [-1,0f, 1,0f]).
- G : dy: Y ofseti - f (x) = 2x-1 eşleme.
- B : m: Z gücü - f (x) = x haritalama.
Bir dalgalanma için kullanılacak bir sprite örneği:
Bir dalgalanmanın sonucunu belirlemek, dalgaları bir araya getirmek kadar basittir (önce [-1.0f, 1.0f] 'ye yapmanız gereken haritalamayı unutmayın); çünkü gerçekte dalgalar da toplanır bu sadece işe yarıyor - gerçek dalgaların çok iyi yaklaşımlarını alacaksınız.
İki oluşturma hedefine sahip olduğunuzda, aşağıdaki gölgelendiriciyi kullanabilirsiniz:
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();
}
}
Bu nihai etki:
Bu teknik 3D oyunlar için de çalışmalıdır; parçacık gölgelendiricisine ve bozulma gölgelendiricisine daha fazla düşünce ayırmanız gerekebilir.