Ефект хвилі пульсацій?


9

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

Я бачив відео GeoDefense для Windows Phone 7 тут: http://www.youtube.com/watch?v=YhPr4A4LRPQ

Зауважте, як (коли одиниця вбивається або снаряд потрапляє в одиницю), фон пульсує в якомусь хвильовому ефекті.

Як я можу зробити еквівалент? Я думаю, що мені якимось чином потрібно це зробити у вершинній шейдері, з квадратом, виготовленим з багатьох вершин.

Який твій дзвінок?

Редагувати Важливо зазначити, що моя гра XNA створена не для телефону Windows, а для ПК з Windows.

Відповіді:


8

Проблема полягає в тому, що XNA на Windows Phone не підтримує користувальницьку підтримку шейдера, тому ви не можете написати шейдер вершини або піксельний шейдер. Однак ви можете використовувати фокус, описаний Каталіном Зімою, який деформує сітку вершин, щоб досягти такого ж ефекту.

Якщо ви не орієнтуєтесь на 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 Чи не могли б ви надати нам оновлений код XNA 4?
Амір Резай
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.