Microsoft Word - cg18-2-final-answer.doc

Size: px
Start display at page:

Download "Microsoft Word - cg18-2-final-answer.doc"

Transcription

1 기말고사 담당교수 : 박경신 12/20 23:59까지 online.dankook.ac.kr 이러닝으로학번 _ 이름 _final.zip 으로묶어서이러닝에제출한다. 주의 : 단순번역이나있는그대로복사 / 붙이기는금지함. 반드시본인이참고한문서의인용을넣어줌. 각문제당 1 장이상씩서술한다. 장수제한없음. 1. 다음문제에간단히답하시오. (10 점 ) 1) 버텍스쉐이더 (vertex shader) 코드에서 in, out, uniform 변수란무엇인가? 프레그먼크쉐이더 (fragment shader) 코드에서 in, out, uniform 변수란무엇인가? 버텍스쉐이더또는프레그먼트쉐이더에서 uniform 변수는전역변수이며, primitive 마다바뀔수있고, OpenGL 프로그램에서쉐이더로값을변경하는데사용함. Uniform 변수는 vertex shader 와 fragment shader 모두에서사용가능. 쉐어더코드내부에서는상수임. 버텍스쉐이더에서 in 변수란 vertex 마다들어오는데이터, out 변수란 vertex shader 에서계산된후 fragment shader 로넘겨지는값임프레그먼트쉐이더에서 in 변수란 vertex shader 에서넘겨준데이터, out 변수란 fragment shader 에서계산된최종결과값임 2) 직교투영 (Orthographic Projection), 축측투영 (Axonometric Projection), 등축투영 (Isometric Projection), 경사투영 (Oblique Projection), 원근투영 (Perspective Projection) 의특징을자세히서술하라직교투영은투영선 (projector) 이투영면 (projection plane) 에수직이다. 축측투영은투영선 (projector) 은투영면 (projection plane) 에수직이지만, 투영면은객체에대해어떠한방향에서도존재할수있다. 등축투영은축측투영의하나인데그중에서투영면이사각형객체의모서리에서만나는세개의주면에대해서대칭으로놓여지는것이다. 경사투영은투영선 (projector) 은투영면 (projection plane) 과임의의각을가질수있으나투영면에평행한면내의각은보존된다. 원근 ( 투시 ) 투영은객체가관측자로부터멀리떨어질수록크기가축소된다. 이러한크기변화는자연스러운모습의관측을제공한다. 3) Flat Shading, Gouraud Shading, Phong Shading 을자세히비교서술하라. Flat shading 은일명 Constant shading 이라고도하며, 폴리곤의한면을동일한색으로채우는방식이다. Gouraud shading 은일명 smooth shading 라고도불리며, 폴리곤의각정점의색을 linear interpolation 하여내부를부드럽게보간하는방식이다. (Per-vertex shading) Phong shading 은 (Gouraud shading 이정점의색을이용하여내부를보간하는반면 ) 폴리곤의각정점의 normal 을가지고폴리곤내부의각픽셀마다 normal 이보간되어 specular reflection 이더욱정확하게나타나게하는방식이다. (Per-pixel shading) 4) Texture Mapping 의축소, 확대, 밉맵필터를자세히비교서술하라. 1. 확대필터 (MAG_FILTER): 텍스쳐이미지를확대하여보다넓은면적의다각형영역에매핑하고자할때사용되는필터 2. 축소필터 (MIN_FILTER): 텍스쳐이미지를축소하여보다작은면적의다각형영역에매핑 하고자할때사용되는필터 3. 밉맵 (MIPMAP_FILTER): 텍스쳐이미지에서일련의축소된크기의밉맵택스쳐를생성하여, 작은객체에텍스쳐맵핑을할시보간문제를줄여주는필터 1/7

2 2. 다음 Projection 행렬질문에답하라. (25 점 ) 1) 원근정규화에대해설명하라. (5 점 ) 원근정규화는원근투영을직교투영으로바꾸는작업이다. 즉, x=±z, y=±z, z=near/far =>x=±1, y=±1, z=±1 로정규화 (normalization). 이과정에서원근감이생성된다. 2) glm::ortho(0, 10, 0, 10, 0, 10) 함수가직육면체관측공간에서정규화된관측공간으로변환시키는직교투영행렬 (orthographic projection matrix) 을생성해내는과정을보여주고있다. 각단계별로필요한 (A) 와 (B) 그리고최종행렬 (4x4) 을계산하라. (10 점 ) A B (A) 행렬 : 지정된관측공간의중심을정규관측공간의중심으로이동시키는행렬 T 을적용 (B) 행렬 : x = 1, y= 1, z= 1 로바꿔주기위하여관측공간의변의길이가 2 가되도록크기변환행렬 S 를적용 A= ortho=b*a= B= 2/7

