그래픽스강의노트 06 - 조명 1 강영민 동명대학교 2015 년 2 학기 강영민 ( 동명대학교 ) 3D 그래픽스프로그래밍 2015 년 2 학기 1 / 25
음영 계산의 필요성 음영(陰影) 계산, 혹은 셰이딩(shading)은 어떤 물체의 표면에서 어두운 부분과 밝은 부분을 서로 다른 밝기로 그려내는 것 모든 면을 동일한 색으로 그리면 입체감이 없다. 2 / 25
조명과 재질 음영 계산에 필요한 두 가지 핵심 요소 빛 컴퓨터 그래픽스의 최종 결과는 우리의 눈을 통해 입력되는 시각 정보 눈이 인지하는 신호는 전자기파 우리가 인지할 수 있는 영역의 전자기파: 가시광선(可視光線) 이 가시광선을 일상적으로 빛 이라 부름 재질(材質,material) 같은 빛이라고 모든 물체가 같은 색으로 보이지는 않음 물체는 저마다의 특성에 따라 서로 다른 방식으로 빛을 반사 물체가 가진 반사 특성을 재질이라고 함 3 / 25
지역조명과전역조명 강영민 ( 동명대학교 ) 3D 그래픽스프로그래밍 2015 년 2 학기 4 / 25
광원 모델 일반적인 광원(光源, light source)은 다루기가 쉽지 않다. 하나의 광원은 일정한 면적이나 체적을 가지기 때문에 이 광원에서 나온 빛들을 적분해야 한다. 실제 실시간 렌더링에서는 광원을 하나의 점이나 방향으로 보는 단순화된 모델을 사용한다. 사용되는 광원은 다음과 같은 것들이 있다. 광원 종류 점광원 집중광원 방향광원 주변광원 특징 광원의 위치와 색으로 결정. 전방향(omnidirection)으로 빛 진행. 점광원에서 일부 입체각으로 빛을 제한. 특정한 위치가 아니라 방향에 광원 존재. 모든 곳에 동일하게 가해지는 빛. 5 / 25
지역 조명 모델 - 퐁(Phong) 모델 정반사와 난반사, 주변광 반사 특성을 표현할 수 있는 간단하고 빠른 모델 다음과 같은 정보가 필요 광원으로 향하는 벡터 L 카메라(시점)을 향하는 벡터 E 법선 벡터 N 이상적인 반사 방향 R light color m l = (lr, lg, lb ) N L E material color m m = (mr, mg, mb ) R 6 / 25
퐁(Phong) 모델: 광원과 재질 - 색상 퐁 모델은 난반사, 정반사, 주변광을 각각 독립적으로 계산하여 합성 각각의 반사 요소에 따라 결정해야 하는 것은 눈을 향해 오는 빛의 강도(intensity)와 색상 색상의 결정 어떤 광원에서 나오는 빛의 색상이 l = (lr, lg, lb ) 물체의 재질 색상이 m = (mr, mg, mb ) 빛의 색상은 이 빛이 눈에 감지되었을 때 우리가 느끼는 색이 빨간 색을 가진 물체의 재질 색상 (1.0, 0.0, 0.0)은 도착하는 빛의 RGB 3 개 채널에서 R 채널의 빛을 100% 반사한다는 것을 의미 반사되는 빛의 색상은 다음과 같다. c = (lr mr, lg mg, lb mb ) 이를 이렇게 표현한다. c=l m 7 / 25
퐁(Phong) 모델: 광원과 재질 - 광강도 이 계산은 눈에 감지되는 빛의 색상을 결정 같은 색상이라도 밝고 어두울 수 있음 이러한 음영을 고려해야 입체적인 물체로 보임 이러한 음영은 광강도(光强度, light intensity)에 의해 결정 이 광강도의 값은 스칼라(scalar) 값으로 I 로 표현 실제로 눈에 보이는 색은 광원과 재질에 의해 결정되는 색상 c 와 광강도 I 에 의해 다음과 같이 결정 κ = Ic 8 / 25
퐁(Phong) 모델: 최종 결정 반사색 퐁 모델은 각각의 반사 요소를 모두 따로 계산 난반사 요소와 관련된 값에는 아래첨자 d 정반사에는 s 주변광 반사에는 a 눈에 관측되는 색상은 다음과 같음 κ = Ia ca + Id cd + Is cs 이때, 주변광의 광강도는 상수 값을 가지므로 Ia 는 1로 설정할 수 있다. 따라서 다음 식으로 바꿀 수 있다. κ = ca + Id cd + Is cs = la ma + Id ld md + Is ls ms 9 / 25
퐁 모델 광강도(intensity)의 계산 - 난반사 퐁 모델에서 계산해야 하는 광강도는 난반사 Id 와 정반사 Is 난반사는 모든 방향에 동등하게 빛이 퍼지는 것으로 가정 눈이 어디에 있든지 동일한 색상 관찰 눈의 움직임에 따라 변하는 하일라이트(highlight)는 표현하지 못 함 색을 칠하려고 하는 한 지점에 대해 어디서 쳐다 보든지 동일한 밝기 밝기는 얼마나 많은 에너지가 해당 지점에 떨어지는지에 달려 있음 N Ilight Ain L θ Ieye Ain Asurf ace Ilight Asurf ace 10 / 25
퐁 모델 광강도(intensity)의 계산 - 난반사 1/2 퐁 모델에서 계산해야 하는 광강도는 난반사 Id 와 정반사 Is 난반사는 모든 방향에 동등하게 빛이 퍼지는 것으로 가정 눈이 어디에 있든지 동일한 색상 관찰 눈의 움직임에 따라 변하는 하일라이트(highlight)는 표현하지 못 함 색을 칠하려고 하는 한 지점에 대해 어디서 쳐다 보든지 동일한 밝기 밝기는 얼마나 많은 에너지가 해당 지점에 떨어지는지에 달려 있음 N Ilight Ain L θ Ieye Ain Asurf ace Ilight Asurf ace 11 / 25
퐁 모델 광강도(intensity)의 계산 - 난반사 2/2 이 값은 광원 벡터 L 과 법선 벡터 N 이 일치할 때 최대이며, 90도를 이룰 때 0이 됨 이 값은 두 벡터의 내적, 즉 두 벡터 사잇각의 코사인(cosine)에 비례한다는 것이 램버트 반사(Lambertian reflectance) 모델 따라서 광강도를 계산해야하는 지점에서 빛을 향하는 방향벡터 L 과 표면 법선벡터 N 의 내적으로 Id 를 구할 수 있음 Id = cos θ = L N (1) 12 / 25
퐁 모델 광강도(intensity)의 계산 - 정반사 1/2 N Ilight R L N reflected light distribution R shiny surface L E θ Is (cos θ)σ N R L reflected light distribution σ : shininess of the surf ae rough surface 정반사는 거울과 같이 입사각에 대칭되는 방향으로 반사되는 것이다. 그런데, 실제 물체들은 이런 이상적인 정반사가 아니라 반사 방향으로 빛이 강하게 진행하기는 하지만 다른 방향으로 조금씩 빛이 나간다. 퐁 모델에서 사용하는 정반사 모델은 거울과 같은 반사가 아니라 반사 벡터 R 중심으로 퍼지는 반사를 표현한다. 13 / 25
퐁 모델 광강도(intensity)의 계산 - 정반사 2/2 정반사는 반사 벡터 R 근처에서 강하게 관찰되기 때문에 눈을 R 근처로 가져가야 강한 반사 정반사의 광강도 Is 는 R 과 E 의 사잇각의 코사인에 연관 물체의 재질에 따라 R 방향으로 집중되는 정도가 달라짐 - 물체의 반질함(shininess) σ 에 의해 결정 Id = cos θ = (R E)σ 14 / 25
퐁 모델 광강도(intensity)의 계산 - 주변광 주변광의 광강도는 언제나 1이다. 따라서 모든 물체는 주변광과 주변광 반사 재질에 의한 색상 la ma 을 기본적으로 갖게 된다. 이것은 지역조명 기법의 단점인 지나치게 어두운 부분을 없애는 역할을 수행한다. κ = ca + Id cd + Is cs = la ma + Id ld md + Is ls ms 15 / 25
수정된 퐁 모델 - 블린(Blinn) 모델 퐁 모델은 정반사 광강도 계산에서 반사 벡터 R 을 계산해야 함 블린(Blinn)은 이 반사벡터 대신에 반 벡터(halfway vector)라는 것을 도입 L+E 반 벡터 H 는 광원 벡터와 시선 벡터 E 를 더해서 정규화: H = L+E Ilight L N H= L+E L+E R E if R E = 0 then H N = 0 if R E increases then H N also increases 16 / 25
OpenGL 조명 - 조명과 재질 적용할 데이터 준비 조명의 위치는 동차좌표(homogeneous coordinate)로 표현 마지막 성분이 1이면 점광원이고, 0이면 방향광원(directional light source) //재질의 정반사, 난반사, 주변광, 반질거림 특성으로 사용될 데이터 // v a l u e s f o r m a t e r i a l s p e c i f i c a t i o n GLfloat mat specular [ ] = { 1. 0, 1.0 f, 1.0 f, 1.0 f GLfloat m a t d i f f u s e [ ] = { 0. 0, 1.0 f, 1.0 f, 1.0 f G L f l o a t ma t ambient [ ] = { 1. 0, 1. 0, 1. 0, 1. 0 } ; GLfloat ma t sh in ine ss [ ] = { 120.0 }; // 광원의 정반사, 난반사, 주변광 특성으로 사용될 데이터 // v a l u e s f o r l i g h t s p e c i f i c a t i o n GLfloat l i t s p e c u l a r [ ] = { 1. 0, 1. 0 f, 1. 0 f, 1. 0 f }; GLfloat l i t d i f f u s e [ ] = { 0. 0, 1. 0 f, 1. 0 f, 1. 0 f }; GLfloat l i t a m b i e n t [ ] = { 0. 5, 0. 0 f, 0. 0 f, 1. 0 f }; // 광원의 위치로 사용될 데이터 // v a l u e s f o r l i g h t p o s i t i o n i n g GLfloat l i g h t p o s i t i o n [ ] = { 1. 0, 1. 0 f, 1. 0 f, 0. 0 f }; }; }; 17 / 25
OpenGL 조명 - 조명과 재질 적용 실제 조명과 재질에 적용 조명의 특성을 설정하는 함수는 gllight* 재질 특성을 설정하는 것은 glmaterial* // 조명과 재질의 특성을 준비된 데이터로 설정하는 함수 void LightSet ( void ) { g l M a t e r i a l f v (GL FRONT, GL SPECULAR, m a t s p e c u l a r ) ; g l M a t e r i a l f v (GL FRONT, GL DIFFUSE, m a t d i f f u s e ) ; g l M a t e r i a l f v (GL FRONT, GL AMBIENT, mat ambient ) ; g l M a t e r i a l f v (GL FRONT, GL SHININESS, m a t s h i n i n e s s ) ; g l L i g h t f v ( GL LIGHT0, GL SPECULAR, l i t s p e c u l a r ) ; g l L i g h t f v ( GL LIGHT0, GL DIFFUSE, l i t d i f f u s e ) ; g l L i g h t f v ( GL LIGHT0, GL AMBIENT, l i t a m b i e n t ) ; g l E n a b l e ( GL LIGHTING ) ; g l E n a b l e ( GL LIGHT0 ) ; } //조명의 위치를 설정하는 함수 void LightPositioning ( void ) { g l L i g h t f v ( GL LIGHT0, GL POSITION, l i g h t p o s i t i o n ) ; } 18 / 25
OpenGL 조명 - 렌더링 v o i d i n i t ( i n t a r g c, c h a r a r g v ) { [[각종 초기화 작업]] L i g h t S e t ( ) ; // 조명의 특성과 재질의 특성을 설정한다 g l E n a b l e (GL DEPTH TEST) ; } void display () { [[GL MODELVIEW 모드 설정]] glulookat ( 0, 1, 2, 0, 0, 0, 0, 1, 0 ) ; LightPositioning () ; // 점광원의 위치를 설정한다 glutsolidteapot (0.5) ; glutswapbuffers () ; } (a) 주변광 포함 (b) 주변광 제외 19 / 25
OpenGL 조명 - 반질거림 조정 for ( i n t i =0; i <5; i ++) { // 재질의 반질거림을 변경하여 설정하고 주전자를 그림 g l M a t e r i a l f (GL FRONT, GL SHININESS, 4. 0 f +123.0 f ( i / 4. 0 ) ) ; f o r ( i n t j =0; j <5; j ++) { glpushmatrix ( ) ; g l T r a n s l a t e d ( f l o a t ( i ) +0.5, f l o a t ( j ) +0.5, 0. 0 ) ; glrotated (45, 1, 1, 1) ; glutsolidteapot (0.4) ; glpopmatrix ( ) ; } } 20 / 25
OpenGL 조명 - 점광원 구현 1/2 [[광원과 재질의 색상 설정]] // 광원의 위치를 설정한다. // 광원의 좌표 가운데 w 성분이 1로 설정되어 있다 // 디스플레이 콜백에서 광원의 위치를 바꾸지만, w 좌표는 변경하지 않는다 G L f l o a t l i t p o s i t i o n [ ] = { 0. 0 f, 0. 0 f, 0. 0 f, 1.0f } ; // void void SetLight () { 이전 코드와 동일 light position } i n i t ( void ) { [[윈도우, 버퍼 초기화, 카메라 설정 등의 초기 작업]] SetLight () ; } void display () { // [[버퍼 지우기, 모델뷰 행렬 모드 설정, 카메라 위치 설정 등 수행]] s t a t i c f l o a t t = 0. 0 ; t +=0.01; // 광원의 위치를 설정함. w 좌표는 1로 고정하고 회전하도록 함 l i t p o s i t i o n [ 0 ] = 5.0 sin ( t ) ; l i t p o s i t i o n [ 2 ] = 5.0 cos ( t ) ; g l L i g h t f v ( GL LIGHT0, GL POSITION, l i t p o s i t i o n ) ; f o r ( i n t i =0; i <10; i ++) { f o r ( i n t j =0; j <10; j ++) { glpushmatrix ( ) ; g l T r a n s l a t e f ( i 4.5, j 4.5,0) ; g l u t S o l i d S p h e r e ( 0. 5, 30, 30) ; glpopmatrix ( ) ; } } // [[광원의 위치 등을 표시하여 확인할 수 있도록 함]] glutswapbuffers () ; } 21 / 25
OpenGL 조명 - 점광원구현 2/2 강영민 ( 동명대학교 ) 3D 그래픽스프로그래밍 2015 년 2 학기 22 / 25
OpenGL 조명 - 집중광원에필요한요소 GL SP OT CUT OF F light source GL SP OT DIRECT ION 강영민 ( 동명대학교 ) 3D 그래픽스프로그래밍 2015 년 2 학기 23 / 25
OpenGL 조명 - 집중광원 1/2 // 집중 광원의 방향으로 사용될 데이터를 준비한다 GLfloat spotdir [ ] = { 0.0 f, 0.0 f, void 1.0 f }; SetLight () { g l E n a b l e ( GL LIGHTING ) ; g l E n a b l e ( GL LIGHT0 ) ; // s e t m a t e r i a l p r o p e r t i e s g l M a t e r i a l f v (GL FRONT, GL DIFFUSE, m a t d i f f u s e ) ; g l M a t e r i a l f v (GL FRONT, GL SPECULAR, m a t s p e c u l a r ) ; g l M a t e r i a l f v (GL FRONT, GL AMBIENT, mat ambient ) ; g l M a t e r i a l f v (GL FRONT, GL SHININESS, m a t s h i n i n e s s ) ; // s e t l i g h t g l L i g h t f v ( GL g l L i g h t f v ( GL g l L i g h t f v ( GL properties LIGHT0, GL DIFFUSE, l i t d i f f u s e ) ; LIGHT0, GL SPECULAR, l i t s p e c u l a r ) ; LIGHT0, GL AMBIENT, l i t a m b i e n t ) ; // 집중광원에 필요한 데이터를 설정한다 g l L i g h t f ( GL LIGHT0, GL SPOT CUTOFF, 2 0. 0 f ) ; g l L i g h t f v ( GL LIGHT0, GL SPOT DIRECTION, s p o t D i r ) ; // Exponent 집중광의 테두리를 부드럽게 한다. 자세한 내용은 Reference API 등을 참고하라 g l L i g h t f ( GL LIGHT0, GL SPOT EXPONENT, 2 0. 0 f ) ; } 24 / 25
OpenGL 조명 - 집중광원 2/2 강영민 ( 동명대학교 ) 3D 그래픽스프로그래밍 2015 년 2 학기 25 / 25