Ambient Occlusion 발표자 : 정광일 일 시 : 05.06
개요 Ambient Occlusion이란? Ambient Occlusion 예제 Ambient Occlusion 적용방법
Ambient Occlusion? 셰이딩의 한 방법으로서 주변광 계산에 대한 모델 자기자신, 또는 주변 모델에 의해 가려지는 빛의 정도를 나타냄 즉, 모델의 차폐도를 나타내는 방법 셀프셰도잉 가능 적용시 어두운 부분을 더욱더 어둡게 표현
Ambient Occlusion? Ambient 는 전역 조명 모델 (상수값) 모델의 정점당 Occlusion Term 할당 빛 계산 모델 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 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 ) d = -N ∙ v0 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 n V P0 P
Ambient Occlusion 적용방법 1. 정점당 Occ_Term 계산 4. 교점 p 가 삼각형 내부에 있는지 판별 hit miss
Ambient Occlusion 적용방법 1. 정점당 Occ_Term 계산 4. 교점 p 가 삼각형 내부에 있는지 판별 삼각형의 각 점에서 P로 연결한 작은 삼각형들의 와인딩 검사 ccw v0 v1 v2 ccw cw v0 v1 v2
Ambient Occlusion 적용방법 1. 정점당 Occ_Term 계산 4. 교점 p 가 삼각형 내부에 있는지 판별 ( v1 – v0 ) X ( p – v0 ) ∙ n >= 0 ( v2 – v1 ) X ( p – v1 ) ∙ n >= 0 ( v0 – v2 ) X ( p – v2 ) ∙ n >= 0 ccw v0 v1 v2 ccw cw v0 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에 대하여 그 pixel 의 주변 pixel을 샘플링하고, 샘플링된 pixel들과의 depth 차이에 의해 occlusion의 정도를 결정