Transcript 그래픽스고급_발표3
Ambient Occlusion
발표자 : 정광일
일 시 : 05.06
개요
•
•
•
•
Ambient Occlusion이란?
Ambient Occlusion 예제
Ambient Occlusion 적용방법
기타 다른 방법의 Ambient Occlusion
Ambient Occlusion?
• 셰이딩의 한 방법으로서 주변광 계산에 대
한 모델
• 자기자신, 또는 주변 모델에 의해 가려지
는 빛의 정도를 나타냄
• 즉, 모델의 차폐도를 나타내는 방법
• 셀프셰도잉 가능
• 적용시 어두운 부분을 더욱더 어둡게 표현
Ambient Occlusion?
• Ambient 는 전역 조명 모델 (상수값)
• 모델의 정점당 Occlusion Term 할당
– 단, ( 0 <= Occlusion_Term <= 1 )
• 빛 계산 모델
– It = Ia * Occ_Term + Id + Is
Ambient Occlusion 예제
Ambient Occlusion 적용방법
• Static Ambient Occlusion 방식
– 1. 정점당 Occ_Term 계산
• Ray Tracing 를 사용한 전처리 계산
– 2. Vertex Shader를 사용하여 Occ_Term적용
• Shader 의 Attribute 변수를 사용하여 정점당
Occ_Term 적용
Ambient Occlusion 적용방법
• 1. 정점당 Occ_Term 계산
– 한 정점에서 많은 수의 Ray를 생성
– Ray가 모델과 부딫히는지 검사
– Occ_Term = 충돌하지 않은 Ray 의 수
모든 Ray 의 수
Ambient Occlusion 적용방법
• 1. 정점당 Occ_Term 계산
– 컨셉
Non Occluded Area
Occluded Area
Occluded Area
Polygon Surface
Ambient Occlusion 적용방법
• 1. 정점당 Occ_Term 계산
– Ray intersect triangle
– 1. 세 점 v1,v2,v3 를 가지고 평면의 방정식 L
를 만든다
– 2. 평면과 반직선의 교점 P를 찾는다
– 3. 교점 P가 삼각형 내부에 있는지 외부에 있
는지 판별한다
Ambient Occlusion 적용방법
• 1. 정점당 Occ_Term 계산
– 1. 평면 L
• L = P∙N + d = 0
• N = ( v1 – v0 ) X ( v2 – v0 )
v0
• d = -N ∙ v0
v1
v2
Ambient Occlusion 적용방법
• 1. 정점당 Occ_Term 계산
– 2. 반직선 R
•
•
•
•
R(t) = P0 + tV
P0 : 시작위치
V : 방향벡터
t : 시간
V
P0
Ambient Occlusion 적용방법
• 1. 정점당 Occ_Term 계산
– 3. 반직선과 평면과의 교점 P, t
• t = - (P0 ∙ N + d) / V ∙ N
• P = P0 + tV
P0
n
V
P
Ambient Occlusion 적용방법
• 1. 정점당 Occ_Term 계산
– 4. 교점 p 가 삼각형 내부에 있는지 판별
hit
miss
Ambient Occlusion 적용방법
• 1. 정점당 Occ_Term 계산
– 4. 교점 p 가 삼각형 내부에 있는지 판별
• 삼각형의 각 점에서 P로 연결한 작은 삼각형들의
와인딩 검사
v0
v0
ccw
ccw
cw
ccw
ccw
ccw
v1
v2
v1
v2
Ambient Occlusion 적용방법
• 1. 정점당 Occ_Term 계산
– 4. 교점 p 가 삼각형 내부에 있는지 판별
• ( v1 – v0 ) X ( p – v0 ) ∙ n >= 0
• ( v2 – v1 ) X ( p – v1 ) ∙ n >= 0
v0
v0
• ( v0 – v2 ) X ( p – v2 ) ∙ n >= 0
ccw
ccw
cw
ccw
ccw
ccw
v1
v2
v1
v2
Ambient Occlusion 적용방법
• 2. Vertex Shader를 사용한 Occ_Term적용
– Application
•
•
•
•
•
loc = glGetAttribLocation(p, "occ");
…
glVertexAttrib4f(loc , 0, 0, 0, …occ);
glVertex3fv( … );
…
Ambient Occlusion 적용방법
• 2. Vertex Shader를 사용한 Occ_Term적용
– Vertex Shader
• attribute vec4 occ;
•
•
•
•
…
ambient = gl_LightSource[0].ambient;
gl_FrontColor = ambient * occ.w;
…
기타 다른 방법의 AO
• Ambient Occlusion Fields
• SSAO (Screen Space Ambient Occlusion)
– Crysis에서 처음으로 선보였음
– 순수하게 GPU 만으로 수행됨 (실시간 처리 )
– screen space에서의 각 pixel에 대하여 그 pixe
l 의 주변 pixel을 샘플링하고,
샘플링된 pixel들과의 depth 차이에 의해 occl
usion의 정도를 결정