가우스 필터

반응형
이전 방식들(16,64 박스 필터링)은 셰이더 버전이 올라갈 수록 많은 텍셀을
샘플링 할 수 있지만 그것도 한계가 있다.

좀 더 많은 텍셀을 샘플링 하려면 어떻게 해야 할까?

이렇게 한번 해보자.
1. 가로로 한번 뭉개준다.
2. 세로로 한번 뭉개준다.
3. 쨔잔~!

즉 흐림필터를 두번 적용해 주는 것이다.
이때 모든 텍셀을 같은 가중치로 평균하는 것이 아니라 텍셀 중심을 기준으로
멀어질 수록 낮은 가중치를 적용하도록 하자.
이를 위해 필요한 것이 "가우스 함수"라는 것이다.

가우스 함수를 블러에서 쓰는 이유는 좀 더 자연스럽고 부드럽게 샘플링을 하기 위해서 이다.
사실 가우스 함수는 블러뿐 아니라 여러곳 에서 사용되는데 블럼 이펙트나
산탄총 발사시 자연스러운 렌덤 발사등에 사용되기도 한다.

위키백과님의 말
----------------------------------------------------------------------------------------------------------
수학에서 가우스 함수(Gaussian function)는 다음과 같은 형태의 함수이다.
f(x) = a e^{-\frac{(x-b)^2}{c^2}}

여기서 a( > 0), b, c실수 상수이다.
이 함수는 카를 프리드리히 가우스의 이름을 따서 명명되었다.
가우스 함수의 그래프는 좌우대칭의 종 모양의 곡선으로 +/-의 극한을 향하면서는 급격히 감소하는 특성을 가진다.
매개변수 a는 곡선의 꼭대기 높이가 되며, b는 꼭대기의 중심의 위치가 된다. c는 종의 너비를 결정한다.
가우스 함수는 오차 함수도함수이다.
또한 가우스 함수는 정규 분포의 밀도 함수이며, 그 외에 자연 과학통계학에서 다양하게 사용된다.
----------------------------------------------------------------------------------------------------------
추가로 e는 자연상수,  μ는 그리스 문자로 mu라 부르며 뮤 또는 무라고 발음하며 통계학에서
평균을 나타내는 기호이며 σ는 그리스 문자로 sigma라고 부르며 통계학에서 표준편차를 나타내는 기호이다.
exp는 exponential을 의미하며 exp 뒤의 숫자는 e의 지수를 뜻한다.

아싸~~! 무슨말인지 모르겠다....ㅡㅡ;...젝1.
차근차근 보자.

가우스 기호인 []의 의미는?

----------------------------------------------------------------------------------------------------------
n<= x < n+1 : [x] = n
대략 이런식으로 표현 되는데 즉 x는 정수 부분이라고 생각하면 된다.
만약 2.3 일 경우는 2가 되고 1.2일 경우는 1이, 8.9일 경우는 8이 된다.
-1.3 일 경우는 -2 가 된다.
즉 주어지는 수 (2.3, 1.2, 8.9, -1.3 처럼) 이하의 최대의 정수라고 생각하면 된다.
2.3일 경우 위의 식으로 풀어쓰면
n<= 2.3 < n+1 요렇게 되는데 n은 항상 최대의 정수가 되어야 하므로
2.3보다 작은 최대의 정수는 2가 되어
2<=2.3<3 이 된다.
----------------------------------------------------------------------------------------------------------


가우스 필터 :
http://liepooh.egloos.com/587933

가우스 함수를 쓰는 이유 :
http://kin.naver.com/qna/detail.nhn?d1id=11&dirId=1113&docId=50723665&qb=6rCA7Jqw7Iqk7ZWo7IiYIOydtOycoA==&enc=utf8&section=kin&rank=3&search_sort=0&spq=0&pid=gyne635Y7tCsstjPKvwssc--199259&sid=TyPNbcG5I08AABwmErw

가우스 기호와 가우스 함수의 유형들
http://blog.naver.com/PostView.nhn?blogId=specialedit&logNo=20102784023

가우스 함수 그리는 방법 동영상
http://blog.naver.com/phc1112/80102817847

가우스 랜덤 함수의 필요성(게임에서의 적용)
http://scosco.com.ne.kr/Gauss.htm

가우스 함수 그래프
http://blog.naver.com/pinecloud/60140914311

자연대수 e(exp)에 대하여 (무슨말인지 잘 몰겠음.ㅜㅜ.)
http://blog.daum.net/heegonwoo/13378625

표준정규분포(가우스분포)에 따른 랜덤수 발생기
http://sangq.tistory.com/12

