520 likes | 1.01k Views
Lecture #9. 제 6장. 음영법( Shading). 개 요. 음영이 없으면 3차원 물체도 2차원 이미지로 보일 수 있다 빛과 면사이의 상호 관계를 모델에 추가 광원의 모형 광-재질 상호 작용의 모형 국지적 조명 모델만 고려 전역적 조명 모델. 강의 내용. 조명과 재질 광원 Phong 반사 모형 벡터의 계산 다각형 음영 OpenGL 의 광원 OpenGL 에서 재질의 지정 순환적 분할에 의한 구의 근사 구 모델의 음영 처리. 조명과 재질.
E N D
Lecture #9 제 6장. 음영법(Shading)
개 요 • 음영이 없으면 3차원 물체도 2차원 이미지로 보일 수 있다 • 빛과 면사이의 상호 관계를 모델에 추가 • 광원의 모형 • 광-재질 상호 작용의 모형 • 국지적 조명 모델만 고려 전역적 조명 모델
강의 내용 • 조명과 재질 • 광원 • Phong 반사 모형 • 벡터의 계산 • 다각형 음영 • OpenGL의 광원 • OpenGL에서 재질의 지정 • 순환적 분할에 의한 구의 근사 • 구 모델의 음영 처리
조명과 재질 조명과 반사를 물리적으로 완전히 모델링 하는 것은 불가능 단순화 전역적 방법으로 근사(광선 추적, 방사성 기법) : 그래픽스 파이프라인에 부적합 단순화 국지적 조명 모델(Phong 반사모형 등) : 물리적 정확성과 계산효율의 절충 • A와 B 사이에 무수한 반사작용이 발생 • 모델링 불가능 • 단순화가 필요
조명 모형 • 전역적 모형 • 광원과 표면 사이의 다중 상호 작용 고려 • 방사성 기법, 광선 추적 기법 등 • 국지적 모형 • 광원과 표선 사이의 단일 상호 작용만을 고려 • 표면상의 한 점과 광원 사이의 상호작용은 다른 표면상의 점들에 독립적 • 두개의 모형으로 구성 • 광원 모형 : 장면에서 사용하는 광원을 모델링 • 반사 모형 : 장면의 반사면과 빛 사이의 상호작용을 모델링
빛과 표면 • 인간 광원의 색 객체 표면의 색
빛, 표면과 컴퓨터 이미지 • 컴퓨터 많은 광선들은 투영면의 절단 사각형을 통과하지 않음 관측자를 투영면으로 대치
표면의 종류 전반사면 난반사면 반투명면
광 원 • 광원 : 위치 (x, y, z) , 방향 (, ), 파장 • 조도함수 : I ( x, y, z, , , )
I ( x, y, z, , , ) 광원에 의한 총 기여도 : 백열 전구 광원 계산이 어려움 : 단순화된 광원 모델이 필요
색광원 • 광원은 주파수 의 연속함수이지만 단순한 R-G-B모형을 사용한다.
광원의 종류 1) 주변광(ambient light) 2) 점광원(point source) 3) 집중광선(spotlight) 4) 원거리 광원(distant light)
주변광 • 균일한 조명 • 실내의 객체들간의 다중 상호작용에 의해 형성된 조명을 모델 • 객체의 모든 점에서 동일한 세기의 빛을 받음 • 주변광(Ambient Light) • 환경 내의 각 점에서의 주변 광도를 정의
점광원 (1) • 모든 방향으로 균일하게 빛을 방사 조도는 거리의 제곱에 반비례
암영부 반영부 점광원 (2) • 대비가 큰 이미지가 만들어진다 • 실제의 광원은 유한한 크기를 가지고 있으므로 좀 더 부드러운 이미지가 만들어진다 • 주변광을 사용하여 높은 대비 효과를 완화시킬 수 있다 • 부드러운 조명을 위해 거리항을 수정
Is f S 가 180이면 점광원이 됨 f e I cos ( e 가 감쇄도를 제어) 집중광선 (1) • 작은 각도로만 빛을 방출 e : 집중광선 지수
집중광선 (2) • 두 단위 벡터가 주어졌을 경우 cos 값 계산
원거리 광원 • 점광원 • 표면상의 각 점으로부터 광원으로의 방향을 계산해야 함 (많은 시간 소요, 보다 좋은 화질) • 원거리 광원 • 방향을 한번만 계산(빠른 계산, 화질이 떨어짐) 광원의 위치 광원의 방향 각 점에 대한 방향 동일 원거리 광원 점광원
법선벡터 관측자 광원 완전 반사 방향 Phong 모형에서 사용되는 벡터들 Phong 반사 모형 (1) • 물리적 정확성과 계산효율의 절충 모형 • 그래픽스 파이프라인에 적합 • 실시간으로 음영 효과를 생성 • 사용자가 장면을 효과적으로 제어 가능
Phong 반사 모형 (2) • 세가지 광-재질 상호 작용 지원 • 주변광 반사 • 난반사 • 전반사 • 각 광원이 삼원색에 대하여 별도의 주변광 성분, 난반사광 성분, 전반사광 성분을 갖는다고 가정
Phong 반사 모형 (3) • 표면 점 p에서 i번째 광원에 대한 조도 행렬 • 반사항 행렬 - 각 점에서 재질, 표면방향, 광원 방향, 관측자와의 거리에 의존
Phong 반사 모형 (4) 광원 i에 의한 점 p에서의 적색 세기 모든 광원의 기여도 전역적인 주변광 계산이 각 광원, 각 원색에 동일하므로 간단히 표현
주변반사(ambient reflection) • 주변광의 세기 는 표면의 모든 점에서 같다 • 반사계수
난반사 정오에 더 밝음 일출과 일몰에 어두움 • 거친 표면 • 관측각도에 무관 반사되는 양은 광원의 방향에 의존적
난반사의 수학적 규정 (1) • Lambert 의 법칙
난반사의 수학적 규정 (2) 거리 d에 의한 감쇄를 포함하면
전반사 (1) • 매끄러운 표면 • 반사가 일정 방향으로 됨 • 관측자의 위치에 따라 반사량이 다름 전반사의 입사각과 반사각이 같음
: 광택 계수 전반사 (2)
Phong 반사 모형 예 Phong 모형에 의한 렌더링 - 재질 특성을 이용하여 각 찻잔이 다르게 보임
다각형 음영 • 세 가지 음영법 1) 평면 음영법 2) Gouraud 음영법 3) Phong 음영법 곡면을 다강형의 집합으로 렌더링 함으로써 속도 향상
평면 음영 (균일 음영) • 가정 • 원거리 관측자 • 원거리 광원 • n, l, v : 상수 각 다각형에 대해서 음영계산이 한번만 이루어짐
평면 음영 • glShadeModel (GL_FLAT) • 다각형의 첫번째 정점의 법선을 사용한다 문제점 : 다각형 경계선이 뚜렷하다
Mach 띠(band) • 인간의 시각 시스템의 측면 금제(Lateral Inhibition) 특성 • 빛의 세기 차이에 민감하게 반응 • 눈의 추상체와 시신경이 연결되는 방법에 기인 • 이러한 특성을 극복하기 위해서는 부드러운 음영 처리 기술이 필요
보간 음영과 Gouraud 음영 • 다각형 내의 각 화소에 대한 음영을 개별적으로 계산하는 것은 많은 시간이 소요된다 • 각 정점에 대해서 • 인접한 다각형들을 찾아 다각형들이 공유하는 정점을 정의 • 그 정점에서 법선(다각형들의 법선 평균)을 계산 • 그 정점에서의 음영 계산 • 다각형 내의 각 화소에 대해서 • 음영을 보간 보간법 이용
glShadeModel(GL_FLAT) glShadeModel(GL_SMOOTH) 보간 음영과 평면 음영
보 간 • 정점들의 광도를 보간 n1 => L1 n2 => L2 n4 => L4 n3 => L3 L = interpolate (L1, L2, L3, L4)
메쉬 자료구조 • 정점에 이웃한 다각형들을 찾을 수 있도록 하는 자료 구조
Phong 음영법 • 알고리즘 • 각 정점에 대해서 • 인접한 다각형들을 찾는다 • 그 정점에서의 법선을 계산 • 다각형 내의 각 화소에 대해서 • 법선을 보간 • 음영을 계산 • 더 많은 계산량, 하드웨어 구현이 더 어려움
OpenGL의 광원 (1) • 8개 까지의 광원을 허용 • 각 광원별로 • 광원의 위치 또는 방향 • 주변광, 난반사광, 전반사 광원의 세기 지정 glLightfv(source, parameter, pointer_to_array); glLightf(source, parameter, value); 광원의 위치 GLfloat light_0_pos[] = {1.0, 2.0, 3.0, 1.0}; GLfloat light_0_dir[] = [1.0, 2.0, 3.0, 0.0}; 광원의 방향
OpenGL의 광원 (2) GLfloat light_0_pos[] = {1.0, 2.0, 3.0, 1.0}; GLfloat light_0_dir[] ={ 1.0, 2.0, 3.0, 0.0}; GLfloat diffuse_0[] = {1.0, 0.0, 0.0, 1.0}; GLfloat ambient_0[] ={ 1.0, 0.0, 0.0, 1.0}; GLfloat specular_0[] = {1.0, 1.0, 1.0, 1.0}; glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glLightfv(GL_LIGHT0, GL_POSITION, light_0_pos); glLightfv(GL_LIGHT0, GL_AMBIENT, ambient_0); glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse_0); glLightfv(GL_LIGHT0, GL_SPECULAR, specular_0); 각 광원 종류별 세기 조명 활성화 첫번째 광원 활성화
의 상수값 설정 OpenGL의 광원 (3) • 전역적 주변광 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의 광원 (5) • 점광원 지정 : 디폴트는 원거리 광원 glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE); • 전면과 후면 모두 렌더링 glLightModel(GL_LIGHT_MODEL_TWO_SIDED, GL_TRUE);
glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, int a) 전반사의 광택계수 지정 • 전반사의 광택계수 지정 1 a 128 a = 2.0 a = 25.0
전반사의 범위 지정 glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, float degree) 0 degree 90 degree = 10.0 degree = 30.0
OpenGL에서 재질의 지정 (1) • 재질 지정 함수 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); 표면의 반사 계수
OpenGL에서 재질의 지정 (2) • 표면의 광택 지수 glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 100.0); • 빛을 내는 표면 GLfloat emission[] = 0.0, 0.3, 0.3, 1.0; glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, emission);
Material GL_AMBIENT GL_DIFFUSE GL_SPECULAR GL_SHININESS 결과 Brass 0.32940.22350.02751.0 0.78040.56860.11371.0 0.99210.94120.80781.0 27.89 Bronze 0.21250.12750.0541.0 0.7140.42840.181441.0 0.39350.27190.16671.0 25.6 Chrome 0.250.250.251.0 0.40.40.41.0 0.77460.77460.77461.0 76.8 OpenGL에서 재질의 지정 (3) • 재질 예
Copper 0.19130.07350.02251.0 0.70380.27050.08281.0 0.25680.13760.08601.0 12.8 Gold 0.24730.1995 0.07451.0 0.75160.60650.22651.0 0.0.62830.55580.36611.0 51.2 Pewter 0.10590.05880.11371.0 0.42750.47060.54121.0 0.33330.33330.52161.0 9.85 OpenGL에서 재질의 지정 (4) • 재질 예