답변:
가장 쉬운 방법은 셰이더를 만드는 것입니다 (아래 코드 참조). 렌더 타겟에 모든 것을 그린 다음 셰이더를 사용하여 백 버퍼에 그립니다.
플레이어가 죽을 때의 게임 코드 레코드에서 후속 렌더링에서는 다음에 따라 1 (풀 컬러)에서 0 (풀 그레이 스케일) 사이의 쉐이더 매개 변수를 보간합니다.
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의 이유는 사람의 눈이 색상을 동일하게 취급하지 않기 때문에 그 값이 더 나은 그레이 스케일 이미지를 제공하기 때문입니다.
편집하다
그것에 대해 생각한 후에 아무것도 색조를 붙이지 않고 그래픽 원래 색상을 사용하면 그려진 객체의 모든 색상을 선언 된 Color 변수로 설정하여 흰색으로 설정할 수 있습니다. (Color NoTint = Color.White;) 그런 다음 플레이어가 살고 있으면 Lerp는 0입니다. NoTint Color로 그려진 모든 개체는 (아래에 언급 된 보간 속도에 따라) 사용자가 원하는대로 천천히 변경됩니다.
그러나 다른 객체에 색조가 다른 경우 아래 foreach 루프 가 작동 할 수 있습니다.
편집 종료
제한된 지식으로 나는 이것을 시도 할 것입니다 : 예를 들어 특정 객체를 그릴 때 사용하는 색상을 선언하십시오. Color 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로 Lerp 할 수도 있습니다. (Color NoTint = Color.White와 같은 이름을 지정하고 그려진 모든 객체에 놓습니다)
이것이 도움이되기를 바랍니다.