728x90

피사계심도란?

W

Depth OField 라고도 하며 


렌즈로 일정 거리에 피사체의 초점을 맞추면 앞면과 뒷면의 일정한 거리 내에 초점이 맞는데

이때 그 범위를 이르는 말로

게임 내에서는 씬 내에 있는 가장 멀리 있는 오브젝트와 가장 가까이 있는 오브젝트 사이의 거리 

즉,카메라에 초점이 맞는 거리 범위를 말한다



크라이시스2 Bokeh 합성 DOF 영상



DOF OFF


DOF ON


DOF OFF


DOF ON


피사체가 초점에 앞에 있으면 렌즈에서 모아진 초점이 렌더타겟에서 보여지는 위치보다
안쪽이 되어 버리므로 감광되는 영역이 넓어지며




피사체가 안쪽에 있으면 렌더타겟에서 보여지는 위치보다 앞쪽에 초점이 위치하게 되므로
한번 모인 빛이 다시 퍼져서 렌더 타겟에 그려진다 ( 마찬가지로 감광되는 영역이 넓어짐)


.
초점이 맞춰져있는 부분은 선명한 화면을.. 나머지 초점이 맞지않는 부분은 블러를 적용하여 흐리게 한다



먼저 일반 화면을 렌더링하고 화면으로부터의 거리를 깊이값으로 렌더링한다.
다음, 렌더링 화면으로부터 뭉갠화면을 생성하고
마지막으로 렌더링한 깊이 값의 정보로부터 초점이 맞는 부분은 선명한 화면
초점이 맞지 않는 위치에는 뭉개진 화면을 합성한다



마지막에 최종 화면을 합성할때 에는 선형보간으로 이루어진다

 return lerp(OriginalImage, BlurredImage, saturate(Range *abs(Focus - PixelCameraZ)));


DOF구현의 기본은 카메라 공간 내에 있는 뭉개진화면인 Far 평면과 Near 평면과의 비교를 할수 있도록
카메라 공간에 그려질 픽셀의깊이값을 변환하는 것이다.

아래는 NDC 공간을 카메라 공간의 좌표로 변환하는데 사용하는 왼손좌표계용 프로젝션 매트릭스이다




아래의 방정식은 위에 투영행렬에 세번째 열에 있는 4D 동차 벡터를 곱한결과를 보여주고 있다




24.2는 매트릭스 w = z일경우 w에 의해 동차적으로 나누어진 최종 깊이 버퍼 방정식이며, 
이를 Z에 대해 풀면 카메라 공간으로 깊이 버퍼 값을 다시 역 변환하는데 사용할수 있다(24.3)

또한, 카메라 공간상의 픽셀의 거리는 깊이 버퍼를 가져오는 대신
씬이 렌더링 되는 동안 카메라 공간상의 각 픽셀에 깊이 값을
렌더 타겟의 알파 채널에 저장할 수 있다

 VS_OUTPUT VS(VS_INPUT Input)

{
    .....

    // 색성분에 깊이값을 넣음

    // 조명계산 필요시, 깊이값을  색성분의 w값에만 사용하고 다른성분에 조명을 계산한값을 출력 
    Out.Color = pos.z / pos.w;

    .....

    return Out;
}

float4 PS(VS_OUTPUT Input) : COLOR0
{
    float4 Out;
    .....

    // 알파 성분에 깊이값 저장
    Out.a = Input.Color.w;

    .....

    return Out;
}


다음  축소 버퍼를 사용해 뭉갠 화면을 준비한 후 초점이 될 깊이값을 어플리케이션에서 세팅한다


이후 강도를 조절하고 lerp()함수를 사용해 선명한 화면과 뭉개진 화면을 합성한다.


 // 카메라 공간으로 역변환

float PixelCameraZ = (-NearClip * Q) / (Depth - Q);


사용자정의 Focus 값과 Range 값은 원래 이미지와 뭉갠이미지 사이를 선형 보간하기 위하여 구한

픽셀의 카메라 거리와 함께 사용되며 최종 화면으로 합성된다


 // 선형 보간

return lerp(OriginalImage, BlurredImage, saturate(Range * abs(Focus - PixelCameraZ)));


이때 절대값을 취하는 이유는 피사계심도가 초점이 맞는 위치를 기준으로 앞쪽과 뒤쪽 모두에서

흐리게 뭉개져야 하므로 초점이 맞는 위치를 기준으로 어느족으로 깊이값이 증가하더라도

뭉개지는 양이 증가 할수 있도록 한것이다

(절대값이 아닌 제곱 값을 취해도 되나 출력상태가 약간 틀리므로 보고 나서 선택 하도록)


이 밖에 Bokeh 합성이 있으며 자세한건 위키피디아를 참조..



NDC11 "올바른 HDR을 이용한 Bloom과 DOF"  이창희님




                 1. 원본이미지                   2. Bokeh 합성                  3. 가우시안 블러 적용 DOF

위키피디아 링크 : http://en.wikipedia.org/wiki/Bokeh

이외에 스타크래프트 2는 CoC Map (Circle of Confusion)을 사용한다고 했다


스타2의 DOF


그림에서 보면 블러를 먹일 양을 결정하진 텍스처 인것 같다

.. 최대치의 블러를 먹일 부분과 초점이 맞는

부분의 사이의 Fade 효과가 들어가는 것일지도... 

대충 봤을때는 현재 픽셀의 블러를 먹일 것인가에 대한 데이터를 가진 텍스쳐인거 같다




출처 : http://blog.naver.com/sorkelf/40149186261


728x90

+ Recent posts