문제는 Windows Phone의 XNA에 사용자 정의 셰이더 지원이 없기 때문에 정점 셰이더 또는 픽셀 셰이더를 작성할 수 없다는 것 입니다. 그러나 Catalin Zima에서 설명한 트릭을 사용 하여 정점 그리드를 변형하여 동일한 효과를 얻을 수 있습니다.
Windows Phone 7을 대상으로하지 않는 경우 블로그에 설명 된 트릭을 사용할 수 있습니다 . 관련 비트 복사 :
이러한 왜곡에는 2 개의 이미지가 필요합니다. 먼저 전체 장면을 렌더 타겟 (예 : Texture2D) 및 왜곡 렌더 타겟으로 필요합니다. 일반적으로 파티클 시스템을 사용하여 왜곡 렌더링 대상을 채 웁니다. 특수 왜곡 스프라이트 사용 (아래 예).
왜곡 대상 (및 왜곡 스프라이트)의 각 색상 구성 요소는 다음을 나타냅니다.
- R : dx : X 오프셋 – f (x) = 2x-1 매핑 ([0.0f, 1.0f]에서 [-1.0f, 1.0f]).
- G : dy : Y 오프셋 – f (x) = 2x-1 매핑.
- B : m : Z 강도 – f (x) = x 매핑.
리플에 사용될 스프라이트의 좋은 예는 다음과 같습니다.
잔물결의 결과를 결정하는 것은 파도를 더하는 것만 큼 간단합니다 (먼저 [-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();
}
}
이것이 최종 효과입니다.
이 기술은 3D 게임에서도 작동합니다. 입자 쉐이더와 왜곡 쉐이더에 더 많은 생각을 기울여야 할 수도 있습니다.