620 likes | 849 Views
음 영 (Shading). 음영의 개요. 음영이 없으면 3차원 물체도 2차원 이미지로 보일 수 있음 빛과 면사이의 상호 관계를 모델에 추가 광원 재질. 음영 (Shading). 조명과 재질 광원 Phong 반사 모형 벡터의 계산 다각형 음영 순환적 분할에 의한 구의 근사 OpenGL 의 광원 OpenGL 에서 재질의 지정 구 모델의 음영처리 전역적 렌더링. 조명과 재질. 조명과 반사를 물리적으로 완전히 모델링 하는 것은 불가능. 단순화.
E N D
음영의 개요 • 음영이 없으면 3차원 물체도 2차원 이미지로 보일 수 있음 • 빛과 면사이의 상호 관계를 모델에 추가 • 광원 • 재질
음영 (Shading) • 조명과 재질 • 광원 • Phong 반사 모형 • 벡터의 계산 • 다각형 음영 • 순환적 분할에 의한 구의 근사 • OpenGL의 광원 • OpenGL에서 재질의 지정 • 구 모델의 음영처리 • 전역적 렌더링
조명과 재질 조명과 반사를 물리적으로 완전히 모델링 하는 것은 불가능 단순화 전역적 방법으로 근사(광선 추적, 방사성 기법) : 그래픽스 파이프라인에 부적합 단순화 국지적 조명 모델(Phong 반사모형 등) : 물리적 정확성과 계산효율의 절충 A와 B 사이에 무수한 반사작용이 발생
조명 모형 • 전역적 모형 • 광원과 표면 사이의 다중 상호 작용 고려 • 국지적 모형 • 광원과 표선사이의 단일 상호 작용만을 고려 • 표면상의 한 점은 다른 표면상의 점들에 독립적
빛과 표면 • 인간
빛, 표면과 컴퓨터 이미지 • 컴퓨터 많은 광선들은 투영면의 절단 사각형을 통과하지 않음 관측자를 투영면으로 대치
표면의 종류 전반사면 난반사면 반투명면
음영 (Shading) • 조명과 재질 • 광원 • Phong 반사 모형 • 벡터의 계산 • 다각형 음영 • 순환적 분할에 의한 구의 근사 • OpenGL의 광원 • OpenGL에서 재질의 지정 • 구 모델의 음영처리 • 전역적 렌더링
광원 (Light Sources) • 광원 : 위치 (x, y, z) , 방향 (, ), 파장 • 조도함수 : I(x, y, z, , , )
I ( x, y, z, , , ) 광원에 의한 총 기여도 : 백열 전구 광원 계산이 어려움 : 단순화된 광원 모델이 필요
색 광원 • 광원은 주파수 의 연속함수이지만 단순한 R-G-B모형을 사용한다.
광원의 종류 • 주변광(Ambient Light) • 점광원(Point Light Source) • 집중광선(Spot Light) • 원거리 광원(Distant Light)
주변광 (Ambient Light) • 균일한 조명 • 실내의 객체들간의 다중 상호작용에 의해 형성된 조명을 모델 • 객체의 모든 점에서 동일한 세기의 빛을 받음
점광원 (Point Light Source) • 모든 방향으로 균일하게 빛을 방사 조도는 거리의 제곱에 반비례
암영부 반영부 점광원 (con’t) • 대비가 큰 이미지가 만들어진다 • 실제의 광원은 유한한 크기를 가지고 있으므로 좀더 부드러운 이미지가 만들어짐 • 주변광을 사용하여 높은 대비 효과를 완화시킬 수 있음 • 부드러운 조명을 위해 거리항을 수정
Is f S 가 180이면 점광원이 됨 f e I cos ( e 가 감쇄도를 제어) 집중광선 (Spot Light) • 작은 각도로만 빛을 방출 e : 집중광선 지수
집중광선 (con’t) • 두 단위 벡터가 주어졌을 경우 cos 값 계산
원거리 광원 • 점광원 • 표면상의 각 점으로부터 광원으로의 방향을 계산해야 함 (많은 시간 소요, 보다 좋은 화질) • 원거리 광원 • 방향을 한번만 계산(빠른 계산, 화질이 떨어짐) 광원의 위치 광원의 방향 각 점에 대한 방향 동일 점광원 원거리 광원
음영 (Shading) • 조명과 재질 • 광원 • Phong 반사 모형 • 벡터의 계산 • 다각형 음영 • 순환적 분할에 의한 구의 근사 • OpenGL의 광원 • OpenGL에서 재질의 지정 • 구 모델의 음영처리 • 전역적 렌더링
법선벡터 관측자 광원 완전 반사 방향 Phong모형에서 사용되는 벡터들 Phong 반사 모형 • 물리적 정확성과 계산효율의 절충 모형이다. • 그래픽스 파이프라인에 적합
Phong 반사 모형 (con’t) • 세가지 광-재질 상호 작용 지원 • 주변반사 • 난반사 • 전반사 • 각 광원이 삼원색에 대하여 별도의 주변광 성분, 난반사광 성분, 전반사광 성분을 갖는다고 가정
Phong 반사 모형 (con’t) • 점 P에서i 번째 광원의 조도 행렬 • 점 P에서의 반사항 행렬
Phong 반사 모형 (con’t) • 광원 i 에 의한 P에서의 적색 세기 • 점 P에서 적색 세기 • 점 P의 색의 세기
주변반사 (Ambient Reflection) • 주변광의 세기 는 표면의 모든 점에서 같다 • 반사계수 • 0에서 1사이의 상수 • 표면의 재질에 따라 다름
난반사 (Diffuse Reflection) 정오에 더 밝음 일출과 일몰에 어두움 • 거친 표면 • 관측각도에 무관 반사되는 양은 광원의 방향에 의존적
난반사 (con’t) • 거리 d에의한 감쇄를 포함하면
전반사 (Specular Reflection) • 매끄러운 표면 • 반사가 일정 방향으로 됨 • 관측자의 위치에 따라 반사량이 다름 전반사의 입사각과 반사각이 같음
: 광택 계수 전반사 (con’t)
Phong 모형 Phong 모형에 의한 렌더링 - 재질 특성을 이용하여 각 찻잔이 다르게 보임
음영 (Shading) • 조명과 재질 • 광원 • Phong 반사 모형 • 벡터의 계산 • 다각형 음영 • 순환적 분할에 의한 구의 근사 • OpenGL의 광원 • OpenGL에서 재질의 지정 • 구 모델의 음영처리 • 전역적 렌더링
다각형 음영 • 세 가지 음영법 1) 평면 음영법 2) Gouraud 음영법 3) Phong 음영법 곡면을 다각형의 집합으로 렌더링 함으로써 속도 향상
평면 음영 (균일 음영) • 가정 • 원거리 관측자 • 원거리 광원 • n, l, v : 상수 각 다각형에 대해서 음영계산이 한번만 이루어짐
평면 음영 (con’t) • glShadeModel (GL_FLAT) 문제점 : 다각형 경계선이 뚜렷함
glShadeModel(GL_FLAT) glShadeModel(GL_SMOOTH) Gouraud 음영 • 평면음영과 Gouraud 음영 • 한 다각형의 음영 계산에 인접한 다각형을 고려 • 다각형 내의 각 화소가 서로 다름 음영 값을 가짐
Gouraud 음영의 원리 • 다각형 내의 각 화소에 대한 음영을 개별적으로 계산하는 것은 많은 시간이 소요됨 다각형의 정점에서만 음영 계산 • 다각형 내의 각 화소에 대해서 정점의 음영을 보간
각 정점에서 법선의 계산 • 각 정점에 대해서 • 인접한 다각형들의 법선을 평균 • 정점에서의 음영 계산
n0 => c0 n1 => c1 n3 => c3 n2 => c2 보간 (Interpolation) • 정점들의 광도를 보간 N : 법선 벡터 C : 음영
Phong 음영법 • 알고리즘 • 각 정점에 대해서 • 인접한 다각형들을 찾는다. • 다각형의 법선을 보간함으로써 정점에서의 법선을 계산 • 다각형 내의 각 화소에 대해서 • 법선을 보간 • 음영을 계산 • 더 많은 계산량, 하드웨어 구현이 더 어려움
음영 (Shading) • 조명과 재질 • 광원 • Phong 반사 모형 • 벡터의 계산 • 다각형 음영 • 순환적 분할에 의한 구의 근사 • OpenGL의 광원 • OpenGL에서 재질의 지정 • 구 모델의 음영처리 • 전역적 렌더링
OpenGL의 광원 • 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}; 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); 광원 위치 광원방향 각 종류 별 세기 조명 활성화 첫번째 광원 활성화
의 상수값 설정 광원 사용 방법 (con’t) • 전역적 주변광 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);
광원 사용 방법 (con’t) • 관측자의 위치 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
음영 (Shading) • 조명과 재질 • 광원 • Phong 반사 모형 • 벡터의 계산 • 다각형 음영 • 순환적 분할에 의한 구의 근사 • OpenGL의 광원 • OpenGL에서 재질의 지정 • 구 모델의 음영처리 • 전역적 렌더링
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);