Lighting OpenGL Lighting OpenGL의조명에는 3가지요소가필요 광원 (Lights) 재질 (Materials) 면의법선벡터 (Normals) 321190 2008년봄학기 5/26/2007 박경신 OpenGL Lighting OpenGL Lighting OpenGL에서제공하는조명모델 환경광 / 주변광 (ambient lights) 점광원 (point lights) 방향성광원 / 평행광원 / 원거리광원 (directional lights) 점적광 (spot lights) 거리에따른빛의세기감쇠 (attenuation) Physical attenuation: I ( P I( P) = P OpenGL attenuation: Default a = 1, b = 0, c = 0 I ( P ) 0 I( P) = a+ bd + cd 2 ) 0 2 P0
OpenGL Lighting OpenGL 에서 lighting 을사용하려면 GL_LIGHTING 을활성화해야한다. glenable(gl_lighting); 또한, 적어도하나의광원을활성화해야한다. glenable(gl_light0); OpenGL 에서는최대 8 개의광원을지정할수있다 GL_LIGHT0,.., GL_LIGHT7 최대광원수얻기 : glgetintegerv(gl_max_lights, GLint *num_lights); OpenGL 에서 lighting 비활성화 gldisable(gl_lighting); OpenGL Light Sources 광원의속성은 gllight(..) 함수에의해지정된다. 광원은위치 (position) 와색 (color) 을갖는다. 광원의강도 (intensity) 는색의강도에의해결정된다. GLfloat position[] = {0, 1, 0, 0}; // directional light GLfloat white_color[] = {1, 1, 1, 1}; glenable(gl_light0); gllightfv(gl_light0, GL_POSITION, position); // light position gllightfv(gl_light0, GL_DIFFUSE, white_color); // light color OpenGL Light Source Position 광원은 infinite light ( 혹은 directional light) 이거나 local light ( 혹은 positional light) 이다. Infinite light source 의모든빛은같은방향을갖는다. Local light source 는공간의특정지점에서오는빛이다. 광원의위치의 4 번째값이 0 이면 infinite light (directional light) 이고, 1 이면 local light (point light) 이다. 예제 : // directional light comes from above GLfloat position0[] = {0, 1, 0, 0}; gllightfv(gl_light0, GL_POSITION, position0); // point light comes from point (0, 1, 0) GLfloat position1[] = {0, 1, 0, 1}; gllightfv(gl_light1, GL_POSITION, position1); OpenGL Light Source Position 광원의위치는현재변환 (transformation) 에영향을받는다. Light 은세계좌표계 (world coordinates system) 에서정의될수있도록카메라변환후에지정하는것이좋다. Light 은또한객체와같이변환행렬에의해움직일수있다. 예제 : // make a point light comes from position (5, 0, 7) GLfloat position[] = {0, 0, 0, 1}; glpushmatrix(); gltranslatef(5, 0, 7); gllightfv(gl_light0, GL_POSITION, position); glpopmatrix();
OpenGL Light Sources GL_SPOT_CUTOFF OpenGL Multiple Lights 점적 / 집중광원 (spot light source) 방향지정벡터 (spot light direction) 절단각도 (spot light cutoff) GL_SPOT_DIRECTION 높은계수 (spot light exponent) 를사용하면보다많은 spot light 생김 GLfloat direction[] = {0.0, -1.0, 0.0}; gllightfv(gl_light0, GL_SPOT_DIRECTION, direction); gllightf(gl_light0, GL_SPOT_CUTOFF, 15.0f); gllightf(gl_light0, GL_SPOT_EXPONENT, 10.0f) OpenGL 에서는 GL_LIGHT0, GL_LIGHT1,.. 등으로지정함으로써여러개의광원을동시에활성화할수있다. 최대 8 개까지의광원을사용할수있다. GLfloat position[] = {-1, 1, 2, 0}; glenable(gl_light1); gllightfv(gl_light1, GL_POSITION, position); 너무많은 light을사용하면계산량이늘어나게되고따라서렌더링속도를늦출수있다. 빛의감쇠 (attenuation): 1/(a + bd +cd 2 ) Default a = 1, b=0, c=0 gllightf(gl_light0, GL_CONSTANT_ATTENUATION, 2.0f); gllightf(gl_light0, GL_LINEAR_ATTENUATION, 1.0f); gllightf(gl_light0, GL_QUADRATIC_ATTENUATION, 0); OpenGL Materials 재질속성은표면이빛을어떻게반사하는지를나타내준다. 재질은기본적으로표면의색을말한다. 조명이활성화되면, glcolor 는무시되고재질 (material) 이대신사용된다. 재질속성은 glmaterial 함수를사용하여지정한다. glmaterialfv(face, property, value) Face: e.g. GL_FRONT, GL_BACK, GL_FRONT_AND_BACK Property: e.g. GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR, GL_SHININESS, GL_EMISSION, etc Value: the reflection coefficients Nonzero GL_EMISSION makes an object appear to be giving off light of that color Example Teapot 의재질예제 Only differences in these teapots are the parameters in the modified Phong model
OpenGL Light Color OpenGL 에서광원은색 (color) 과강도 (intensity) 를가지고있으며, 기본값은백색이다. 우리가보는객체의색은빛의색 (light color) 과재질의색 (material color) 둘간의합성으로결정된다. 빛의색은얼마나 RGB 빛이객체에서빛나는지를말한다. 재질의색은얼마나 RGB 빛이객체에서반사되는지를말한다. White light * red material = red Red light * white material = red Red light * blue material = black Yellow light * cyan material = green OpenGL Ambient/Diffuse/Specular Light OpenGL 조명모델에서는 3 가지형태의반사광을고려함. Ambient light ( 환경광 ): 다른일반표면에서반사되어나오는빛. 장면을전반적으로밝게함. Diffuse light ( 난반사광 ): 특정방향으로진행하다가표면에닿으면모든방향으로동일하게반사됨. 관찰자의위치와무관함. 가장일반적인형태임. Specular light ( 정반사광 ): 특정방향으로진행하다가표면에닿으면한방향으로강하게반사됨. 반짝이는표면을모델링할때이용됨. OpenGL Ambient Light 환경광은간접적으로들어오는빛을시뮬레이션함. 표면의방향과는상관없이사방에일정한밝기의빛이고르게퍼져있다고가정함. 환경광효과는광원의환경광색과재질의환경광색으로지정됨. GLfloat gray[] = {0.1, 0.1, 0.1, 1}; GLfloat white[] = {1, 1, 1, 1}; gllightfv(gl_light0, GL_AMBIENT, gray); glmaterialfv(gl_front, GL_AMBIENT, white); 또한 gllightmodel 함수를사용하여전역적환경광을지정할수있음. gllightmodelfv(gl_light_model_ambient, gray); OpenGL Specular Light 정반사광은표면에반짝이는 highlights 를생성함. 정반사광의 3 가지속성 : 재질의정반사색 재질의반짝임 (shininess) 광원의정반사색 GLfloat white[] = {1, 1, 1, 1}; gllightfv(gl_light0, GL_SPECULAR, white); glmaterialfv(gl_front, GL_SPECULAR, white); glmaterialf(gl_front, GL_SHININESS, 50); GL_SHININESS값이높으면작은면적의 highlight이생성 정반사광을비활성화하고자하면, 정반사광색을검정색 (0, 0, 0) 으로지정함.
Surface Orientation Lighting 에서빛이표면에서얼마나반사되는지계산하기위해서 OpenGL 은표면이어느방향을향하고있는지알아야한다. 표면의방향 (surface orientation) 과빛의방향은빛의난반사광 (diffuse light) 의밝기를결정짓는다. 표면의방향 (surface orientation), 빛의방향 (light direction), 관찰자를향하는방향벡터 (direction to the viewer) 는정반사광 (specular light) 의밝기를결정짓는다. Surface Normal 표면의방향 (orientation) 은표면에수직을이루는법선벡터에의해정의된다. 면의법선벡터는 ( 벡터의길이가 1인 ) 단위벡터 (unit vector) 이어야한다. n p 2 p p 1 p 0 n (p - p 0 ) = 0 n = (p2 - p0 ) (p1 - p0 ) normalize n n/ n Vertex Normal 정점의법선벡터 그정점을공유하는근접한면의법선벡터의평균치를계산하여사용함. Normal to Sphere Implicit function of Sphere: f(x,y.z)=0 Unit Sphere: f(p)=p p-1 = 0 구의법선벡터 n = [ f/ x, f/ y, f/ z] T = p
OpenGL Normal OpenGL Normal OpenGL 에서면의법선벡터는 glnormal 함수로지정 Shaded Cube 를그린다. OpenGL 의조명계산에서는각정점의법선벡터를사용함 예제 : glbegin(gl_triangles); glnormal3f(0, 1, 0); glvertex3f(-1, 0, 0); glnormal3f(0, 1, 0); glvertex3f(1, 0, 0); glnormal3f(0, 1, 0); glvertex3f(0, 0, 2); glend(); GLfloat vertex[][3] = { {-1.0,-1.0,-1.0}, { 1.0,-1.0,-1.0}, { 1.0, 1.0,-1.0}, {-1.0, 1.0,-1.0}, {-1.0,-1.0, 1.0}, { 1.0,-1.0, 1.0}, { 1.0, 1.0, 1.0}, {-1.0, 1.0, 1.0} }; GLfloat normal[][3] = { { 1.0, 0.0, 0.0}, // right { 0.0, 1.0, 0.0}, // top { 0.0, 0.0, 1.0}, // front {-1.0, 0.0, 0.0}, // left { 0.0, -1.0, 0.0}, // bottom { 0.0, 0.0, -1.0}, // back }; 7 4 3 2 6 0 1 5 (0, 0, 1) front OpenGL Normal Advanced OpenGL Lighting void polygon(int n, int b, int c, int d) { glbegin(gl_polygon); glnormalfv(normal[n]); glvertex3fv(vertex[a]); glvertex3fv(vertex[b]); glvertex3fv(vertex[c]); glvertex3fv(vertex[d]); glend(); } void cube( ) { polygon(0, 5, 1, 2, 6); // right polygon(1, 6, 2, 3, 7); // top polygon(2, 6, 7, 4, 5); // front polygon(3, 4, 7, 3, 0); // left polygon(4, 4, 0, 1, 5); // bottom polygon(5, 0, 3, 2, 1); // back } 7 4 3 2 6 0 1 5 (0, 0, 1) front OpenGL 에서제공하는 lighting 관련기능들 Spotlights Attenuation Emissive materials Two-sided lighting model Color-material mode Secondary specular color Automatic rescaling of normals