Волновой волновой эффект?

9

Я работаю над игрой Tower Defense уже некоторое время, и до сих пор я действительно доволен результатами. Однако есть одна вещь, которую я хотел бы добавить.

Я видел видео GeoDefense для Windows Phone 7 здесь: http://www.youtube.com/watch?v=YhPr4A4LRPQ

Обратите внимание, как (когда юнит убит или снаряд поражает юнит), фон колеблется в каком-то волновом эффекте.

Как я могу сделать эквивалент? Я думаю, что мне как-то нужно сделать это в вершинном шейдере, с квадратом из множества вершин.

Каков твой звонок?

Редактировать Важно отметить, что моя игра XNA предназначена не для Windows Phone, а для ПК с Windows.

Матиас Ликкегор Лоренцен
источник

Ответы:

8

Проблема в том, что XNA в Windows Phone не имеет поддержки пользовательских шейдеров - поэтому вы не можете написать вершинный или пиксельный шейдер. Тем не менее, вы можете использовать трюк, описанный 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. Я обновил свой вопрос.
Матиас Ликкегор Лоренцен
@MathiasLykkegaardLorenzen Я поднял некоторый контент из своего блога и поместил его в ответ, надеюсь, это даст вам хорошую отправную точку.
Джонатан Дикинсон
Пример с телефоном хорош, и это именно то, что я пытаюсь сделать. К сожалению, я хочу, чтобы эффект двигался с миром, а не основывался на экранных координатах. Это возможно?
Матиас Ликкегор Лоренцен
@MathiasLykkegaardLorenzen Это определенно возможно, но это будет невероятно дорого - в этом случае я рекомендую вам воспользоваться моим решением. Я вышлю вам код, если смогу его найти; до тех пор, пока вы обещаете не использовать мои произведения :).
Джонатан Дикинсон
@ Джонатан Дикинсон Не могли бы вы предоставить нам обновленный код XNA 4?
Амир Резаи