음영법 최 수 미 smchoi@sejong.ac.kr http://www.sejong.ac.kr/~smchoi
조명과 재질 조명과 반사를 물리적으로 완전히 모델링 하는 방정식을 세우고 푸는 것은 불가능 조명과 반사를 물리적으로 완전히 모델링 하는 방정식을 세우고 푸는 것은 불가능 Phong 반사모형 : 물리적 정확성과 계산효율의 절충
조명 모형 복잡한 조명방정식 거의 불가능 전역적 모형 그래픽스 파이프라인에 부적합 단순화 국지적 모형 : 표면상의 한 점은 다른 표면 상의 점들에 독립적임 복잡한 조명방정식 거의 불가능 전역적 모형 그래픽스 파이프라인에 부적합 광선추적(ray tracing), 방사성(radiosity) 국지적 음영모형 조명모형, 표면모형 단순화 단순화
조명 모형 전역적 모형, 국지적 모형 국지적 모형의 생략 : shadows, inter-object reflection, refraction, i.e. the bending of light at translucent surfaces, volumetric effects of participating media such as air, water, and fog global illumination non-global illumination
인간
컴퓨터
(Translucent surfaces) 광-재질 상호작용 : 표면의 종류 전반사면 (Specular surfaces) 난반사면 (Diffuse surfaces) 반투명면 (Translucent surfaces)
광원 광원의 위치 (x, y, z) 방사의 방향 I (, ) 각 파장 에서 방사되는 에너지의 세기 l 의 방향 코사인 : cos, cos, cos. 각 파장 에서 방사되는 에너지의 세기 조도 함수(illumination function) I ( x, y, z, , , )
I ( x, y, z, , , ) 광원에 의한 총 기여도 :
색 광원 색 광원 광원은 주파수 의 연속함수이지만 단순한 R-G-B모형을 사용한다.
광원의 종류 주변광(ambient light) 2) 점광원(point source) 3) 집중광선(spotlight) 4) 원거리 광원(distant light)
주변광 균일한 조명 환경 내의 각 점에서의 주변 광도를 가정 그 장면의 모든 점에서 동일한 빛의 세기에 의하여 규정
점광원 점광원 모든 방향으로 균일하게 빛을 방사 대비가 큰 이미지가 만들어진다 예> 달의 분화구
실제로는 광원이 유한한 크기를 가지고 있으므로 좀더 부드러운 이미지가 만들어짐 장면에 주변광을 추가함으로써 점광원으로 부터 발생하는 높은 대비 효과를 완화할 수 있음 - 거리의 제곱에 반비례하는 식을 다음과 같이 변경하여 보다 부드러운 조명으로 개선 암영부 반영부 실세계에서는 점광원 보다는 한정된 크기의 광원 (더 부드러운 이미지)
점 광원으로 부터 나오는 빛이 보여질 수 있는 각도 제한에 의해 구성 가능 집중 광선 점 광원으로 부터 나오는 빛이 보여질 수 있는 각도 제한에 의해 구성 가능 집중 광선의 감쇄 집중 광선 지수 ( e 가 감쇄도를 제어)
원거리 광원 점광원 평행광원
Phong 반사 모형 물리적 정확성과 계산효율의 절충 모형 그래픽스 파이프라인에 적합 사용자가 장면을 효과적으로 제어할 수 있음 법선 관측자 점광원 또는 분산광원의 경우 광원상의 한점 I로부터 완전 반사된 광원의 방향 (n과 I에 의해 결정) Phong 모형에서 사용되는 벡터들
광선과 표면의 상호작용 광선 표면 주변광 난반사 표면상의 한 점에서 I = I (난반사) + I (전반사) 방향광 전반사
점 p에서 I번째 광원에 대한 33 조도행렬 반사항 행렬-각 점에서 재질, 표면방향, 관측자와의 거리에 의존
색 광원의 기여도 : 주변광 요소, 난반사광 요소, 전반사광 요소 표현 단순화 : 각 광원 및 각 원색에 대해 동일한 경우 전역적인 주변광이 추가된 경우 전역적인 주변광의 적색 성분
주변 반사 주변광에 의한 난반사 (ambient reflection) 주변광의 세기는 표면의 모든 점에서 똑같다. 주변광의 세기는 표면의 모든 점에서 똑같다. 주변반사계수 : 반사되는 것의 총계
난반사 방향광에 의한 난반사 (diffuse reflection) 거친 표면 관측 각도에 무관 광선의 방향에 의존적
난반사면의 조명 정오 오후
Lambert의 법칙 정오 오후
거리d 에 의한 감쇄를 포함하면
전반사 방향광에 의한 전반사 (specular reflection) 부드러운 표면 예> 백색광 아래에서 본 적색의 공은 백색의 하이라이트를 갖음
거울 는 광택 계수 전반사광 방향 관측자
전체적인 효과 각 광원에 대해서 각 색 성분에 대해서 Phong 모형
벡터의 계산 법선 벡터 반사각 중간 벡터 투과된 빛
법선 벡터 평면의 법선 평면의 식이 로 주어질 때 P0 P n 으로부터 동차좌표로는
동일 직선상에 있지 않은 평면 상의 세 점으로 주어질 때 n * 순서 주의 : 오른손 좌표계
곡면의 경우 곡면이 함축식(implicit equation)으로 표현된 경우
곡면의 경우 곡면이 매개변수(parametric equation) 형식으로 표현된 경우
u v z x y 예) 구의 경우 v cos u x y 접면 (tangent plane)
glNormal3fv(pointer_to_normal); OpenGL 에서 정점에 법선 할당 glNormal3f(nx,ny,nz); glNormal3fv(pointer_to_normal); 법선들은 모드 변수 일련의 정점들을 정하기 전에 법선을 정의하면 이 법선은 모든 정점들과 연결됨 모든 정점들의 조명 계산에 사용될 수 있음
반사각
중간 벡터의 사용 전반사의 계산에서 을 모든 점에서 재계산 중간벡터를 이용한 근사치
투과된 빛 Snell의 법칙 동일평면 의 조건
다각형 음영 세 가지 음영법 1) 평면 음영법 2) Gouraud 음영법 3) Phong 음영법
평면 음영법 평면 음영법 (Flat shading) 또는 균일 음영법 (constant shading) 가정: 원거리 광원 가정: 원거리 광원 원거리 관측자 n, l, v : 상수
각 다각형에 대해서 음영계산이 한번만 이루어짐 glShadeModel(GL_FLAT) 다각형의 첫번째 정점의 법선을 사용함
Mach 띠
보간 음영과 Gouraud 음영법 알고리즘 각 정점에 대해서 인접한 다각형들을 찾는다. 그 정점에서 법선을 계산 음영 계산 다각형 내의 각 화소에 대해서 음영을 보간 메쉬들을 표현하는 자료구조 하드웨어 구현
각 정점에서 법선의 계산
n1 => L1 n2 => L2 n4 => L4 n3 => L3 L = interpolate (L1, L2, L3, L4)
플랫 셰이딩보다는 부드러움 마하 밴드 효과는 그대로 남아있음. 경우에 따라서 오류
Phong 음영법 알고리즘 각 정점에 대해서 인접한 다각형들을 찾는다. 그 정점에서의 법선을 계산 다각형 내의 각 화소에 대해서 법선을 보간 음영을 계산 더 많은 계산량, 하드웨어 구현이 더 어려움
법선의 보간
플랫, 구로, 퐁 구로, 퐁
미세면 모델(Microfacet Model) 플랫, 퐁, 블린, 쿡/토렌스 블린 셰이딩 퐁 셰이딩과 유사.경면광 성분이 더욱 부드럽게 퍼져나감. 광원이 거의 물체면과 나란히 예각으로 입사한 것과 유사 쿡/토렌스 셰이딩(메탈 셰이딩) 금속표면의 은은한 경면광 처리에 유리. cf. 퐁 모델: 플라스틱 재질 처리에 유리
광택계수(Shineness Coefficient)
Attenuation Function a = b = 0, c = 1, a = b = .25, c = .5 , a = c = 0, b = 1
확산계수, 경면계수, 광택계수 확산계수 0.01, 0.3, 0.7 경면계수 0.0, 0.4, 0.8 광택계수 5, 40, 100
지역반사 모델
지엘의 조명 1. 광원이 여러 개인 경우는 각각의 광원에서 나오는 빛을 모두 합산 2. R, G, B 색에 대해 별도로 적용하여 합산 3. 광원특성은 반사광 종류별로 Ia, Id, Is 4. 물체특성은 반사광 종류별로 Ka, Kd, Ks
지역 조명모델 알고리즘 For Each Object of the Scene { 모든 물체에 대해 For Each Polygon Mesh of the Object { 모든 다각형에 대해 Calculate N, L, V, R, D; 벡터 및 거리 계산 For Each Light Source { 모든 광원에 대해 For Ambient Reflection 주변반사에 대해 Calculate R, G, B Reflection Separately; 색별로 계산 For Diffuse Reflection 확산반사에 대해 For Specular Reflection 경면반사에 대해 Add R, G, B Colors Separately; 주변광, 확산광, 경면광을 합산 } Add R, G, B Colors Separately; 모든 광원의 영향을 합산 } }
순환적 분할에 의한 구의 근사 구는 그래픽스에서 중요한 기본요소이다. GL 은 구를 지원하지 않는다. GLU 이차 곡면으로 지원 GLUT 다각형 근사로 지원 하나의 방법은 정 사면체로 시작 각 삼각형을 분할 정점들을 단위 구에 맞춤 16개의 삼각형이 됨 위의 과정을 n회 반복
OpenGL의 광원 4가지 형태의 광원 지원, 8개 까지의 광원을 허용 glLightfv(source, parameter, pointer_to_array); glLightf(source, parameter, value); 첫번째 광원 GL_LIGHT0을 지정, 점(1.0, 2.0, 3.0)에 배치 GLfloat light_0_pos[] = {1.0, 2.0, 3.0, 1.0}; 네번째 성분을 0으로 하면, 방향벡터를 가진 원거리 광원 GLfloat light_0_dir[] = {1.0, 2.0, 3.0, 0.0};
GLfloat light_0_pos[] ={ 1.0, 2.0, 3.0, 1.0}; GLfloat diffuse_0[] = {1.0, 0.0, 0.0, 1.0}; /* R 난반사 */ GLfloat ambient_0[] = {1.0, 0.0, 0.0, 1.0}; /* R 주변광 */ GLfloat specular_0[] = {1.0, 1.0, 1.0, 1.0};/* W 전반사 */ glEnable(GL_LIGHTING); /* 조명 인에이블 */ glEnable(GL_LIGHT0); /* 광원 인에이블 */ glLisghtfv(GL_LIGHT0, GL_POSITION, light_0_pos); glLisghtfv(GL_LIGHT0, GL_AMBIENT, ambient_0); glLisghtfv(GL_LIGHT0, GL_DIFFUSE, diffuse_0); glLisghtfv(GL_LIGHT0, GL_SPECULAR, specular_0);
* 어떠한 광원에도 독립적인 전역적 주변광 추가 GLfloat global_ambient[] = {0.1, 0.1, 0.1, 1.0}; glLightModelfv(GL_LIGHT_MODEL_AMBIENT, global_ambient); 거리항은 거리-감쇄 모형에 기초 glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, a); glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, b); glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, c);
OpenGL에서는 관측자가 한 장면에서 무한대의 거리에 있다고 가정 만일 완전한 조명계산을 원한다면 관측자의 실제 위치를 사용 glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE); OpenGL이 양면 모두를 올바르게 렌더링할 수 있도록 함 glLightModel(GL_LIGHT_MODEL_TWO_SIDED, GL_TRUE);
OpenGL에서 재질의 지정 glMaterialfv(face, type, pointer_to_array); glMaterialf(face, value); /* 작은양의 백색 주변반사 */ GLfloat ambient[] = {0.2, 0.2, 0.2, 1.0}; GLfloat diffuse[] = {1.0, 0.8, 0.0, 1.0}; /* 황색 난반사 */ GLfloat specular[] = {1.0, 1.0, 1.0, 1.0}; /* 백색 전반사 */ /* 전면과 후면에 대한 재질 특성 설정 */ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffuse); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 100.0);
* OpenGL은 또한 스스로 빛을 내는 광원의 특성인 방사성(emissive) 요소를 가지는 표면을 정의 GLfloat emission[] = 0.0, 0.3, 0.3, 1.0; glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, emission); 작은양의 청-녹색의 방사
구 모델의 음영 처리 * 삼각형의 세 점으로 법선을 결정하고 첫번째 정점에 이 법선을 할당하여 평면 음영처리 cross(point3 a, point3 b, point3 c, point3 d) { d[0]=(b[1]-a[1])*(c[2]-a[2])-(b[2]-a[2])*(c[1]-a[1]); d[1]=(b[2]-a[2])*(c[0]-a[0])-(b[0]-a[0])*(c[2]-a[2]); d[2]=(b[0]-a[0])*(c[1]-a[1])-(b[1]-a[1])*(c[0]-a[0]); normal(d); } void normal(point p) {/* normalize a vector */ double sqrt(); float d =0.0; int i; for(i=0; i<3; i++) d+=p[i]*p[i]; d=sqrt(d); if(d>0.0) for(i=0; i<3; i++) p[i]/=d;
광원이 정의되고 인에이블 되어 있다고 가정하고 triangle 루틴을 변경하여 음영 처리된 구를 만들 수 있음 void triangle(point3 a, point3 b, point3 c) { point3 n; cross(a, b, c, n); glBegin(GL_POLYGON); glnormal3fv(n); glVertex3fv(a); glVertex3fv(b); glVertex3fv(c); glEnd; } 평면 음영 처리된 구
표면상의 각 점 p에서의 법선이 원점에서 p를 향하는 방향을 가지므로 보간 음영법을 구 모델에 쉽게 적용할 수 있음 각 정점에 실제 법선을 할당할 수 있고 OpenGL은 각 삼각형에 대해 이 정점들에서의 음영을 보간 void triangle(point3 a, point3 b, point3 c) { point3 n; int I; glBegin(GL_POLYGON); for (i=0; i<3; i++) n[i]=a[i]; normal(n); glNormal3fv(n); glVertex3fv(a); for (i=0; i<3; i++) n[i]=b[i]; glVertex3fv(b);
for (i=0; i<3; i++) n[i]=c[i]; normal(n); glNormal3fv(n); glVertex3fv(c); glEnd(); } 실제 법선들에 의한 구의 음영처리
전역적 렌더링 원거리 광원에 의해 조명 되는 구의 배열 광원에 더 가까운 구는 광원으로부터 오는 빛의 일부가 다른 구에 도달하는 것을 막음 국지적 모형을 사용한다면, 각 구는 독립적으로 음영 처리되어 관측자에게 모두 동일하게 보임 전역적 조명 모델 국지적 조명 모델
광선 추적 무한대 (배경색) 표면에 부딪치는 광선 (교차점에 대해 음영 계산) 광원을 떠난 광선들 광선 투사 모형
거울이 있는 광선 추적 입사광의 나머지는 투과광선과 반사광선 1) 표준 반사 모형을 사용해서 광원의 그 점에 대한 기여도 계산 2) 완전 반사 방향으로 광선을 투사 3) 투과되는 방향으로 광선을 투사
광선 트리
광선 추적 반사와 투과 둘 다를 가진 표면을 다루기에 적합 높은 반사율을 가진 환경에 가장 적합
방사성 (Radiosity) 완전 난반사면으로 이루어진 장면에 이상적임 산란-산란 작용 (diffuse-diffuse interaction)
방사성 (Radiosity)
장면을 완전 난반사하고 고정 음영으로 렌더링 된다고 가정하는 작은 평면 다각형 (patch)로 분해 -> 이 음영을 찾음 빛 에너지가 한 단편을 떠나 다른 단편에 어떻게 영향을 주는지를 가리키는 형태계수 결정 적분 방정식에서 시작한 렌더링 수식을 그 면의 방사성에 대한 선형 방정식의 집합으로 바꿈