3 3) glm::perspective(45, 1, 1, 100) 함수가절두체에서정규화된관측공간으로변환시키는원근투영행렬 (perspective projection matrix) 을생성하는과정을보여주고있다. 각단계별로필요한 (A) 와 (B) 의 4x4 행렬을유도하라. (10 점 ) glm::perspective(45, 1, 1, 100) = glm::frustum(-1/tan(22.5), 1/tan(22.5), -1/tan(22.5), 1/tan(22.5), 1, 100) A B (A) 행렬 : 지정된관측공간을 x= z, y= z, z = near/far 로크기변환행렬 S 을적용 (B) 행렬 : x= z, y= z, z = near/far 관측공간을 x= 1, y= 1, z= 1 로바꿔주는원근정규화 (perspective normalization) 행렬 N 을적용 A= = B= perspective=b*a= 3/7

4 3. 다음 View 행렬질문에답하라. (20 점 ) 1) 다음코드에서밑줄친변환함수인 glm::translate, glm::rotate 함수를제거하고, 화면에동일하게 View 가나타나도록 glm::lookat 사용하여 View 행렬코드를작성하라. (5 점 ) void display(void) { glclear(gl_color_buffer_bit GL_DEPTH_BUFFER_BIT); spmain.useprogram(); View = glm::mat4(1.0f); // glm::lookat( ); spmain.setuniform( gview, View); glm::mat4 T = glm::translate(glm::mat4(1.0f), glm::vec3(0, 0, -10)); glm::mat4 R = glm::rotate(glm::mat4(1.0f), -M_PI/2.0, glm::vec3(0, 1, 0)); World = T * R; spmain.setuniform( gmodel, World); drawteapot(); glutswapbuffers(); } 물체에 glm::translate(0, 0, -10) 과 glm::rotate(-90, glm::vec3(0,1,0)) 를적용시킨것은카메라가 x+ 에서바라본화면과동일함. 즉, glm::lookat 함수는 eye(10, 0, 0), at(0, 0, 0), up(0, 1, 0) 를사용하면된다. glm::lookat(glm:::vec3(10, 0, 0), glm::eye(0, 0, 0), glm::vec3(0, 1, 0)); // lookat 2) 위와는반대로, 다음코드에서밑줄친 glm::lookat 함수를제거하고, 화면에동일하게 View 가나타나도록변환함수인 glm::translate, glm::rotate 사용하여 World 행렬코드를작성하라. (5 점 ) void display(void) { glclear(gl_color_buffer_bit GL_DEPTH_BUFFER_BIT); spmain.useprogram(); View = glm::lookat(glm:::vec3(0, 0, 15), glm::eye(0, 0, 0), glm::vec3(0, 1, 0)); spmain.setuniform( gview, View); glm::mat4 T = glm::mat4(1.0f); glm::mat4 R = glm::mat4(1.0f); World = T * R; spmain.setuniform( gmodel, World); drawteapot(); glutswapbuffers(); } glm::lookat 함수는 eye(0, 0, 15), at(0, 0, 0), up(0, 1, 0) 는카메라가 z+ 15 에서물체를바라보는것으로, glm::translate(0, 0, -15))) 를사용하면동일한시점이된다. glm::translate(glm::mat4(1.0f), glm:::vec3(0, 0, -15)); 3) 아래의카메라위치와방향에서 90 도 YAW 회전한후에다시 90 도 Pitch 회전한 View 행렬을계산하라. 최종회전후의 Right, Up, Look 벡터의방향을그림으로도식화하고 View 행렬을유도하라. (10 점 ) 4/7

5 Yaw90 회전후 Up(0,1,0) Look(-1,0,0) Position(1,1,-2) Right(0,0,1) Yaw90 후 Pitch90 회전후 Up(-1,0,0) Position(1,1,-2) Right(0,0,1) Look(0,-1,0) View= 4. 다음은조명 (lighting) 공식에관한문제이다. 아래의질문에답하시오. (20 점 ) I K I a a m 1 fatt i 0 ( d ) K I ( N L) K I ( R V ) d d s s n E 1) 조명공식에서램버트법칙 (Lambertian Law) 을자세히설명하라. 이부분에대한쉐이더코드를적어라. (5 점 ) 램버트코사인법칙은난반사 (diffuse reflection) 에서면의밝기가입사각 ( 즉, 광원벡터와법선벡터의사이각 ) 의코사인에정비례함을말하는것이다. 즉, 면이서있는방향에따라차등적밝기를제공하여입체감을부여할수있다. Fragment shader 코드에서 costheta 는법선벡터 (N) 과광원벡터 (L) 간의내적은두벡터간의입사각의코사인과비례하며, diffuse reflection 과의곱에서사용된다. float costheta = clamp(dot(n, L), 0, 1); 2) 블린 (Blinn) 직접조명모델을설명하라. 블린모델의경우위의공식에서어떤부분을바꿔서사용하는지, 공식을적고자세히설명하라. (5 점 ) 블린직접조명모델은 Reflection 벡터대신 Halfway 벡터를사용하여정반사경면광을계산한다. (R V) n 대신 (H N) n 를사용함. 3) ( 정점이 4 개인 ) Quad 와 ( 정점이 개인 ) Grid 를각각 Gouraud Shading 과 Phong Shading 를사용했을때실행화면의차이점을설명하라. 각각실행결과화면 (wireframe mode 와 solid drawing mode 모두 ) 과코드의차이점을보여라. (10 점 ) Gouraud shading은일명 smooth shading라고도불리며, 폴리곤의각정점의색을 linear interpolation하여내부를부드럽게보간하는방식이다. (Per-vertex shading) 정점에서 lighting연산이된 Gouraud shading을 Quad에사용했을시정점이 4개이므로제대로된명암표현이되지않는다. 반면 Grid를사용했을시정점이 10000개이므로 Gouraud shading의 5/7

