Efek gelombang riak?

9

Saya telah mengerjakan game menara pertahanan untuk beberapa waktu sekarang, dan sejauh ini saya benar-benar puas dengan hasilnya. Namun, ada satu hal yang ingin saya tambahkan.

Saya telah melihat video GeoDefense untuk Windows Phone 7 di sini: http://www.youtube.com/watch?v=YhPr4A4LRPQ

Perhatikan bagaimana (ketika sebuah unit terbunuh atau sebuah proyektil mengenai sebuah unit), latar belakangnya beriak dalam semacam efek gelombang.

Bagaimana saya bisa membuat yang setara? Saya berpikir bahwa saya perlu melakukannya di vertex shader, dengan quad yang terbuat dari banyak simpul.

Apa panggilanmu

Sunting Penting untuk dicatat bahwa game XNA saya tidak dibuat untuk ponsel Windows, tetapi untuk PC Windows.

Mathias Lykkegaard Lorenzen
sumber

Jawaban:

8

Masalahnya adalah bahwa XNA di Windows Phone tidak memiliki dukungan kustom shader - jadi Anda tidak dapat menulis shader vertex atau pixel shader. Namun, Anda dapat menggunakan trik yang dijelaskan oleh Catalin Zima yang merusak bentuk vertex grid untuk mencapai efek yang sama.

Jika Anda tidak menargetkan Windows Phone 7, Anda dapat menggunakan trik yang saya jelaskan di blog saya . Menyalin bit yang relevan di:

Distorsi ini membutuhkan 2 gambar. Pertama, Anda perlu seluruh adegan sebagai target render (yaitu Texture2D) serta target render distorsi. Biasanya Anda akan menggunakan sistem partikel untuk mengisi target render distorsi; menggunakan sprite distorsi khusus (contoh di bawah).

Setiap komponen warna dalam target distorsi (dan sprite distorsi) mewakili yang berikut:

  • R : dx: X offset - f (x) = pemetaan 2x-1 ([0,0f, 1.0f] hingga [-1.0f, 1.0f]).
  • G : dy: Y offset - f (x) = pemetaan 2x-1.
  • B : m: Z kekuatan - f (x) = x pemetaan.

Contoh yang baik dari sprite yang akan digunakan untuk riak adalah:

Ripple Sprite

Menentukan hasil riak semudah menambahkan gelombang bersama-sama (perhatikan pemetaan yang harus Anda lakukan terlebih dahulu untuk [-1.0f, 1.0f]); karena gelombang pada kenyataannya juga aditif ini hanya berfungsi - Anda akan mendapatkan perkiraan yang sangat baik dari gelombang nyata.

Setelah Anda memiliki dua target render, Anda dapat menggunakan shader berikut:

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();
    }
}

Ini adalah efek terakhir:

Efek riak

Teknik ini juga bisa digunakan untuk gim 3D; meskipun Anda mungkin harus mendedikasikan lebih banyak pemikiran untuk shader partikel dan shader distorsi.

Jonathan Dickinson
sumber
Saya tidak membuat game untuk Windows Phone. Saya telah memperbarui pertanyaan saya.
Mathias Lykkegaard Lorenzen
@MathiasLykkegaardLorenzen Saya mengangkat beberapa konten dari blog saya dan memasukkannya ke dalam jawaban, semoga ini memberi Anda titik awal yang baik.
Jonathan Dickinson
Contoh telepon bagus dan persis apa yang saya coba lakukan. Sayangnya, saya ingin efeknya bergerak dengan dunia, dan tidak didasarkan pada koordinat layar. Apakah itu mungkin?
Mathias Lykkegaard Lorenzen
@MathiasLykkegaardLorenzen Ini pasti mungkin, tapi itu akan sangat mahal - dalam hal ini saya sarankan Anda mencari solusi saya. Saya akan mengirimkan kode kepada Anda jika saya dapat menemukannya; selama Anda berjanji untuk tidak menggunakan karya seni saya :).
Jonathan Dickinson
@ Jonathan Dickinson Bisakah Anda memberi kami kode XNA 4 yang diperbarui?
Amir Rezaei