블로그 이미지
재미있게 게임을 만들고 싶은 아저씨.. jorisma

카테고리

분류 전체보기 (17)
Game programing (13)
Diary (1)
Programming Tip (3)
Spring 2011 (0)
Total
Today
Yesterday

달력

« » 2024.12
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

공지사항

태그목록

최근에 올라온 글

HDR + Bloom

Game programing/Shader / 2013. 10. 28. 21:34


주의 사항 

1. Gamma correction

2. 렌더 타켓을 HDR 버퍼로 만들어야 한다.



Tone mapping 진행 순서 

기본적으로 DirectX Sample 에서 나오는 축소버퍼를 사용해서 화면 전체의 평균 휘도를 구하는 방식으로 진행 

1. 조명 처리가 끝난 후 HDR 버퍼에 64x64 사이즈의 렌더타켓으로 다운 샘플링 한다.

  - log( dot( vSample, LUMINANCE_VECTOR ) + 0.0001f )

2. 1에서 만들어진 렌더 타겟을 1x1사이즈가 될 때 까지 다운 샘플링을 계속 진행한다.

3. 1x1으로 만들어진 렌더 타켓을 통해서 평균 휘도를 구한다. 

 - exp( fResampleSum / 16 )

4. 알아낸 평균 휘도와 이전 프레임의 평균 휘도를 통해서 급격한 변화를 하지 않도록 현재 평균 휘도를 구한다. 

    float fNewAdaptation = fAdaptedLum + (fCurrentLum - fAdaptedLum) * ( 1 - pow( 0.98f, 0.5 ) );

      color0 = float4(fNewAdaptation, fNewAdaptation, fNewAdaptation, 1.0f);


5. 만들어진 평균 휘도를 가지고 알맞는 Tone mapping operator를 사용해서 전체 픽셀의 값을 변경한다.


Bloom 진행 순서

기본적으로 요즘 게임에서 많이 사용하는 MGF 방식으로 진행 

1. 조명 처리가 끝난 후 HDR 버퍼에서 원하는 휘도 이상의 값만 추출한다. 이때 적절한 다운샘플링해서 뽑아내도 좋다.

2. 추출한 다운 샘플링 원본을 가지고 1/2 x 1/2로 만든다. 

 - 1/4 x 1/4 사이즈로 축소 시켜도 된다 하지만 너무 작은 사이즈가 되어버린 렌더 타켓은 전체 품질저하를 이르킨다.

3. 2에서 만들어진 렌더 타켓을 Gaussian 필터나 다른 필터를 사용하여 blurring 한다. 

4. 2~3번을 반복하면서 하나의 렌더 타켓에 누적시킨다. 





< 왼쪽은 작은 1/4 x 1/4 로 축소된 버퍼를 Gaussian 필터를 사용하여 Blurring 하고선 다시 원래 사이즈 렌더타켓에다 누적 >


Kawase식 MGF방식

원문 : http://game.watch.impress.co.jp/docs/series/3dcg/20120217_512295.html





- 축소버퍼를 사용하여 Gaussian 필터를 적용한다. 그 이유는 원문에서 보다 시피 여러 표준편차( 표준 편차가 크면 클수록 한 픽셀의 색을 결정하기 위해 많은 픽셀을 Fetch해야 한다. )의 Gaussian 필터를 사용하고 사용하고 싶지만 표준편차가 클수록 부하가 크기 때문에 만들어진 방법이다. 실제로 축소버퍼를 사용한 결과랑 차이가 거의 없게 보인다. 하지만 문제는 너무 작은 렌더 타켓을 Blurring하여 사용하면 픽셀의 계단 현상이 발생하게 된다. 실제로 테스트해보면 Bloom 효과가 많이 일렁이는 부분이 생긴다. 



렌더타켓의 사이즈를 고려하여서 Bloom을 만들면 적절한 효과를 만들어 낼 수 있다.


결과 

MGF 방식을 사용해서 만들면 Bloom이 작은 상황에서 너무 크게 만들어지고 하얗게 타들어가는 느낌이 되는데 이부분이 맘에 안들어서 

Blurring 된 렌더타켓을 누적할때 5장이면 0.2 곱하여 처리해서 위와 좀 다르게 나오게 하였다. 




'Game programing > Shader' 카테고리의 다른 글

Deferred Rendering ( 지연렌더링 ) - FXAA  (0) 2012.11.28
Deferred Rendering ( 지연렌더링 ) - Edge blur  (0) 2012.11.18
Deferred Rendering ( 지연렌더링 )  (0) 2012.11.15
What is shader?  (0) 2012.10.31
Deferred Rendering  (0) 2012.10.22
Posted by jorisma
, |

최근에 달린 댓글

최근에 받은 트랙백

글 보관함