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 연산을 사용할수도 있고, 일반적인 보간을 이용하여 처리해 줄수도 있고,
만드는 사람 마음대로)
여러분, 공감 한번 눌러주세요! ^^
'프로그래밍' 카테고리의 다른 글
shimmering shadow edges, stable shadow, stable csm (0) | 2017.07.06 |
---|---|
waypoint 웨이포인트 (0) | 2017.04.18 |
volume fog - 파헤치기 - 밖에서 볼때, 안으로 들어갈때 (0) | 2016.11.06 |
volume fog - 파헤치기 - 볼륨 렌더링은 이렇게 (0) | 2016.10.26 |
volume fog - 파헤치기 - 기본 원리를 살펴보자 (7) | 2016.10.23 |