전체 장면을 회색조로 희미하게 만들기


20

플레이어가 목숨을 모두 잃을 때 전체 게임 화면이 회색조로 돌아가고 싶지만 즉시 업데이트를 중단하지는 않습니다. 또한 갑자기 모든 색상을 잃는 대신 그레이 스케일로 페이드 인하는 것이 좋습니다. 지금까지 찾은 것은 스크린 샷을 찍어 그레이 스케일로 만들거나 특정 텍스처 그레이 스케일을 만드는 것입니다. 모든 것을 반복하지 않고 전체 경기장과 모든 사물을 그레이 스케일로 변경할 수있는 방법이 있습니까?

답변:


23

가장 쉬운 방법은 셰이더를 만드는 것입니다 (아래 코드 참조). 렌더 타겟에 모든 것을 그린 다음 셰이더를 사용하여 백 버퍼에 그립니다.

플레이어가 죽을 때의 게임 코드 레코드에서 후속 렌더링에서는 다음에 따라 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의 이유는 사람의 눈이 색상을 동일하게 취급하지 않기 때문에 그 값이 더 나은 그레이 스케일 이미지를 제공하기 때문입니다.


얼마 전 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 페이지 입니다.
George Duckett

1
다음은 밸브 번호를 지원하지만 모두 나열하는 값에 대한 하나의 참조입니다. poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC9
Adam

1
stackoverflow의 그레이 스케일 계수에 대한 질문이 있습니다. stackoverflow.com/questions/5311774/…
Exilyth

이 쉐이더가 XNA 4.0에서 나를 위해 일한 것을 확인할 수 있습니다
Roboblob

0

편집하다

그것에 대해 생각한 후에 아무것도 색조를 붙이지 않고 그래픽 원래 색상을 사용하면 그려진 객체의 모든 색상을 선언 된 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와 같은 이름을 지정하고 그려진 모든 객체에 놓습니다)

이것이 도움이되기를 바랍니다.


1
-1 이렇게하면 전체 화면이 하나의 단색으로 희미 해지고 회색조로 바뀌지 않습니다. 그레이 스케일은 밝기 (색상이 다른 것으로 다른 색상을 인식하는 색상)로 색상을 측정하며 색상과 회색 (여전히 색상이있는) 사이의 중간 정도가 아닙니다.
doppelgreener 11

우수한. 내가 한 것처럼 다른 사람이 이것으로부터 배우기를 바랍니다. 감사!
AndrewAchilles
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.