서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (1/10) [CSE4170: 기초컴퓨터그래픽스 ] 기말고사 담당교수 : 임인성 답은연습지가아니라답안지에기술할것. 답안지공간이부족할경우, 답안지뒷면에기술하고, 해당답안지칸에그사실을명기할것. 연습지는수거하지않음. b 1 a c texel 4 e 3 2 d pixel preimage (a) 텍셀색깔의계산 (b) 밉맵레벨의결정 Figure 2: 스크린효과생성 (c) 텍스춰필터의적용결과 1 (a) 색깔혼합예 1 (d) 텍스춰필터의적용결과 2 Figure 1: 텍스춰필터링 1. 다음은텍스춰필터링에관한문제이다. 그림 1 을보면서답하라. (b) 색깔혼합예 2 Figure 3: OpenGL 을사용한색깔혼합
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (2/10) (a) 레벨 0 의밉맵텍스춰의한텍셀이나타내는영역의면적은레벨 3 의밉맵텍스춰의한텍셀이나타내는영역의면적의몇배일까? (b) 텍셀당두바이트를사용하는해상도가 1024 1024 인레벨 0 의텍스처에대해가능한모든레벨까지밉맵을구성할경우몇바이트의메모리공간이필요할까? (c) 그림 1(a) 에서 a 는픽셀에대한원상 (preimage) 의중점을가리키고, b 부터 e 까지는 a 를포함하는주변텍셀의중심점을나타낸다. GL LINEAR 가의미하는텍스춰필터링을적용할때결과로구해지는색깔에서 d 텍셀의색깔이차지하는비율을기술하라. (d) 위문제에서 GL NEAREST 가의미하는텍스춰필터링을적용할때의비율을기술하라. (e) 그림 1(b) 에는바닥에대한사각형 ( 삼각형두개로구성 ) 에한개의텍스춰를매핑한후밉매핑기능을사용할때적용되는레벨값으로구역을나눈상태를도시하고있다. 현재세영역으로구성이되어있는데, 어떤순서대로레벨값이높을지, 그리고그이유가무엇인지정확히기술하라. (f) 그림 1(c) 와 (d) 는축소상황에서각각서로다른 ( 반대가되는 ) 텍스춰필터링방법을적용한렌더링결과이다. 과연두텍스춰필터링방법에어떤차이가있는지각방법을두가지방향에서정확히기술하라. 2. 다음은스크린효과생성을위한 OpenGL 프래그먼트쉐이더코드의일부이다. ========================================. in vec2 v pos sc;. void main(void) { if (screen effect) { float x mod, y mod; x mod = mod( (A), 1.0f); y mod = mod( (B), 1.0f); if ( (x mod > 0.1f) && (x mod < 0.9f) && (y mod > 0.1f) && (y mod < 0.9f) ) discard; final color = l e(v pos EC, normalize(v norm EC)); ======================================== (a) 그림 2 의스크린사각형의각꼭지점에는 v pos sc = (v pos sc.x, v pos sc.y) 속성으로설정한값이주어져있다. 이프로그램이올바르게작동하기위하여 (A) 와 (B) 에들어갈내용을 OpenGL Shading Language 문법에맞게정확히기술하라. ( 참고 : mod(x, y) returns x y floor( x y ).) (b) ( 위문제를정확히해결하였다는가정하에 ) 만약두번째 if 문장을다음과같이바꿀경우, if ( (x mod < 0.1f) (x mod > 0.9f) (y mod < 0.1f) (y mod > 0.9f) ) 그림 2 의스크린효과가어떻게바뀔지기술하거나그림으로설명하라. 3. 다음은색깔혼합 (Color Blending) 에관한문제이다. (c S α S ) 와 (c D α D ) 를두이미지 S 와 D 의대응되는화소의미리곱한색깔 (pre-multiplied color) 이라할때, 두색깔의합성을통하여생성한결과색깔 (c O α O ) 는다음과같이표현할수 있다. ( co α O ) = F S ( cs α S ) + F D ( cd α D (a) 어떤미리곱한색깔이 (0.8, 0.8, 0.8, 0.8) 이라면, 이는그화소를어떻게칠해야한다는것인지정확히기술하라. (b) 그림 3(a) 가암시하는합성연산의경우해당하는 F S 와 F D 의값은각각얼마인가? (c) 만약 S over D 연산을적용한다면, 합성후 α O 는어떤값을가질지를 S 와 D 의관련값들을사용하여정확히기술하라. (d) 그림 3(b) 의상황을고려하자. 결과이미지의한화소에네개의물체 Y, R, G, 그리고 K 가순서대로투영되고있는데, 이물체들은각각순서대로 순수한 노란색, 빨간색, 초록색, 그리고검정색을띠고있으며, 각물체의불투명도 (opacity) 는각물체옆에기술되어있다. 지금이물체들의색깔을앞에서뒤로가면서 (front-to-back order) over 연산을사용하여합성한다고할때, Y 와 R 물체까지합성하였을때의불투명도값이무엇일지기술하라. (e) ( 바로위문제에이어서 ) 이물체들의색깔을뒤에서앞으로가면서 (back-to-front order) over 연산을사용하여합성한다고할때, K, G 그리고 R 물체까지합성하였을때의색깔이무엇인지미리곱한색깔형식으로기술하라. )
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (3/10) (f) 다음은투명한물체들을그려주는어떤프로그램의프래그먼트쉐이더코드이다. 여기서유니폼변수 u flag blending 이 0, 1, 또는 2 값을가질경우, 각각합성기능을사용하지않거나, 뒤에서앞으로가면서 over 연산을사용하여합성을하거나, 또는앞에서뒤로가면서 over 연산을사용하여합성을해주게된다. 또한, 함수 obj C(*,*) 는현재프래그먼트에칠할실제색깔 ( 미리곱한색깔이아닌 ) 을계산해주며, 불투명도값은프래그먼트속성변수 frag a 로들어온다. 만약 u flag blending 값을 1 로설정할경우, 올바른결과를얻기위하여 glblendfunc(*,*) 함수호출시사용할두인자를아래에서찾아순서대로기술하라. GL ZERO, GL ONE, GL SRC ALPHA, GL DST ALPHA, GL ONE MINUS SRC ALPHA, GL ONE MINUS DST ALPHA #version 420. uniform int u flag blending = 0; in vec3 v position EC; in vec3 v normal EC; in float frag a; layout (location = 0) out vec4 f c; vec3 obj C(in vec3 P EC, in vec3 N EC) { vec3 object color;. // Compute the fragment s RGB color. return object color; void main(void) { vec3 C = obj C(v position EC, normalize(v normal EC)); if (u flag blending == 0) f c = vec4(c, 1.0f); else if (u flag blending == 1) f c = vec4( ( 가 ), frag a); else if (u flag blending == 2) f c = vec4( ( 나 ), ( 다 ) ); (g) ( 바로위문제에이어서 ) 이경우위코드의 ( 가 ) 에들어갈내용을 OpenGL Shading Language 의문법에맞게정확히기술하라. (h) 만약 u flag blending 값을 2 로설정할경 우, 이프로그램이제대로작동하기위하여 glblendfunc(*,*) 함수호출에필요한두인자를순서대로기술하라. (i) ( 바로위문제에이어서 ) 이경우위코드의 ( 나 ) 와 ( 다 ) 에들어갈내용을 OpenGL Shading Language 의문법에맞게정확히기술하라. (j) 다음과같은단순한프래그먼트쉐이더를사용하는색깔합성프로그램을고려하자. #version 420 uniform vec4 u fragment color; layout (location = 0) out vec4 final color; void main(void) { final color = u fragment color; 아래의 OpenGL 코드에서는그림 4 에도시한바와같이서로다른영역을가지는세개의사각형을뒤에서앞으로오면서차례대로그려주고있다. 이프로그램수행후 A 화소지점에해당하는 color buffer 영역에저장되어있는 (R,G,B,A) 값을기술하라. 이때각색깔채널값은 0 과 1 사이의값으로정규화하여분수로답하라. ( 참고 : 각사각형을구성하는프래그먼트의색깔은대응하는 gluniform4f() 함수로설정한색깔로설정이됨 ) void display(void) { gldisable(gl DEPTH TEST); glclearcolor(0.0f, 0.0f, 0.0f, 0.0f); glclear(gl COLOR BUFFER BIT); glenable(gl BLEND); glblendfunc(gl SRC ALPHA, GL DST ALPHA); gluseprogram(h ShaderProgram PS); gluniform4f(loc u fragment color, draw Rectangle 2(); 1.0f, 0.0f, 0.0f, 0.5f); gluniform4f(loc u fragment color, draw Rectangle 1(); 1.0f, 0.0f, 0.0f, 0.5f); gluniform4f(loc u fragment color, draw Rectangle 0(); gluseprogram(0); gldisable(gl BLEND); glenable(gl DEPTH TEST); glutswapbuffers(); 0.0f, 0.0f, 1.0f, 1.0f);
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (4/10) Figure 5: 안개효과생성 Figure 4: 세개의사각형영역 (k) 위프로그램에서 blending factor 를설정하는부분을다음과같이변경할경우, glblendfunc(gl ONE MINUS SRC ALPHA, GL ONE); 이프로그램수행후 A 화소지점에해당하는 color buffer 영역에저장되어있는 (R,G,B,A) 값을기술하라. 이때각색깔채널값은 0 과 1 사이의값으로정규화하여분수로답하라. (l) ( 바로위문제에이어서 ) 이프로그램수행후 B 화소지점에해당하는 color buffer 영역에저장되어있는 (R,G,B,A) 값을기술하라. 이때각색깔채널값은 0 과 1 사이의값으로정규화하여분수로답하라. 4. 다음은안개효과생성을위한 OpenGL 프래그먼트쉐이더코드의일부이다. 아래의코드와그림 5 를보면서답하라. ======================================== fog factor = (far dist - length(pe.xyz)) /(far dist - near dist); fog factor = clamp(fog factor, 0.0f, 1.0f); final color = mix(fog color, shaded color, fog factor); ======================================== (a) 이코드는 OpenGL 의눈좌표계 (EC) 에서계산을하고있다. 문맥상그림 5 의한점 P e 지점에서의안개효과생성을위하여 d 0 와 d 1 중어떤거리척도를사용하고있는가? (b) d 0 와 d 1 중위코드에서사용하고있는것이아닌다른척도를사용하려면, 첫번째문장을어떻게수정을해야할지, OpenGL Figure 6: 실시간렌더링파이프라인 Shading Language 의문법에맞게기술하라. ( 참고 : 0 < near dist < far dist) (c) mix() 함수는선형보간에기반을두고있다. 다음과같은변수값에대해, fog color = (0.8, 0.8, 0.8, 1.0), shaded color = (0.4, 0.2, 0.8, 1.0), fog factor = 0.4, final color 의결과값을기술하라. 5. 다음은실시간렌더링파이프라인에관한문제이다. 그림 6 의렌더링파이프라인을보면서한학기동안수업에서배운 OpenGL 렌더링파이프라인을바탕으로답하라. 아래의문제에서별도로기술하지않으면 정상적인 OpenGL 렌더링 과정을가정한다. ( 필요할경우 NDC, CC, WdC, MC, EC, 그리고 WC 등의기호를사용하여답할것 ) (a) 정규화된 3 차원필름 을기준으로설정된좌표계가존재하는박스의기호를기술하라. (b) 투명한물체효과를생성하기위하여색깔을섞어주는계산을가장자연스럽게수행할수있는지점에대한박스의기호를기술하라. (c) GL LINEAR 라는 OpenGL 인자가직접적으로적용이되는박스의기호를기술하라.
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (5/10) (d) Gouraud 쉐이딩계산시자연스럽게 lighting equation 이적용이되는지점에대한박스의기호를기술하라. (e) 삼각형을구성하는꼭지점들의회전방향을통하여그삼각형의앞면이보이는지뒷면이보이는지를판별하는지점이존재하는박스의기호를기술하라. (f) 계층적모델링을위한기하변환이빈번하게일어나는박스의기호를기술하라. (g) (A) 박스는 OpenGL 의어느좌표계에서어느좌표계까지의기하계산을담당하는가? (h) 꼭지점속성값이프래그먼트로전달이되는지점에대한박스의기호를기술하라. (i) (C) 박스는 OpenGL 의어느좌표계에서어느좌표계까지의기하계산을담당하는가? (j) 구조적으로프레임버퍼를가장빈번하게접근해야하는박스의기호를기술하라. (k) 뷰폿변환이수행이되는지점이존재하는박스의기호를기술하라. (l) 뷰잉변환이수행이되는지점이존재하는박스의기호를기술하라. (m) 원근투영시원근감이생성이되는지점이존재하는박스의기호를기술하라. (n) 카메라를기준으로설정된좌표계가존재하는박스의기호를기술하라. (o) glm::perspective() 함수가설정한 3 차원영역을벗어난기하프리미티브들을제거하는계산이수행되는박스의기호를기술하라. (p) 픽셀단위의안개효과를가장자연스럽게생성할수있는지점에대한박스의기호를기술하라. 6. 다음은어떤버텍스쉐이더코드의일부인데, 여기서 Pos, pos, Norm, 그리고 norm 은모두 vec3 타입의변수들이다.. void main(void) { gl Position = M t*vec4(pos, 1.0f); Pos = vec3(m p*vec4(pos, 1.0f)); Norm = normalize(m n*norm); (a) 마지막두문장은좌표와법선벡터방향이각각 pos 와 norm 인점에대한아핀변환을수행하고있다. 보편적인렌더링상황에서 M p 행렬이다음과같을때, M n 은어떤행렬이어야하는지정확히기술하라. ( 주의 : 행과열의개수가정확해야함 ) 0 0 1 2 0 1 0 3 M p = 1 0 0 0 0 0 0 1 (b) norm 변수에는항상길이가 1 인법선벡터값이저장이되어있다고가정하자. 만약 M p 가위문제와같을때과연마지막문장에서의 normalize() 함수호출이필요한지아니면불필요한지를정확한수학적인개념을사용하여기술하라. (c) 만약 M p 행렬이다음과같을때, M n 은어떤행렬이어야하는지정확히기술하라. ( 주의 : 행과열의개수가정확해야함 ) M p = 0 0 2 1 0 2 0 2 2 0 0 6 0 0 0 1 (d) 이코드에서래스터화과정중프래그먼트쉐이더로전달이되는정보를저장하고있는변수들을모두기술하라. (e) 이코드에서버텍스쉐이더를수행하기전에기하모델을구성하는매꼭지점마다설정해주어야하는정보를저장하고있는변수들을모두기술하라. (f) 이코드에서버텍스쉐이더를수행하기전에기하모델을구성하는매꼭지점마다설정할필요가없이필요할때만설정해주면되는정보를저장하고있는변수들을모두기술하라. (g) 만약첫문장바로직후에다음과같은문장을삽입하면, gl Position.y *= -1.0f; 렌러링결과가어떻게바뀔지기술하라. 7. 그림 7(a) 에는두가지형태의퐁의조명모델식이주어져있고, (b)-(d) 에는 OpenGL 시스템에서사용하는기본조명공식이기술되어있다. (a) (a) 의공식에서 Lambert 의코사인법칙을표현해주는부분만정확히기술하라. (b) (a) 의공식에서평행광원과평행투영을사용할경우, 물체의위치와방향이바뀌었을때영향을받는변수를모두나열하라 (d i 는제외 ). (c) (a) 의공식에서카메라에서바라보는방향에직접적으로영향을받는변수를모두나열하라.
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (6/10) m 1 I λ = I aλ k aλ + f att (d i ) I li λ {k dλ (N L i ) + k sλ (R i V ) n (1) I λ = I aλ k aλ + i=0 m 1 i=0 f att (d i ) I li λ {k dλ (N L i ) + k sλ (N H i ) n (2) (a) 퐁의조명모델식의두예 ( N = V = L i = R i = H i = 1) c = e cm + a cm a cs + n 1 (att i )(spot i )[a cm a cli + (n VP pli )d cm d cli + (f i )(n ĥi) srm s cm s cli ] i=0 (b) OpenGL 시스템의조명공식 att i = { 1 k 0i + k 1i VP pli + k 2i VP pli, 2 P pli s w 0, 1.0, otherwise (c) 빛의감쇠효과의계산 ( P pli V ŝ dli ) s rli, c rli 180.0 and (A) (B), spot i = 0.0, c rli 180.0 and (A) < (B), 1.0, c rli = 180.0 (d) 스폿광원효과의계산 Figure 7: 조명모델공식예 (d) (a) 의공식에서현재퐁의조명모델식이적용되고있는물체표면지점의좌표를 P 라고하자. (b) 의공식에서이 P 에해당하는변수 ( 또는수식 ) 를기술하라. (e) (b) 의공식에서 (a) 의공식의 d i 에해당하는변수 ( 또는수식 ) 를기술하라. (f) (b) 의공식에서 은주어진두벡터 u 와 v 에대하여어떠한값을계산해주는연산자인지정확히기술하라. (g) (b) 의공식에서 0 벡터가아닌임의의벡터 v 에대해 ˆv 는무엇을의미하는가? (h) 정반사방향 (reflection direction), 즉정반사물질이입사광선을가장강하게반사시키는방향을 (b) 공식의변수들을사용하여표현하라. ( 참고 : n VP pli 은양수가가정함 ) (i) (b) 의공식에서아래그림이암시하는효과를조절할수있는변수를기술하라. (j) (b) 의공식에서간접조명 (indirect illumination) 효과를 ( 근사적이나마 ) 생성하는데필요한간접적으로들어오는빛, 즉간접적인입사광선과직접적인연관성이있는변수들을모두기술하라. (k) (d) 의공식에서문맥상 (A) 와 (B) 에공통으로들어갈수식을정확히기술하라. 8. 9 쪽에는 OpenGL Shading Language 를사용하여가급적그림 7(b) 의퐁의조명모델식에기반을두어퐁쉐이딩방법을구현한버텍스쉐이더와프래그먼트쉐이더프로그램이주어져있다. (a) 이두쉐이더코드에서 OpenGL 의절단좌표계 (Clip Coordinate) 공간에서의값을가지는변수들을모두기술하라. (b) 이프래그먼트쉐이더에서 i 번째광원 u light[i] 가평행광원 (parallel or direc-
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (7/10) tional light) 이라면, 문맥상이구조변수의어떤필드값이어떤값을가져야할까? (c) 73 번문장수행후 tmp vec4.y 에저장이되는값의정확한기하적인의미를기술하라. (d) 점광원을사용할경우그림 7(a) 의조명공식 (1) 에서의벡터 L i 값이계산이되는문장번호를기술하라. (e) 그림 7(c) 의 i 번째광원에해당하는 k 2i 값을저장하고있는변수 ( 또는식 ) 를이코드에서찾아 OpenGL Shading Language 문법에맞게정확히기술하라. (f) 104 번문장에서 -normalize(p EC) 는정확히어느지점에서어느지점을향한벡터인지기술하라. (g) 104 번문장에서계산해주는벡터 H EC 의이름을기술하라. (h) 104 번문장의 ( 가 ) 부분에들어갈수식을 OpenGL Shading Language 문법에맞게정확히기술하라. (i) 105 번문장의 ( 나 ) 와 ( 다 ) 에들어갈두벡터에해당하는기호각각을그림 7(a) 의조명공식 (2 ) 에서찾아기술하라. ( 참고 : 순서는상관없음 ) (j) 111 번문장의 ( 라 ) 에들어갈변수의값을그림 7(b) 의조명공식의기호들을사용하여기술하라. (k) 84 번문장의 ( 마 ) 부분에들어갈수식을 OpenGL Shading Language 문법에맞게정확히기술하라. (l) 그림 7(b) 의조명식의변수 f i 의사용목적이이쉐이더에서는어떻게달성이되는지관련문장번호를지칭하면서정확히설명하라. 9. 10 쪽의코드는계층적모델링변환을통하여자동차를세상좌표계로그려주는 OpenGL 프로그램이다. 이코드와그림 8 을보면서답하라. (a) 이프로그램은그림 8 에주어진자동차를구성하는트리구조를어떤한방식으로탐색하고있는지자료구조시간에배운컴퓨터공학용어를사용하여기술하라. (b) 프로그램문맥상 62 번문장의 (A) 에들어갈내용을이프로그램의문법에맞게정확히기술하라. (c) 프로그램문맥상 62 번문장의 (B), (C), 그리고 (D) 에들어갈내용을이프로그램의문법에맞게정확히기술하라. ( 힌트 : 그림 8 의내용을잘살펴볼것 ) (d) 이프로그램의 26 번문장은자동차가움직임에따라두앞바퀴가좌우로회전하는모습을생성해주는기하변환을계산하고있다 (draw car() 함수에서적용이됨 ). 문맥상 (E), (F), 그리고 (G) 에들어갈내용을이프로그램의문법에맞게정확히기술하라. (e) 이프로그램의 29 번문장은자동차가움직임에따라네바퀴가진행방향으로회전하는모습을생성해주는기하변환을계산하고있다 (draw car() 함수에서적용이됨 ). 문맥상 (H), (I), 그리고 (J) 에들어갈내용을이프로그램의문법에맞게정확히기술하라. (f) 이프로그램에서 94 번문장수행후변수 ModelMatrix CAR WHEEL 에저장되는 4 행 4 열의내용을그림 8 의행렬기호를사용하여표현하라. (g) 57 번문장의 draw wheel and nut() 함수가 92 번문장에서호출되어수행이되는과정에서, 변수 i 가 2 일때 63 번문장수행결과변수 ModelMatrix CAR NUT 에저장되는행렬의내용을그림 8 의행렬기호를사용하여표현하라. 이순간에행렬 car status.matrix CAR WHEEL ROTATE 의내용은 M R 이라고가정함. (h) 이프로그램의 85 번문장은자동차의운전석에배치한카메라의위치와방향을기술해주는프레임을그려주는역할을한다 (x, y, 그리고 z 축각각이 u, v, 그리고 n 축에대응함을상기할것 ). 이자동차의운전석에서세상을바라볼때오른쪽방향은자동차바디 (CAR BODY) 의모델링좌표계를기준으로어느축방향을향하고있을까? 양의 x 축 또는 음의 x 축 과같이해당축과방향을정확히기술할것. (i) 이프로그램의 92 번문장과 97 번문장이그려주는 0 번과 1 번바퀴와는달리 104 번문장과 110 번문장이그려주는 2 번과 3 번바퀴에대해서는크기변환 (scale) 이수행되는이유는무엇일까? (j) 이프로그램의 42 번문장은카메라를운전석에배치할때의뷰잉변환행렬을계산해주고있다. 이문장에서변수 ModelMatrix CAR BODY to DRIVER 는자동차바디의모델링좌표계의원점에정렬되어있는카메라프레임을이좌표계상에서운전석의위치로변환시켜주는강체변환을저장하고있다. 문맥상이프로그램이
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (8/10) Figure 8: 자동차의계층적표현 제대로작성하기위하여 (K) 에들어갈내용을이프로그램에서사용한변수를사용하여정확히기술하라. ( 힌트 : 뷰잉변환은세상좌표에존재하는카메라프레임을좌 표계원점을중심으로정렬시켜주는변환임을상기할것 )
1 /*************************** VERTEX SHADER *******************************/ 2 #version 430 3 4 uniform mat4 u_modelviewprojectionmatrix; 5 uniform mat4 u_modelviewmatrix; 6 uniform mat3 u_modelviewmatrixinvtrans; 7 8 layout(location = 0) in vec3 a_position; 9 layout(location = 1) in vec3 a_normal; 10 out vec3 v_position_ec; 11 out vec3 v_normal_ec; 12 13 void main(void) { 14 v_position_ec = vec3(u_modelviewmatrix*vec4(a_position, 1.0f)); 15 v_normal_ec = normalize(u_modelviewmatrixinvtrans*a_normal); 16 17 gl_position = u_modelviewprojectionmatrix*vec4(a_position, 1.0f); 18 19 20 21 /*************************** FRAGMENT SHADER *******************************/ 22 #version 430 23 24 struct LIGHT { 25 vec4 position; 26 vec4 ambient_color, diffuse_color, specular_color; 27 vec4 light_attenuation_factors; // compute this effect only if.w!= 0.0f 28 vec3 spot_direction; 29 float spot_exponent; 30 float spot_cutoff_angle; 31 bool light_on; 32 ; 33 34 struct MATERIAL { 35 vec4 ambient_color; 36 vec4 diffuse_color; 37 vec4 specular_color; 38 vec4 emissive_color; 39 float specular_exponent; 40 ; 41 42 uniform vec4 u_global_ambient_color; 43 #define NUMBER_OF_LIGHTS_SUPPORTED 4 44 uniform LIGHT u_light[number_of_lights_supported]; 45 uniform MATERIAL u_material; 46 47 const float zero_f = 0.0f; 48 const float one_f = 1.0f; 49 50 in vec3 v_position_ec; 51 in vec3 v_normal_ec; 52 layout(location = 0) out vec4 final_color; 53 54 vec4 lighting_equation(in vec3 P_EC, in vec3 N_EC) { 55 vec4 color_sum; 56 float local_scale_factor, tmp_float; 57 vec3 L_EC; 58 59 color_sum = u_material.emissive_color + u_global_ambient_color * u_material.ambient_color; 60 61 for (int i = 0; i < NUMBER_OF_LIGHTS_SUPPORTED; i++) { 62 if (!u_light[i].light_on) continue; 63 64 local_scale_factor = one_f; 65 if (u_light[i].position.w!= zero_f) { 66 L_EC = u_light[i].position.xyz - P_EC.xyz; 67 68 if (u_light[i].light_attenuation_factors.w!= zero_f) { 69 vec4 tmp_vec4; 70 71 tmp_vec4.x = one_f; 72 tmp_vec4.z = dot(l_ec, L_EC); 73 tmp_vec4.y = sqrt(tmp_vec4.z); 74 tmp_vec4.w = zero_f; 75 local_scale_factor = one_f / dot(tmp_vec4, u_light[i].light_attenuation_factors); 76 77 78 L_EC = normalize(l_ec); 79 80 if (u_light[i].spot_cutoff_angle < 180.0f) { // [0.0f, 90.0f] or 180.0f 81 float spot_cutoff_angle = clamp(u_light[i].spot_cutoff_angle, zero_f, 90.0f); 82 vec3 spot_dir = normalize(u_light[i].spot_direction); 83 84 tmp_float = dot( ( 마 ), spot_dir); 85 if (tmp_float >= cos(radians(spot_cutoff_angle))) { 86 tmp_float = pow(tmp_float, u_light[i].spot_exponent); 87 88 else 89 tmp_float = zero_f; 90 local_scale_factor *= tmp_float; 91 92 93 else { 94 L_EC = normalize(u_light[i].position.xyz); 95 96 97 if (local_scale_factor > zero_f) { 98 vec4 local_color_sum = u_light[i].ambient_color * u_material.ambient_color; 99 100 tmp_float = dot(n_ec, L_EC); 101 if (tmp_float > zero_f) { 102 local_color_sum += u_light[i].diffuse_color*u_material.diffuse_color*tmp_float; 103 104 vec3 H_EC = normalize( ( 가 ) - normalize(p_ec)); 105 tmp_float = dot( ( 나 ), ( 다 ) ); 106 if (tmp_float > zero_f) { 107 local_color_sum += u_light[i].specular_color 108 *u_material.specular_color*pow(tmp_float, u_material.specular_exponent); 109 110 111 color_sum += ( 라 ) *local_color_sum; 112 113 114 return color_sum; 115 116 117 void main(void) { 118 final_color = lighting_equation(v_position_ec, normalize(v_normal_ec)); 119 120
1 #define WHEEL_NUT_RADIUS (1.7f - 0.5f) 2 #define WHEEL_NUT_Z_OFFSET 1.0f 3 4 #define FRONT_WHEEL_ROLL_ANGLE_DELTA 5.0f 5 #define FRONT_WHEEL_TURN_ANGLE_DELTA 2.5f 6 #define FRONT_WHEEL_TURN_ANGLE_MAX 45.0f 7 #define BODY_YAW_SENSITIVITY 0.1f 8 9 struct _CAR_STATUS { 10 float body_yaw_angle; 11 float front_wheel_roll_angle; 12 float front_wheel_turn_angle; 13 glm::mat4 Matrix_CAR_WHEEL_ROTATE; 14 int flag_body_yaw_mode; 15 car_status; 16 17 void update_car_body_transformation(void) { 18 ModelMatrix_CAR_BODY = glm::rotate(glm::mat4(1.0f), 19 TO_RADIAN*car_status.body_yaw_angle, glm::vec3(0.0f, 1.0f, 0.0f)); 20 21 ModelMatrix_CAR_BODY_INVERSE = glm::rotate(glm::mat4(1.0f), 22 -TO_RADIAN*car_status.body_yaw_angle, glm::vec3(0.0f, 1.0f, 0.0f)); 23 24 25 void update_car_front_wheel_rotate_matrix(void) { 26 car_status.matrix_car_wheel_rotate = glm::rotate(glm::mat4(1.0f), 27 TO_RADIAN*car_status.front_wheel_turn_angle, glm::vec3( (E), (F), (G) )); 28 29 car_status.matrix_car_wheel_rotate = glm::rotate(car_status.matrix_car_wheel_rotate, 30 TO_RADIAN*car_status.front_wheel_roll_angle, glm::vec3( (H), (I), (J) )); 31 32 33 void set_viewmatrix_for_world_viewer(void) { 34 ViewMatrix = glm::mat4(camera_wv.uaxis.x, camera_wv.vaxis.x, camera_wv.naxis.x, 0.0f, 35 camera_wv.uaxis.y, camera_wv.vaxis.y, camera_wv.naxis.y, 0.0f, 36 camera_wv.uaxis.z, camera_wv.vaxis.z, camera_wv.naxis.z, 0.0f, 37 0.0f, 0.0f, 0.0f, 1.0f); 38 ViewMatrix = glm::translate(viewmatrix, -camera_wv.pos); 39 40 41 void set_viewmatrix_for_driver(void) { 42 ViewMatrix = glm::affineinverse( (K) * ModelMatrix_CAR_BODY_to_DRIVER); 43 44 45 void initialize_car(void) { 46 car_status.body_yaw_angle = 0.0f; 47 update_car_body_transformation(); 48 if (camera_type == CAMERA_DRIVER) { 49 set_viewmatrix_for_driver(); 50 ViewProjectionMatrix = ProjectionMatrix * ViewMatrix; 51 52 car_status.front_wheel_roll_angle = 0.0f; 53 car_status.front_wheel_turn_angle = 0.0f; 54 update_car_front_wheel_rotate_matrix(); 55 56 57 void draw_wheel_and_nut() { 58 gluniform3f(loc_primitive_color, 0.000f, 0.808f, 0.820f); // color name: DarkTurquoise 59 draw_geom_obj(geom_obj_id_car_wheel); // draw wheel 60 61 for (int i = 0; i < 5; i++) { 62 ModelMatrix_CAR_NUT = glm::rotate( (A), TO_RADIAN*72.0f*i, glm::vec3( (B), (C), (D) )); 63 ModelMatrix_CAR_NUT = glm::translate(modelmatrix_car_nut, glm::vec3(wheel_nut_radius, 0. 0f, WHEEL_NUT_Z_OFFSET)); 64 ModelViewProjectionMatrix = ViewProjectionMatrix * ModelMatrix_CAR_NUT; 65 gluniformmatrix4fv(loc_modelviewprojectionmatrix, 1, GL_FALSE, &ModelViewProjectionMatrix [0][0]); 66 67 gluniform3f(loc_primitive_color, 0.690f, 0.769f, 0.871f); // color name: LightSteelBlue 68 draw_geom_obj(geom_obj_id_car_nut); // draw i-th nut 69 70 71 72 void draw_car(void) { 73 gluniform3f(loc_primitive_color, 0.498f, 1.000f, 0.831f); // color name: Aquamarine 74 draw_geom_obj(geom_obj_id_car_body); // draw body 75 76 gllinewidth(5.0f); 77 draw_axes(); // draw MC axes of body 78 gllinewidth(1.0f); 79 80 ModelMatrix_CAR_DRIVER = glm::translate(modelmatrix_car_body, glm::vec3(-3.0f, 0.5f, 2.5f)); 81 ModelMatrix_CAR_DRIVER = glm::rotate(modelmatrix_car_driver, TO_RADIAN*90.0f, glm::vec3(0.0f, 1.0f, 0.0f)); 82 ModelViewProjectionMatrix = ViewProjectionMatrix * ModelMatrix_CAR_DRIVER; 83 gluniformmatrix4fv(loc_modelviewprojectionmatrix, 1, GL_FALSE, &ModelViewProjectionMatrix[0] [0]); 84 gllinewidth(5.0f); 85 draw_axes(); // draw camera frame at driver seat 86 gllinewidth(1.0f); 87 88 ModelMatrix_CAR_WHEEL = glm::translate(modelmatrix_car_body, glm::vec3(-3.9f, -3.5f, 4.5f)); 89 ModelMatrix_CAR_WHEEL *= car_status.matrix_car_wheel_rotate; 90 ModelViewProjectionMatrix = ViewProjectionMatrix * ModelMatrix_CAR_WHEEL; 91 gluniformmatrix4fv(loc_modelviewprojectionmatrix, 1, GL_FALSE, &ModelViewProjectionMatrix[0] [0]); 92 draw_wheel_and_nut(); // draw wheel 0 93 94 ModelMatrix_CAR_WHEEL = glm::translate(modelmatrix_car_body, glm::vec3(3.9f, -3.5f, 4.5f)); 95 ModelViewProjectionMatrix = ViewProjectionMatrix * ModelMatrix_CAR_WHEEL; 96 gluniformmatrix4fv(loc_modelviewprojectionmatrix, 1, GL_FALSE, &ModelViewProjectionMatrix[0] [0]); 97 draw_wheel_and_nut(); // draw wheel 1 98 99 ModelMatrix_CAR_WHEEL = glm::translate(modelmatrix_car_body, glm::vec3(-3.9f, -3.5f, -4.5f)); 100 ModelMatrix_CAR_WHEEL *= car_status.matrix_car_wheel_rotate; 101 ModelMatrix_CAR_WHEEL = glm::scale(modelmatrix_car_wheel, glm::vec3(1.0f, 1.0f, -1.0f)); 102 ModelViewProjectionMatrix = ViewProjectionMatrix * ModelMatrix_CAR_WHEEL; 103 gluniformmatrix4fv(loc_modelviewprojectionmatrix, 1, GL_FALSE, &ModelViewProjectionMatrix[0] [0]); 104 draw_wheel_and_nut(); // draw wheel 2 105 106 ModelMatrix_CAR_WHEEL = glm::translate(modelmatrix_car_body, glm::vec3(3.9f, -3.5f, -4.5f)); 107 ModelMatrix_CAR_WHEEL = glm::scale(modelmatrix_car_wheel, glm::vec3(1.0f, 1.0f, -1.0f)); 108 ModelViewProjectionMatrix = ViewProjectionMatrix * ModelMatrix_CAR_WHEEL; 109 gluniformmatrix4fv(loc_modelviewprojectionmatrix, 1, GL_FALSE, &ModelViewProjectionMatrix[0] [0]); 110 draw_wheel_and_nut(); // draw wheel 3 111