셰이더로 구현한 화면 노이즈
적용전
적용후
예전에 게임을 할때는,
전제 화면에 적용된 노이즈 효과를 좋아하지 않았습니다.
뭔가 지글거리는 느낌이 눈도 좀 아프고,
뭔가 계속 보고 있으면 병 걸릴것 같은 느낌도 들어서 말이지요....
ㅎ ㅎ
에일리언 아이솔레이션을 하면서부터,
노이즈 효과가 들어간 화면이 좀더 그럴듯 해 보이고,
(아주 은은하고 약하게 들어간 노이즈)
공간감이 살아난다는 느낌을 강하게 받아서
(공간에 먼지들이 끊임없이 떠 있는 듯한 느낌이랄까.... )
지금은 거부감이 없어졌습니다.
나공간을 개발하면서,
좀 허하게 비어 있는 공간이 많다보니,
비어있어도, 공간감을 좀 살리고 싶은 생각이 들어서
생각한 것이,
전체 화면 노이즈효과 입니다.
포토샵의 필터 기능중, 노이즈 만드는 것을 사용하면,
쉽게 노이즈 이미지를 만들 수 있습니다.
노이즈 강도를 낮추어 만들면
지글거리는 느낌이 거의 없는 이미지가 만들어 집니다.
노이즈 효과의 원리는 매우 간단합니다.
전체 화면에 노이즈 텍스쳐를 덧씌웁니다.
그리고,
노이즈 텍스쳐를 UV 애니메이션 시켜줍니다.
UV 애니메이션 속도가 빨라질수록, 매우 울렁거리는 듯한 느낌이 강해집니다.
1. 전체 화면이 렌더링된 이미지 ( 렌더타겟 텍스쳐 ) 가 필요하고,
2. 최종 렌더링 화면은 이 이미지와 노이즈 텍스쳐를 블렌딩한 컬러로 출력시킵니다.
블렌딩 화면 셰이더 코드
float3 _vUVTimer = float3(0,0,0);
float _IsNoiseTexture = 0.f;
float4 _NoiseColor = float4(1,1,1,1);
sampler2D Samp_Texture_Noise =
sampler_state
{
Texture = <_pTex_Noise>;
//4.0
Filter=MIN_MAG_MIP_LINEAR;
//AddressU = Wrap;
//AddressV = Wrap;
};
//픽셀셰이더에서 컬러를 구하는 부분
{
//
//픽셀 자체의 밝기를 곱해주는 코드가 포함되어 있습니다.
//어두운 색상의 픽셀은 더 어둡게, 출력이 됩니다.
float4 fC = tex2D( Samp_Texture_Orig, _UV );
float fSelfBright = ( fC.r + fC.g + fC.b ) / 3.f;
if( _fMultiplyPixelSelfBright > 0.1f )
{
fC.rgb *= fSelfBright;
}
//noise 적용
//항상 노이즈가 필요하지는 않으니, 필요할때만 적용시킵니다.
if( _IsNoiseTexture > 0.1f )
{
float2 vUV = _UV;
vUV.x += _vUVTimer.x;
vUV.y += _vUVTimer.y;
fC = fC + ( _NoiseColor * tex2D( Samp_Texture_Noise, vUV ) * (fSelfBright) );
}
return fC;
}
//UV 타이머 소스 코드 부분
//매프레임마다 틱을 더해서 넘겨줍니다
_mvNoiseUVTimer.x += g_fTick;
_mvNoiseUVTimer.y += g_fTick;
pEffect->GetEffect()->SetValue( "_vUVTimer", &_mvNoiseUVTimer, sizeof(Vector3) );
'프로그래밍' 카테고리의 다른 글
볼륨메트릭 라이팅 Volumetric Light - 02 (0) | 2015.01.30 |
---|---|
볼륨메트릭 라이팅 Volumetric Light - 01 (0) | 2015.01.30 |
c++ tick (0) | 2014.11.23 |
d3d device lost, device reset (0) | 2014.10.07 |
셰이더 왜곡 distortion (0) | 2014.10.02 |