프로그래밍 2016. 12. 5. 22:37
728x90

 

volume fog - 파헤치기 - depth buffer VS volume buffer

 

 

우오, 최순실의 국정농단과 대통령 탄핵으로

나라가 시끌벅적한 이 타이밍에

대통령 탄핵과 조사, 구속에 한표를 던진다 팍!팍!

 

 

볼륨포그에서의, depth buffer 적용을 살펴보자

사실, 시간이 많이 지나서 정말 가물가물해 졌다

ㅎㅎㅎ

 

 

일단 depth buffer 가 필요한 이유를 짚어보자면...

 

 

 

적절하게 잘나온 경우

 

 

 

 

 

같은 장면이지만, 어라 뭔가 좀 이상하다

 

 

볼륨포그를 렌더링할때, 풀씬의 depth 값과 비교하는 과정을 빼면,

볼륨포그 영역 안에 튀어나온 오브젝트가 있을 경우,

당연히

볼륨이, 이 오브젝트를 덮어서 출력되게 된다

 

 

따라서,

풀씬에 대한 depth 값이 기록된 RT(렌더타겟 텍스쳐) 는 필수적으로 필요하다,

 

참고로, depth buffer 는 풀씬에 나타나는 모든 지형, 오브젝트 등을 그려서

그의 z 값만을 기록해 둔 버퍼를 말한다

(우리는 이미 depth buffer 를 가지고 있을 것이다, 여러가지 연산에 필요한 버퍼이니까)

 

볼륨을 렌더링할때는,

이 depth 값을 가져와서, 현재 볼륨의 깊이값과 비교하는 연산이 추가되면 되는데,

비교적 간단하다

 

으음, 기억도 잘 안나고,

바로 쉐이더 코드를 살펴볼까나

 

 

볼륨의 far 를 그릴때는

PS()

{

     float2 uv = _In.depth.xy / _In.depth.w;
     uv = uv * float2(0.5, -0.5) + 0.5;
 
     float fDepth = tex2D( Samp_Tex_DepthBuffer, uv ).r;
     float fVD_f = _In.depth.z;

     

//막히는 부분의 두께가 될 값을 가깝게 조절해서,

//인접한 포그의 농도가 옅어지게 처리
if( 0 < fDepth && fDepth < fVD_f )
{
      fVD_f = fDepth;
}

 

return float4( fVD_f, fVD_f, fVD_f, fVD_f );

}

 

 

볼륨의 near 를 그릴때는

PS()

{

     float2 uv = _In.depth.xy / _In.depth.w;
     uv = uv * float2(0.5, -0.5) + 0.5;
 
     float fDepth = tex2D( Samp_Tex_DepthBuffer, uv ).r;
     float fVD_n = _In.depth.z;

 

//포그보다 깊이값이 적다는 것은(카메라에 더 가깝다),

//포그의 영향을 받지 않는 부분이라는것
if( 0 < fDepth && fDepth < fVD_n  )
{
      return float4( 0, 0, 0, 0 );
}

 

return float4( fVD_n, fVD_n, fVD_n, fVD_n );

 

대략, 위와 같은 비교를 통해서, 볼륨안의 오브젝트가 적절하게 보이도록 처리해줄수 있다

 

 

추가적으로는,

포그 색상 변수 추가,

포그 밀도(density) 변수 추가( 진하기를 조절 ),

카메라와의 거리에 따라 옅어지게 만들어 주는 등의 처리가 필요하다

 

*볼륨버퍼는

최종적인 렌더링 단계 또는 씬 합성 단계에서,

텍스쳐로 읽어들여

원본 화면의 컬러에 적절하게 적용시켜주면 된다

( fog 연산을 사용할수도 있고, 일반적인 보간을 이용하여 처리해 줄수도 있고,

만드는 사람 마음대로)

 

 

 

여러분, 공감 한번 눌러주세요! ^^

 

728x90
posted by BK dddDang
: