使整个场景淡入灰度


20

当玩家失去一生时,我希望整个游戏屏幕变为灰度,而不是立即停止更新。我也希望它逐渐变灰而不是突然失去所有颜色。到目前为止,我发现的所有内容都是关于截屏并将其设为灰度,或将特定的纹理设为灰度。有没有一种方法可以将整个运动场和其中的所有对象更改为灰度,而无需遍历所有内容?

Answers:


23

最简单的方法是为其创建一个着色器(请参见下面的代码)。将所有内容绘制到渲染目标,然后使用着色器将其绘制到后台缓冲区

在玩家死后的游戏代码记录中,然后在后续渲染中,根据
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();
    }
}

使用0.3、0.59和0.11的原因是因为人眼无法平等地对待颜色,因此这些值可以提供更好的灰度图像。


前一段时间我将RGB转换为灰色,但找不到可靠的来源,所以我只使用1.0 / 3,1.0 / 3,1.0 / 3 ...您能提供数值常数0.2,0.59,0.11的来源吗?
Trevor Boyd Smith

我一直在尝试找到代码的来源,但一直找不到。这是一个使用不同(但大致相似)值(0.222、0.707、0.071)的Valve Developer页面
乔治·达基特

1
这是支持阀号但同时列出两者的值的一个参考。poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC9
亚当

1
:有一个关于计算器的灰度系数问题stackoverflow.com/questions/5311774/...
Exilyth

我可以确认此着色器在XNA 4.0中为我工作了
Roboblob 2013年

0

编辑

考虑一下之后,如果您不对任何事物进行任何着色,而是使用图形原始颜色,则可以将所有绘制对象的颜色(如我声明的那样)设置为声明的Color变量,并将其设置为白色。(Color NoTint = Color.White;),然后使玩家生存的Lerp等于零。使用NoTint Color绘制的每个对象都将缓慢变化(根据下面提到的插值速率),变为您要对其进行设置的对象。

但是,如果您对不同的对象有不同的色彩,则下面的foreach循环可能会起作用。

结束编辑

以我的有限知识,我会尝试这种方法:声明绘制特定对象时使用的颜色,例如。颜色catColor = Color.Brown,然后将所有游戏颜色添加到列表中。

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

您甚至可以对不带颜色绘制的项目执行此操作,然后将Color.White转换为Color.Gray。(将其命名为Color NoTint = Color.White,然后将其放在所有绘制的对象上)

也许有更好的方法,不管我希望这会有所帮助!


1
-1这会将整个屏幕淡化为一种纯色,而不是使其变成灰度。灰度通过颜色的亮度来衡量颜色(颜色将不同的颜色感知为具有不同的亮度),它不仅位于颜色和灰色(仍具有颜色)之间。
doppelgreener 2012年

优秀。我希望别人能像我一样从中学到东西。谢谢!
AndrewAchilles 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.