파급 효과?


9

나는 현재 한동안 타워 방어 게임을하고 있었으며 지금까지 결과에 정말 만족합니다. 그러나 추가하고 싶은 것이 있습니다.

http://www.youtube.com/watch?v=YhPr4A4LRPQ 에서 Windows Phone 7 용 GeoDefense 비디오를 보았습니다 .

(유닛이 죽거나 발사체가 유닛을 때릴 때) 배경이 어떤 파동 효과로 파문이되는지 확인하십시오.

어떻게 동등하게 만들 수 있습니까? 나는 버텍스 쉐이더에서 많은 버텍스로 구성된 쿼드로 어떻게 든 그것을해야한다고 생각합니다.

당신의 전화는 무엇입니까?

편집 내 XNA 게임은 Windows Phone 용이 아니라 Windows PC 용입니다.

답변:


8

문제는 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 게임에서도 작동합니다. 입자 쉐이더와 왜곡 쉐이더에 더 많은 생각을 기울여야 할 수도 있습니다.


Windows Phone 용 게임을 만들지 않습니다. 내 질문을 업데이트했습니다.
Mathias Lykkegaard Lorenzen

@MathiasLykkegaardLorenzen 나는 내 블로그에서 일부 내용을 들어 올려 답변에 넣었 으면 좋겠다.
조나단 디킨슨

전화 예제는 훌륭하며 정확히 내가하려고하는 것입니다. 불행히도, 효과가 월드와 함께 움직이고 화면 좌표를 기반으로하지 않기를 바랍니다. 가능합니까?
Mathias Lykkegaard Lorenzen

@MathiasLykkegaardLorenzen 확실히 가능하지만 엄청나게 비쌀 것입니다.이 경우 내 솔루션을 추천합니다. 코드를 찾으면 우편으로 보내 드리겠습니다. 내 작품을 사용하지 않겠다고 약속하는 한 :).
Jonathan Dickinson

@Jonathan Dickinson 업데이트 된 XNA 4 코드를 제공해 주시겠습니까?
Amir Rezaei 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.