6 Quad 와비교하여좀더부드럽고자연스러운명암이표현이된다. Phong shading 은 (Gouraud shading 이정점의색을이용하여내부를보간하는반면 ) 폴리곤의각정점의 normal 을가지고폴리곤내부의각픽셀마다 normal 이보간되어 specular reflection 이더욱정확하게나타나게하는방식이다. (Per-pixel shading) pixel 에서 lighting 연산이된 Phong shading 을 Quad 에사용했을시정점의법선벡터를보간함으로서 Gouraud shading 과비교하여제대로된명암표현을 ( 즉더자연스러운경면광표현 ) 할수있다. Grid 를사용했을시 Quad 와비교하여좀더나은경면광표현을볼수있다. 또한 Gouraud shading 된 Grid 가색의보간으로인한뭉게짐현상이나타나는반면 Phong shading 의 Grid 는경면광표현이제대로표현된다. 5. 다음 OpenGL 텍스쳐매핑 (Texture Mapping) 과블렌딩 (Blending) 질문에답하라. (15 점 ) 1) Quad의각꼭지점 p1(-2,-2,0), p2(2,-2,0), p3(2,2,0), p4(-2,2,0) 에텍스쳐좌표 (texture coordinates) 를 t1(-1,-1), t2(0,-1), t3(0,0), t4(-1,0) 로지정했을때, texture wrapping 방식 (1)GL_REPEAT, (2) GL_MIRRORED_REPEAT, (3)GL_CLAMP_TO_EDGE 따른각각출력결과실행화면을보여라. 그리고 t1(-2,-2), t2(0,-2), t3(0,0), t4(-2,0) 로지정했을때, texture wrapping 방식 (4)GL_REPEAT, (5) GL_MIRRORED_REPEAT, (6)GL_CLAMP_TO_EDGE 따른각각출력결과실행화면을보여라. (opengl.jpg 사용할것 ) (10점) (1) GL_REPEAT (2) GL_MIRRORED_REPEAT (3) GL_CLAMP_TO_EDGE (4) GL_REPEAT (5) GL_MIRRORED_REPEAT (6) GL_CLAMP_TO_EDGE 2) Blending 을사용한 Multi-texturing 의원리를설명하라. 여기에서사용한 glblendfunc(gl_one, GL_ONE); 또는 glblendfunc(gl_zero, GL_SRC_COLOR); 블렌딩함수는각각무엇인가? (5 점 ) 블렌딩을사용한다중패스멀티텍스쳐링 (multi-pass multi-texturing) 방식은동일한다각형자체를여러번렌더링하는것으로, 배경이미지를먼저그리고난후, 그위에라이트매핑이미지를합성 (blending) 하여여러번다각형을그리는것이다. glblendfunc(gl_one, GL_ONE) 블렌딩함수는뎃셈블렌딩 (add blending) 으로배경이미지와라이트맵이미지가합산된결과이다. 6/7

7 6. 본인의이름 ( 모빌예제처럼계층적구조를가지고, 움직이는 ) 을각각 geometrypositioncolor, geometrypositionnormal, geometrypositionnormaltexture 을사용하여프로그램을만들어서실행결과화면을보여라. source code 와실행파일을포함한프로젝트파일전체를같이제출하라. (20 점 ) - 끝 - 7/7