Làm cho toàn bộ cảnh mờ dần thành thang độ xám


20

Khi người chơi mất tất cả cuộc sống của họ, tôi muốn toàn bộ màn hình trò chơi chuyển sang màu xám, nhưng không ngừng cập nhật ngay lập tức. Tôi cũng thích nó mờ dần sang màu xám thay vì đột nhiên mất hết màu. Tất cả mọi thứ tôi tìm thấy cho đến nay là về chụp ảnh màn hình và làm cho nó thang độ xám, hoặc tạo một thang độ xám cụ thể. Có cách nào để thay đổi toàn bộ sân chơi và tất cả các đối tượng bên trong sang thang độ xám mà không lặp lại mọi thứ không?

Câu trả lời:


23

Cách dễ nhất để làm điều này là tạo một shader cho nó (Xem mã bên dưới). Vẽ mọi thứ vào một mục tiêu kết xuất, sau đó sử dụng trình đổ bóng để vẽ nó vào bộ đệm phía sau của bạn

Trong bản ghi mã trò chơi của bạn khi người chơi chết, sau đó trong lần kết xuất tiếp theo sẽ nội suy một tham số shader giữa 1 (màu đầy đủ) và 0 (thang màu xám đầy đủ) theo
CurrentTime-DeadTime / FadeTime

float ColourAmount;
Texture coloredTexture;

sampler coloredTextureSampler = sampler_state
{
    texture = <coloredTexture>;
};

float4 GreyscalePixelShaderFunction(float2 textureCoordinate : TEXCOORD0) : COLOR0
{
    float4 color = tex2D(coloredTextureSampler, textureCoordinate); 
    float3 colrgb = color.rgb;
    float greycolor = dot(colrgb, float3(0.3, 0.59, 0.11));

    colrgb.rgb = lerp(dot(greycolor, float3(0.3, 0.59, 0.11)), colrgb, ColourAmount);

    return float4(colrgb.rgb, color.a);
}

technique Grayscale
{
    pass GreyscalePass
    {
        PixelShader = compile ps_2_0 GreyscalePixelShaderFunction();
    }
}

Lý do cho 0,3, 0,59 và 0,11 là do mắt người không xử lý màu sắc như nhau, những giá trị đó cho hình ảnh thang độ xám tốt hơn.


Một thời gian trước tôi đã chuyển đổi rgb sang màu xám nhưng không thể tìm thấy một nguồn đáng tin cậy vì vậy tôi chỉ sử dụng 1.0 / 3,1.0 / 3,1.0 / 3 ... Bạn có thể cung cấp nguồn cho các hằng số 0,2,0.59,0.11 không?
Trevor Boyd Smith

Tôi đã cố gắng tìm nơi tôi lấy mã từ đó, nhưng không thể tìm thấy nó. Đây là trang Valve Developer sử dụng các giá trị khác nhau (nhưng tương tự mơ hồ) (0.222, 0.707, 0.071).
George Duckett

1
Đây là một tham chiếu cho các giá trị hỗ trợ số Valve nhưng liệt kê cả hai. poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC9
Adam

1
Có một câu hỏi về các hệ số thang độ xám trên stackoverflow: stackoverflow.com/questions/5311774/
Kẻ

tôi có thể xác nhận trình tạo bóng này hoạt động cho tôi trong XNA 4.0
Roboblob

0

CHỈNH SỬA

Sau khi suy nghĩ về nó, nếu bạn không đặt màu lên bất cứ thứ gì, nhưng sử dụng màu gốc của đồ họa bạn có thể có (như tôi nêu xuống bên dưới), tất cả màu sắc của các đối tượng được vẽ của bạn được đặt thành biến màu được khai báo thành màu trắng. (Color NoTint = Color.White;) và sau đó Lerp rằng nếu người chơi sống bằng 0. Mọi đối tượng được vẽ bằng Màu NoTint sẽ từ từ thay đổi (theo tỷ lệ nội suy của bạn được đề cập bên dưới) thành bất cứ điều gì bạn đang Lerping nó.

Tuy nhiên, nếu bạn có các sắc thái khác nhau trên các đối tượng khác nhau, vòng lặp foreach dưới đây có thể hoạt động.

Kết thúc chỉnh sửa

Trong kiến ​​thức hạn chế của mình, tôi sẽ thử điều này: Khai báo màu bạn sử dụng khi vẽ các đối tượng cụ thể, ví dụ: Color catColor = Color.Brown, sau đó thêm tất cả các màu trò chơi của bạn vào danh sách.

public static Color catColor = Color.Brown;
List<Color> colorList = new List<Color>(){ catColor }; // and other colors
float interpolation = 0f;
float interpolationRate = .01f;
.
.
.
if(playerLives == 0) 
{
   interpolation += interpolationRate;
   if (interpolation >= 1)
      {interpolation = 1;}

   foreach(Color c in colorList)
   {
      Color.Lerp(c, Color.Gray, interpolation);
   }
}

Bạn thậm chí có thể làm điều này cho các mục bạn vẽ mà không có tông màu và Lerp the Color.White to a Color.Gray. (đặt tên giống như Color NoTint = Color.White và đặt nó trên tất cả các đối tượng được vẽ của bạn)

Có lẽ có một cách tốt hơn, bất kể tôi hy vọng điều này sẽ giúp!


1
-1 Điều này sẽ làm mờ toàn bộ màn hình thành một màu đơn sắc, không biến nó thành màu xám. Greyscale đo màu bằng độ sáng của nó (với màu nhận biết các màu khác nhau có độ sáng khác nhau), nó không chỉ nằm giữa một màu và xám (vẫn có màu).
doppelgreener

Xuất sắc. Tôi hy vọng người khác học được điều này như tôi đã làm. Cảm ơn!
AndrewAchilles
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.