Hiệu ứng gợn sóng?


9

Tôi đã làm việc trong một trò chơi phòng thủ tháp một thời gian và cho đến nay tôi thực sự hài lòng với kết quả. Tuy nhiên, có một điều tôi muốn thêm vào.

Tôi đã xem video GeoDefense cho Windows Phone 7 tại đây: http://www.youtube.com/watch?v=YhPr4A4LRPQ

Lưu ý cách (khi một đơn vị bị giết hoặc một viên đạn bắn trúng một đơn vị), các gợn nền trong một loại hiệu ứng sóng.

Làm thế nào tôi có thể làm cho một tương đương? Tôi nghĩ rằng bằng cách nào đó tôi cần phải làm điều đó trong trình tạo bóng đỉnh, với một hình tứ giác được tạo thành từ nhiều đỉnh.

Cuộc gọi của bạn là gì?

Chỉnh sửa Điều quan trọng cần lưu ý là trò chơi XNA của tôi không được tạo cho điện thoại Windows, mà dành cho PC Windows.

Câu trả lời:


8

Vấn đề là XNA trên Windows Phone không có hỗ trợ đổ bóng tùy chỉnh - vì vậy bạn không thể viết một shader đỉnh hoặc pixel shader. Tuy nhiên, bạn có thể sử dụng một mẹo được mô tả bởi Catalin Zima làm biến dạng lưới đỉnh để đạt được hiệu quả tương tự.

Nếu bạn không nhắm mục tiêu Windows Phone 7, bạn có thể sử dụng một mẹo mà tôi đã mô tả trên blog của mình . Sao chép các bit có liên quan trong:

Những biến dạng này đòi hỏi 2 hình ảnh. Trước tiên, bạn cần toàn bộ cảnh làm mục tiêu kết xuất (ví dụ Texture2D) cũng như mục tiêu kết xuất méo. Thông thường, bạn sẽ sử dụng một hệ thống hạt để lấp đầy mục tiêu kết xuất méo; sử dụng các sprite biến dạng đặc biệt (ví dụ dưới đây).

Mỗi thành phần màu trong mục tiêu biến dạng (và các họa tiết biến dạng) thể hiện như sau:

  • R : dx: X offset - ánh xạ f (x) = 2x-1 ([0.0f, 1.0f] thành [-1.0f, 1.0f]).
  • G : dy: Y offset - ánh xạ f (x) = 2x-1.
  • B : m: Z cường độ - f (x) = x ánh xạ.

Một ví dụ điển hình về một sprite sẽ được sử dụng cho Ripple sẽ là:

Ripple Sprite

Xác định kết quả của Ripple cũng đơn giản như cộng các sóng lại với nhau (hãy nhớ rằng ánh xạ bạn cần thực hiện trước tiên thành [-1.0f, 1.0f]); bởi vì sóng trong thực tế cũng là phụ gia này chỉ hoạt động - bạn sẽ có được xấp xỉ rất tốt của sóng thực.

Khi bạn có hai mục tiêu kết xuất, bạn có thể sử dụng trình đổ bóng sau:

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

Đây là hiệu ứng cuối cùng:

Hiệu ứng gợn sóng

Kỹ thuật này cũng sẽ hoạt động cho các trò chơi 3D; mặc dù bạn có thể phải dành nhiều suy nghĩ hơn cho trình tạo bóng hạt và trình tạo bóng biến dạng.


Tôi không làm game cho Windows Phone. Tôi đã cập nhật câu hỏi của mình.
Mathias Lykkegaard Lorenzen

@MathiasLykkegaardLorenzen Tôi đã gỡ một số nội dung ra khỏi blog của mình và đưa nó vào câu trả lời, hy vọng nó mang lại cho bạn một điểm khởi đầu tốt.
Jonathan Dickinson

Ví dụ điện thoại là tốt đẹp và chính xác là những gì tôi đang cố gắng làm. Thật không may, tôi muốn hiệu ứng di chuyển với thế giới, và không dựa trên tọa độ màn hình. Điều đó có thể không?
Mathias Lykkegaard Lorenzen

@MathiasLykkegaardLorenzen Điều đó hoàn toàn có thể, nhưng nó sẽ cực kỳ tốn kém - trong trường hợp đó tôi khuyên bạn nên đi tìm giải pháp của tôi. Tôi sẽ gửi mail cho bạn mã nếu tôi có thể tìm thấy nó; miễn là bạn hứa sẽ không sử dụng bất kỳ tác phẩm nghệ thuật nào của tôi :).
Jonathan Dickinson

@Jonathan Dickinson Bạn có thể vui lòng cung cấp cho chúng tôi mã XNA 4 được cập nhật không?
Amir Rezaei
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.