가우스 적분에 대한 내용 (학원 사이트인듯.. 좋은자료.ㅇㅇ.)
http://www.jultak.net/info/edunews_detail1.asp?cat=7&id=537

Bloom Effect (해골책 참조)
http://blog.naver.com/hermet/58261272

정규분포, 표준정규 분포에 관한 글
http://blog.daum.net/cefotaxime/20


위의 링크를 죄다 읽어보면 가우스 함수, 가우스 분포에 대해서 대략 알 수 있다.

                        
가우스 함수의 그래프는 위와 같은 모양이 되며 표준편차값(분산값)이 크면 완만해 지며 작으면 날카로워진다.

가우스 함수의 특징중 하나가 수학적으로 깔끔하게 세로 방향과 가로 방향의 필터링을 분리할 수 있다는 것인데
이는 1차원 가우스 분포 함수와 2차원 가우스 분포 함수를 보면 알 수 있다.
1차원 가우스 분포 함수와 2차원 가우스 분포함수에 대한 그림은 해골책 654,655 페이지에 있다.

추가적으로 가우스 함수를 사용해서 블러를 표현하는 방법에 대한 논의는 아래를 참고하면 될 듯 하다.
http://3dapi.com/dv16_shader4/

블러 효과에 대한 기본 개념
http://chulin28ho.egloos.com/3689611

가우시안 필터
http://scosco.com.ne.kr/Stereo3DHtml/vr_0003_gaussian.htm

실제 구현
--------------------------------------------------------------------------------------------------------
이전 방식들(박스 샘플링)과의 차이점은 이전 방식에서는 2차원적으로 샘플링 포인트를 선택해 합성했지만
가우스 필터에서는 1차원적으로 합성하는 텍셀에 대해서 가우스 함수에 의한 가중치를 붙여 합성한다는 것이다.

우선 가로 뭉개기 부터 샘플링 하자.
vs에서 ps로 넘겨줄 수 있는 텍스쳐 좌표수는 8개 까지므로 이를 ps로 넘겨주면 이전 64박스처럼 옆으로 옮겨서 샘플링 한다.

 


그림에서 가운데(0,0)를 기준으로 왼쪽으로 -1, -3, -5 .. -15 위치에 있다.
그리고 좌우 가우스 분포에 따라 좌우대칭이다.
그림에서도 이를 강조하기 위해 같은 색의 점으로 좌우를 표시해 뒀다.
즉, vs에서 8개 좌표를 넘길 수 있으므로 왼쪽 8개의 좌표를 넘기고
ps에서는 가중치(weight)를 붙여 텍셀을 합성한다.
좌우 대칭이므로 같은 거리만큼 떨어진 텍셀에는 같은 가중치를 준다.

그럼 우리에게 필요한 이 가중치 값은 어떻게 계산되는가?
가중치는 가우스 함수에 규격화 상수를 적용한 값이며 규격화 상수는
모든 색이 동일한 조건일 때 적용하더라도 색이 변함없도록 결정되어야 하는데
이 조건은 가중치의 합계가 1이 되면 된다.

공식대로 가중치 테이블을 구해 이 가중치 합계가 1이 되게 total로 나눠서 정규화 한다.
FLOAT total=0;
for( i=0; i<CNT_WEIGHT; i++ )
{
    FLOAT pos = 1.0f+2.0f*(FLOAT)i;
    m_tbl[i] = expf(-0.5f*(FLOAT)(pos*pos)/dispersion);
    total += 2.0f*m_tbl[i];
}
 // 정규화
 for( i=0; i<CNT_WEIGHT; i++ ) m_tbl[i] /= total;

렌더링 방법
1. 현재 렌더타겟 저장.
2. 새로 만들어 둔 렌더타겟 지정.
3. 1패스 : 렌더링 타겟 만들기 (메시들 렌더링)
4. 2패스 : X방향으로 뭉개기.Y방향으로 뭉개기.
5. 렌더타겟 복구.
--------------------------------------------------------------------------------------------------------

DirectX shader 프로그래밍 책
http://www.t-pot.com/   이곳에서 Programming/Gaussain Filter 참조.

'Study > M's Lecture' 카테고리의 다른 글

3. 왜 물은 물처럼 보이는 걸까?  (0) 2013.01.17
2. 왜 물은 물처럼 보이는 걸까?  (0) 2012.12.14
1. 왜 물은 물처럼 보이는 걸까?  (0) 2012.12.14
감마 보정 (gamma correction)  (0) 2012.02.27
벡터  (0) 2012.02.10
TAGS.

Comments