파급 효과?


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.