기말고사 담당교수 : 단국대학교멀티미디어공학전공박경신 답은반드시답안지에기술할것. 공간이부족할경우반드시답안지몇쪽의뒤에있다고명기한후기술할것. 그외의경우의답안지뒤쪽이나연습지에기술한내용은답안으로인정안함. 답에는반드시네모를쳐서확실히표시할것. 성적공고시중간고사때제출한암호를사용할것임. 1. 다음문제에답하시오. (50점) 1) 직교투영 (orthographic projection), 축측투영 (axonometric projection), 경사투영 (oblique projection) 을간단히설명하고, 각투영방식의차이점을나타내라. 직교투영 : 투영선 (projector) 은투영면 (projection plane) 에수직이다. 축측투영 : 투영선은투영면에수직이지만, 투영면은객체에대해어떠한방향에도존재할수있다. 경사투영 : 투영선은투영면과임의의각을가질수있다. 2) 다음은카메라 (Camera) 클래스의일부를보여주고있다. apply() 함수는뷰행렬 (View Matrix) 을생성하는함수이다. 빈칸을채우시오. camera::camera( )..// 중간생략 position_= vector3(0.0, 0.0, 0.0); right_ = vector3(1.0, 0.0, 0.0); up_ = vector3(0.0, 1.0, 0.0); look_ = vector3(0.0, 0.0, 1.0); 1/11
void camera::apply() // 중간생략 glloadidentity(); // Keep camera's axes orthogonal to eachother look_.normalize(); up_ = vector3::crossproduct(up_, look_); up_.normalize(); right_ = vector3::crossproduct(look_, right_) right_.normalize(); // Build the view matrix: V[0] = right_.vec[0]; V[1] = up_.vec[0]; V[2] = look_.vec[0]; V[3] = 0.0f; V[4] = _ right_.vec[1];_ V[5] = _ up_.vec[1];_ V[6] = _ look_.vec[1];_ V[7] = 0.0f; V[8] = _ right_.vec[2];_ V[9] = _ up_.vec[2];_ V[10] = look_.vec[2];_ V[11] = 0.0f; V[12] = _ -vector3::dotproduct(right_, pos_);_ V[13] = -vector3::dotproduct(up_, pos_)_ V[14] = _ -vector3::dotproduct(look_, pos_);_ V[15] = 1.0f; // Multiply the view matrix: glmultmatrixf(v); 3) OpenGL에서직교투영 (Orthogonal projection) 함수인 glortho(100, 200, 100, 200, 100, 200) 의관측공간 (View volume) 을그림으로표시하라. y (200,200,-200) (100,100,-100) x z 4) OpenGL에서원근투영 (Perspective projection) 함수인 glfrustum(100, 200, 100, 200, 100, 200) 의관측공간 (View volume) 을그림으로표시하라. y z = -200 (200,200,-100) (100,100,-100) z = -100 x z 2/11
5) 다음은 OpenGL에서 GL_FLAT과 GL_SMOOTH의 Shading Model 사용하는경우를보여주는간단한프로그램이다. 출력결과에차이를설명하라. void drawtriangle() glbegin(gl_triangles); glcolor3f(1, 0, 0); // red glvertex3f(-1, -1, 4); glcolor3f(0, 1, 0); // green glvertex3f(1, -1, 4); glcolor3f(0, 0, 1); // blue glvertex3f(0, 1, 4); glend(); void drawtriangle2() glbegin(gl_triangles); glcolor3f(0, 0, 1); // blue glvertex3f(-1, -1, 4); glcolor3f(0, 1, 0); // green glvertex3f(1, -1, 4); glcolor3f(1, 0, 0); // red glvertex3f(0, 1, 4); glend(); void display() glclearcolor(0.5, 0.7, 1, 0); glclear(gl_color_buffer_bit GL_DEPTH_BUFFER_BIT); glmatrixmode(gl_projection); glloadidentity(); gluperspective(60, 1, 0.1, 1000); glmatrixmode(gl_modelview); glloadidentity(); gltranslatef(0.0, 0.0, -viewdistance); glrotatef(viewrotx, 1.0, 0.0, 0.0); glrotatef(viewroty, 0.0, 1.0, 0.0); if (shading == GL_FLAT) glshademodel(gl_flat); else if (shading == GL_SMOOTH) glshademodel(gl_smooth); glpushmatrix(); gltranslatef(-1.0, 0.0, 0.0); drawtriangle(); glpopmatrix(); glpushmatrix(); gltranslatef(1.0, 0.0, 0.0); drawtriangle2(); glpopmatrix(); 3/11
glutswapbuffers(); GL_FLAT: Flat shading ( 플랫세이딩 ) 은주어진하나의다각형전체를동일한색으로칠하는방식으로다각형의첫번째정점의색으로다각형전체에칠해짐. 즉, 왼쪽삼각형은파란색으로, 오른쪽삼각형은빨간색으로칠해짐 GL_SMOOTH: Gouraud shading ( 그로우세이딩 ) 은정점의색을보간하여칠하는방식으로다각형의각정점의색들간에보간된색으로칠해짐. 즉, 왼쪽삼각형은파란색 ( 위 )-> 초록색 ( 오 )-> 빨간색 ( 왼 )-> 파란색 ( 위 ) 로변하고, 오른쪽삼각형은빨간색 ( 위 )-> 초록색 ( 오 )-> 파란색 ( 왼 )-> 빨간색 ( 위 ) 로칠해짐 6) OpenGL 함수 gltexparameteri(gl_texture_2d, GL_TEXTURE_WRAP_S, mode) 는텍스쳐좌표값이 (0,1) 범위를넘어선값에대해, mode가 GL_CLAMP는 s,t가 1보다크면 1을 s,t가 0보다작으면 1으로값을강제조정하고, GL_REPEAT는 s,t%1을사용하여텍스쳐를반복한다. 화면출력결과를참고하여빈칸을채우시오. gltexparameteri(gl_texture_2d, GL_TEXTURE_WRAP_S, GL_CLAMP ); gltexparameteri(gl_texture_2d, GL_TEXTURE_WRAP_T, GL_REPEAT ); gltexparameteri(gl_texture_2d, GL_TEXTURE_WRAP_S, GL_REPEAT ); gltexparameteri(gl_texture_2d, GL_TEXTURE_WRAP_T, GL_REPEAT ); 4/11
7) 아래의코드를참조하여, OpenGL 환경에서텍스쳐확대, 축소, 밉맵필터링 (Filtering) 에대해서설명하라. gltexparameteri(gl_texture_2d, GL_TEXTURE_MAG_FILTER, GL_NEAREST); gltexparameteri(gl_texture_2d, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glubuild2dmipmaps(gl_texture_2d, numcomponents == 3? GL_RGB : GL_RGBA, imagewidth, imageheight, numcomponents == 3? GL_RGB : GL_RGBA, GL_UNSIGNED_BYTE, imageptr); 확대를위한필터 : 텍셀이한 pixel보다클때사용되는필터축소를위한필터 : 텍셀이한 pixel보다작을때사용되는필터밉맵핑필터 : 일련의축소된크기의밉맵택스쳐를생성하여, 작은객체에텍스쳐맵핑을할시보간문제를줄여주는필터 8) 멀티텍스쳐링 (Multi-texturing) 기법에대해서간단히설명하라. Single-Pass Multitexturing과 Multi-Pass Multi-texturing 방법의차이점을설명하라. 멀티텍스쳐링 : 하나이상의텍스쳐를객체에적용해서렌더링효과를높이는것 싱글패스멀티텍스쳐링 : 하나의렌더링패스안에서텍스쳐를여러개입히는것 다중패스멀티텍스쳐링 : 장면이나다각형자체를여러번블렌딩하여렌더링하는것으로, 여러번다각형을그려야하는단점이있음 9) 다음다각형에홀짝규칙 (even-odd rule) 과접기횟수규칙 (non-zero winding rule) 을사용하여다각형채우기 (Polygon filling) 를하라 5/11
10) Sutherland-Hodgeman 알고리즘에대해간단히설명하라. Sutherland-Hodgeman 알고리즘은다각형을클리핑하는알고리즘으로써클리핑면에대한연속적인절단 (pipeline clipping of polygons) 을수행하여클리핑윈도우내부만남기는방식이다. 절단면으로처리된정점을다음클리핑면에반복적용하는방식으로 Concave polygon에는부적합하다. 2. 다음에주어진삼각형을그리는간단한 OpenGL 프로그램을보고뷰잉변환에관한문제를답하라. (10점) #include <GL/glut.h> // display void display() glclearcolor(1, 1, 1, 1); glclear(gl_color_buffer_bit); glmatrixmode(gl_projection); glloadidentity(); glortho(-2.0, 2.0, -2.0, 2.0, -2.0, 2.0); glmatrixmode(gl_modelview); glcolor3f(0.0, 0.0, 0.0); glbegin(gl_triangles); glvertex2f(-1.0, -1.0); glvertex2f(0.0, 1.0); glvertex2f(1.0, -1.0); glend(); glflush(); // keyboard void keyboard(unsigned char key, int x, int y) switch (key) case 0x1B: case 'q': case 'Q': exit(0); break; 6/11
// reshape void reshape(int w, int h) glviewport(0, 0, w, h); int main(int argc, char** argv) glutinit(&argc, argv); glutinitdisplaymode(glut_single GLUT_RGB); glutinitwindowsize(200, 200); glutinitwindowposition(0,0); glutcreatewindow(argv[0]); glutdisplayfunc(display); glutkeyboardfunc(keyboard); glutreshapefunc(reshape); glutmainloop(); 1) 다음프로그램을실행할경우 200 x 200 크기의윈도우에어떤그림이그려질지, 출력결과를그려라 ( 정확한눈금의값을명시할것 ). 2) 만약이코드에서줄친세문장을제거하고프로그램을실행시키면, 200 x 200 크기의윈도우에어떤그림이그려질지, 출력결과를그려라 ( 정확한눈금의값을명시할것 ). 7/11
3. 다음은퐁의조명모델 (Phong s Illumination Model) 수식을기술한것이다. 아래의질문에답하라. (15점) I K I ( N L) + K I ( R V E m = K a I a + 1 d d s s ) + 2 a + bd + cd i= 0 1 α 1) 이공식에서주변광, 확산광, 경면광, 방출광, 광원과물체간의거리에따른빛의감쇠를의미하는부분이어디인지표시하라. 주변광 (Ambient reflection) : 광원에직접노출되지않는면에밝기를부여, K a I a 확산광 (Diffuse reflection) : 면이서있는방향에따라차등적밝기를부여함, K d I d (N L) 경면광 (Specular reflection) : 반짝이는표면에서반사되는빛을모델링함, K s I s (R V) α 방출광 (Emissive illumination) : 자체가빛을발하는방출조명, E 광원과물체간의거리에따른빛의감쇠 (Attenuation) : 1/(a + bd + cd 2 ) 2) 위의식에서램버트법칙 (Lambertian Law) 를설명하라. 면의밝기는입사각 ( 광원벡터와면의법선벡터사이각 ) 의코사인에정비례함 : diffuse reflection cos θ = N L 3) 위의식에서경면광부분을바꾼 Blinn 조명모델 ( 혹은 Modified Phong Illumination Model) 을설명하라. 경면광에서중간각 (H), 즉면의법선벡터 (N) 와시점벡터 (V) 를이용하여계산, 을사용함. Specular Reflection = K where 2ψ = φ When N L > 0, H = 1 When N L 0, H = 0 s I (cosψ ) s n = K s I ( N H ) s n' 4. 다음은거울평면 (Plane: ax + by + cz + d = 0) 에대해점 q=(x 0, y 0, z 0 ) 의반사된지점 q =(x 0, y 0, z 0 ) 을계산하는과정을보여주고있다. 아래의질문에답하라. (15점) 8/11
1) 평면의법선벡터 n(a, b, c) 가단위벡터 (unit vector) 일경우, q 을계산하는공식을유도하라. q' = q 2kn ax0 + by0 + cz0 + d = q 2 n 2 2 2 a + b + c = q 2( n q + d) n where n(a, b,c) is unit vector 2) 평면 Plane (0, 0, 1, 2) 에반사된점 q 의값을구하라. 평면 (0, 0, 1, 2) 에반사된점 q = (x 0, y 0, -z 0-4) 3) 평면 Plane (a, b, c, d) 에반사하는 q = R q, 반사행렬 R 을구하라. 1 2 a 2-2ab -2ac -2ad R = -2ab 1 2 b 2-2bc -2bd -2ac -2bc 1 2 c 2-2cd 0 0 0 1 5. 다음검정색배경에파란색삼각형과그위에빨간색사각형을블렌딩하여그리는간단한 OpenGL 프로그램의일부를보여주고있다. 아래와같이여러가지방법으로블렌딩함수를 사용했을때그림에서 1 ( 삼각형부분만 ), 2 ( 삼각형과사각형이겹치는부분 ), 3 ( 사각형부분 만 ), 4 ( 나머지배경만 ) 의화면에출력되는최종 RGBA 색을계산하여표의빈칸에넣으시오 (10점) 블렌딩공식 : C = SourceFactor*C s + DestinationFactor*C d void drawobject() 9/11
glcolor4f(0, 0, 1, 1); glbegin(gl_triangles); glvertex3f(0.0, 1.0, -3.0); glvertex3f(-1.0, -1.0, -3.0); glvertex3f(1.0, -1.0, -3.0); glend(); glcolor4f(1, 0, 0, 0.5); glbegin(gl_quads); glvertex3f(0.0, -1.0, -2.0); glvertex3f(1.0, -1.0, -2.0); glvertex3f(1.0, 0.0, -2.0); glvertex3f(0.0, 0.0, -2.0); glend(); 4 void draw() glclearcolor(0, 0, 0, 1); glclear(gl_color_buffer_bit GL_DEPTH_BUFFER_BIT); glenable(gl_blend); if (filter == 0) glblendfunc(gl_one, GL_ZERO); else if (filter == 1) glblendfunc(gl_zero, GL_ONE); else if (filter == 2) glblendfunc(gl_one, GL_ONE); else if (filter == 3) glblendfunc(gl_src_alpha, GL_ONE_MINUS_SRC_ALPHA); drawobject(); gldisable(gl_blend); 1 2 3 Blending Func 1 2 3 4 GL_ONE (0,0,1,1) (1,0,0,1) (1,0,0,1) (0,0,0,1) GL_ZERO GL_ZERO (0,0,0,1) (0,0,0,1) (0,0,0,1) (0,0,0,1) GL_ONE GL_ONE GL_ONE (0,0,1,1) (1,0,1,1) (1,0,0,1) (0,0,0,1) 10/11
GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA (0,0,0.5,1) (0.5,0,0.5,0.75) (0.5,0,0,0.75) (0,0,0,1) 11/11