서강대학교 공과대학 컴퓨터공학과 CSE4170 기초 컴퓨터 그래픽스 중간고사 (1/6) [CSE4170: 기초 컴퓨터 그래픽스] 기말고사 (담당교수: 임 인 성) 답은 연습지가 아니라 답안지에 기술할 것. 답안지 공간이 부족할 경우, 답안지 뒷면에 기 술하고, 해당 답안지 칸에 그 사실을 명기할 것. 1. 다음은 OpenGL fixed-function 렌더링 파이프라 인에 관한 문제이다. 각 문제에 대하여 그림 5를 보면서, 해당하는 상자 이름 ((A), (B), (C),...) 을 사용하여 정확하게 답하라. (a) 삼각형의 세 꼭지점의 회전 방향에 따라 그 삼각형이 눈에 보이는 앞면에 해당하는지 아닌지를 결정하는 지점은? (b) 다음 그림이 암시하는 렌더링 계산은 어느 지점에서 어느 지점까지에 해당하는가? (h) 정상적인 렌더링 과정에서 움직이는 자동 차의 운전석에 카메라를 배치하는 기하 변 환이 적용되는 지점은? (i) 어느 두 지점 사이에서 꼭지점의 좌표값이 항상 -1과 1사이의 값만 가질까? (j) 일종의 눈속임 기법인 무한 관찰자 (infinite viewer) 기능이 적용되는 지점은? (k) 어느 지점 직후부터 꼭지점의 좌표값이 카 메라를 기준으로 한 값으로 바뀔까? (l) 버텍스 쉐이더는 이 렌더링 파이프라인의 시작 지점부터 어느 지점까지의 계산을 대 치할까? 2. 그림 1(a)에 주어진 OpenGL 조명 공식을 보면 서 답하라. (a) OpenGL fixed-function 렌더링 파이프라인 에서는 이 공식이 WC, NDC, CC, WdC, MC, EC 중 어떤 좌표계에서 적용되는가? (c) 정상적인 렌더링 과정에서 다음과 같은 형 태의 행렬이 빈번히 저장되는 지점은? cot( f ovy ) 2 asp 0 0 0 0 0 0 cot( f ovy 2 ) +n 0 ff n 0 1 0 0 2nf f n 0 (d) 화면에 띠운 윈도우를 기준으로한 좌표값 은 어느 지점에서 비로소 생성될까? (e) 정상적인 렌더링 과정 중 어떤 지점의 계 산 결과 동차 좌표계의 네 번째 좌표 값, 즉 w 값이 1이 아닌 값이 처음으로 나타날 수 있을까? (f) (위 문제에 이어) 어떤 지점의 계산 결과 w 좌표가 다시 1 값을 가지게 될까? (g) 빛의 감쇠 효과가 생성되는 지점은? (b) 쉐이딩하려는 물체를 구성하는 물질의 빛 의 반사 성질을 표현하는 변수를 모두 기술 하라. (c) 는 두 벡터간의 변형된 내적 연산자를 의 미하는데, 일반적인 내적 계산과 어떤 차이 가 있는가? (d) 이 공식에서 0 벡터가 아닌 임의의 벡터 v 에 대해 v 는 무엇을 의미하는가? (e) 정반사 방향, 즉 정반사 물질이 입사 광선을 가장 강하게 반사시키는 방향을 이 공식의 변수들을 사용하여 표현하라. (f) (문제 삭제) (g) 램버트의 코사인 법칙을 표현해주는 수식 을 정확히 기술하라. (h) 다음 그림 (네 개의 물주전자)의 렌더링 효 과는 이 공식의 어떤 변수를 사용하여 조절 한 것일까? - 2014년 6월 16일(월) 오후 7:00 (AS 414) c 2014 서강대학교 공과대학 컴퓨터공학과 임인성
서강대학교 공과대학 컴퓨터공학과 CSE4170 기초 컴퓨터 그래픽스 중간고사 (2/6) c = ecm + acm acs + n 1 X (atti )(spoti )[acm acli + (n VPpli )dcm dcli + (fi )(n h i )srm scm scli ] i=0 (a) OpenGL 조명 공식 spoti = (Ppli V s dli )srli, if crli = 6 180.0 & Ppli V α, if crli = 6 180.0 & Ppli V β, if crli = 180.0 s dli, s dli, (b) 스폿 광원 효과 Figure 1: OpenGL 조명 공식 관련 수식 (i) 아래 식은 해프웨이 벡터 (halfway vector) 를 계산하는 과정을 기술하고 있다. ( VP + VPe, vbs = TRUE, hi = pli VPpli + (a b c d)t, vbs = FALSE (j) (k) (l) (m) 여기서 Pe 의 동차좌표를 기술하라. (위 문제에 이어) 지금 쉐이딩하려는 점 V 의 동차좌표가 (0 0 100 1)t 이라 할 때, 벡 터 VPe 의 동차좌표를 기술하라. (위 문제에 이어) 무한 관찰자 (infinite viewer) 기능을 사용한다고 할 때, a, b, c, 그리고 d 값을 기술하라. (위 문제에 이어) 계산효율 관점에서 볼 때, 해프웨이 벡터의 사용이 효과를 보려면 우 선 무한 관찰자 기능을 사용 (또는 직교 투 영을 사용)해야 한다. 이와 함께 만족해야 할 추가적인 조건은 무엇인지 기술하라. 다음 그림은 직접 조명에 의한 빛의 반사 효과를 생성하는 과정을 보여주고 있다. OpenGL 조명 공식에서 가장 왼쪽 그림의 (n) (위 문제에 이어) 이 공식에서 (근사적으로 나마) 간접 조명 효과를 생성해주는 수식을 정확히 기술하라 (광원은 n개가 있다고 가 정하며, 필요하다면 Σ 기호외에 ecm, (atti ), (spoti ), 그리고 (fi )와 같은 변수들을 사용 할 것). (o) 그림 1(b)에는 스폿 광원 효과 생성을 위한 공식이 주어져 있는데, 다음 그림을 보면서 답하라. ψ OpenGL 시스템에서는 절단 각도 crli 는 디 폴트 값으로 180.0이 설정되어 있으며, 이는 사방으로 빛을 방출하는 일반적인 점 광원 을 사용한다는 것을 의미한다. 위 식이 올 바르게 스폿 광원 효과를 생성할 수 있도록, 와 에 들어갈 수식을 정확히 표현하라. (p) (위 문제에 이어) 이 공식에서 α와 β 값을 기술하라. (q) (위 문제에 이어) 이 공식에서 cos ψ 값과 가장 관련이 깊은 수식을 기술하라. 렌더링 효과에 해당하는 수식을 정확히 기 술하라 (광원은 n개가 있다고 가정하며, 필 요하다면 Σ 기호외에 ecm, (atti ), (spoti ), 그리고 (fi )와 같은 변수들을 사용할 것). (r) (위 문제에 이어) 이 공식에서 srli 를 통하여 어떤 광원 효과를 조절할 수 있을까? - 2014년 6월 16일(월) 오후 7:00 (AS 414) c 2014 서강대학교 공과대학 컴퓨터공학과 임인성
서강대학교 공과대학 컴퓨터공학과 CSE4170 기초 컴퓨터 그래픽스 중간고사 3. 다음은 광원의 기하 성질의 설정에 관한 문제이 다. 그림 2에는 세 가지 서로 다른 형태의 광원이 사용되고 있다. A 광원은 세상 좌표계에서 임의 로 돌아다니고 있는 빨간 소의 눈에서 나오는 레이저 형태의 광원이고, B 광원은, 역시 세상 좌표계에서 임의로 돌아다니고 있는, 관찰자, 즉 카메라의 바로 위에 고정된 스폿 광원이며, 마지 막으로 C 광원은 세상 좌표계의 한 지점에 고정 된 가로등에 설치된 조명이다. A B (3/6) light1 pos);... glpushmatrix(); glrotatef(angle, 0.0, 1.0, 0.0); gltranslatef(0.0, 0.0, 5.0); glscalef(6.5, 6.5, 6.5);... gllightfv(gl LIGHT2, GL POSITION, light2 pos);... C glpopmatrix(); glutswapbuffers(); Figure 2: 광원 기하 성질의 설정 (a) OpenGL fixed-function 렌더링 파이프라인 을 통한 정상적인 렌더링 상황에서 A 광 원의 기하 성질을 설정하는 시점에 모델뷰 행렬 스택의 탑에 있는 기하변환 행렬은 (WC, NDC, CC, WdC, MC, EC 등의 좌 표계를 고려할 때) 어떤 좌표계에서 어떤 좌표계로 보내주는 행렬이어야 할까? (b) C 광원에 대해 위 문제를 풀어라. (c) 아래 코드는 그림 2를 그려주는 디스플레이 컬백 함수의 일부를 보여주고 있다. 정상적 인 렌더링 상황에서 이 함수에서 정의되는 세 개의 광원, 즉 GL LIGHT0, GL LIGHT1, 그리고 GL LIGHT2는 위의 세 광원과 어떻 게 자연스럽게 대응이 될까? void display(void) { glclear(gl COLOR BUFFER BIT GL DEPTH BUFFER BIT); glmatrixmode(gl MODELVIEW); glloadidentity(); gllightfv(gl LIGHT0, GL POSITION, light0 pos);... glmultmatrixf(cam.mat); gltranslatef(-cam.pos[x], -cam.pos[y], -cam.pos[z]); gllightfv(gl LIGHT1, GL POSITION, 4. 다음은 카메라의 설정에 관한 문제이다. 그 림 3(b)에는 운전석의 바로 앞에서 자동차 안을 바라보도록 카메라를 배치한 모습을 보여주고 있다 (영화에서 앞 좌석의 두 주인공을 정면으 로 들여다보는 상황을 상상할 것). 이를 위하여 자동차 몸체의 모델링 좌표계의 좌표축과 일치 되어 있던 카메라 프레임을 y축 둘레로 -90.0도 회전시킨 후, x축 방향으로 -6.0만큼, 그리고 y축 방향으로 1.2만큼 이동시켜 카메라를 배치하였 다. 또한 그림 3(a)는 자동차 몸체 (그리고 카메 라 또한)를 y축 둘레로 153.0도 회전시킨 후, x축 방향으로 8.20만큼, y축 방향으로 4.89만큼, 그리 고 z축 방향으로 1.95만큼 이동시켜 자동차와 카 메라를 세상 좌표계에 배치한 모습을 도시하고 있다 (본 과목의 관례대로 좌표축의 빨강, 초록, 파랑 세 가지 색깔은 각각 x, y, z축을 나타냄). (a) 다음 함수는 그림 3(c)를 그려주는 디스 플레이 컬백 함수이다. 정상적인 렌더링 상황에서 (A) 부분에 들어갈 내용을 OpenGL API 함수 호출을 통하여 기술하 라 (이에 필요한 OpenGL 함수의 정확한 문법은 본 시험지에서 파악할 수 있으므로, C 언어 문법에 맞게 정확하게 기술할 것). void display(void) { glmatrixmode(gl MODELVIEW); glloadidentity(); (B) draw fences(); draw ground(); draw axes(); glpushmatrix(); (A) draw car(); // Draw car in MC. glpopmatrix(); - 2014년 6월 16일(월) 오후 7:00 (AS 414) c 2014 서강대학교 공과대학 컴퓨터공학과 임인성
서강대학교 공과대학 컴퓨터공학과 CSE4170 기초 컴퓨터 그래픽스 중간고사 (4/6) (g) 문맥 상 uniform 타입의 변수 u PointLightPos의 값은 WC, NDC, CC, WdC, MC, 그리고 EC 중 어떤 좌표계를 기준으로 주어질까? (h) 프래그먼트 쉐이더에서 조명 계산 시 간접 조명을 근사적이나마 표현해주려 하는 문 장을 정확히 기술하라. (i) Line (b)와 (c) 문장에서 잘못된 것이 있 으면 모두 올바르게 고쳐라 (문장 전체를 기 술하고, 오류가 없다면 없다고 답할 것). (a) 주인공 클로즈업을 위한 카메라 (j) (오류가 있을 경우 수정하였다는 가정하에) Line (d) 문장을 reflect() 함수를 사용 치 않고 적절한 변수를 사용하여 작성하라. (k) 프래그먼트 쉐이더의 if (NdotL > c zero) 문장의 조건이 거짓이 되는 경우는 어떤 상황을 의미하는지 기술하라. (b) 카메라의 배치 (c) 설정 카메라로부터의 뷰 Figure 3: 카메라의 설정 (b) (B) 부분에 대하여 위 문제를 풀어라. 5. 그림 4에는 OpenGL ES 2.0 Shading Language를 사용하여 퐁 쉐이딩 방법을 구현한 버텍스 쉐이 더와 프래그먼트 쉐이더의 예가 주어져 있는데, 이 예제 프로그램에서는 쉐이딩 계산에 필요한 기하 정보들을 EC로 변환하여 퐁의 조명 모델 공식을 적용하고 있다. (a) 꼭지점에 적용된 모델링 변환, 뷰잉 변환, 그리고 투영 변환의 행렬을 각각 MM, MV, 그리고 MP 라 하자. 문맥 상 버텍스 쉐 이더에서 사용하는 uniform 타입의 변수 u Matrix0에는 어떤 행렬 값이 지정되어 있을지를 위 세 행렬을 사용하여 수학적으 로 정확히 표현하라. (b) u Matrix1에 대하여 위 문제를 풀어라. (c) u Matrix2에 대하여 위 문제를 풀어라. (d) 그림 5에서 버텍스 쉐이더의 varying 타입 의 변수들에 저장된 정보가 프래그먼트 쉐 이더의 varying 타입의 변수들에 전달되는 지점은? (e) Line (a) 문장에서 v N 벡터의 길이를 1로 만들어 사용하고 있는데, 이러한 연산을 해 야하는 근본적인 이유는 무엇일까? (f) 만약 Line (a) 문장을 제거하면 렌더링 결 과 영상이 크게 바뀔까? 예/아니오 로 답 하고 그 이유를 설명하라. (l) (오류가 있을 경우 수정하였다는 가정하에) 지금 정반사 방향 대신 해프웨이 벡터를 사 용하여 쉐이딩을 하려한다. 이를 위해 이 프 래그먼트 쉐이더의 어느 부분을 고쳐야 할 지를 명시하고, OpenGL ES 2.0 Shadning Language 문법에 맞게 수정하라 (반드시 해 프웨이 벡터의 이름을 H로 할것). 6. OpenGL ES 렌더링 파이프라인에서 삼각형으 로 구성된 기하 모델에 대한 퐁 쉐이딩 기법을 구현하는데 있어 다음 각 단계에서 수행되는(또 는 수행되어야 하는) 중요한 계산을 기술하라. (a) 버텍스 쉐이딩 단계에 프로그래머가 해주 어야 할 계산 두 가지 (b) 프래그먼트 쉐이딩 단계에서 프로그래머가 해주어야 할 계산 (c) 래스터화 단계에서 수행되는 계산 두 가지 7. OpenGL ES 렌더링 파이프라인에서 다음 두 단 계에서 보편적으로 수행되는 전형적인 3D 실시 간 렌더링 계산에 대하여 정확히 기술하라. (a) 래스터화 이전 부분 i. 쉐이더 동작 부분에서 반드시 수행되 어야 하는 계산 ii. 그 이후의 주요 계산 모두 (b) 래스터화 이후 부분 i. 쉐이더 동작 부분에서 반드시 수행되 어야 하는 계산 ii. 그 이후의 주요 계산 한 가지 - 2014년 6월 16일(월) 오후 7:00 (AS 414) c 2014 서강대학교 공과대학 컴퓨터공학과 임인성
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스중간고사 (5/6) uniform mat4 u Matrix0; uniform mat4 u Matrix1; uniform mat4 u Matrix2; attribute vec4 a Vertex; attribute vec3 a Normal; attribute vec2 a TexCoord; varying vec4 v P; varying vec3 v N; varying vec2 v TexCoord; void main(void) { v P = u Matrix0 * a Vertex; v N = normalize(mat3(u Matrix1) * a Normal); v TexCoord = a TexCoord; gl Position = u Matrix2 * a Vertex; (a) 버텍스쉐이더 precision mediump float; uniform vec4 u PointLightPos; uniform vec4 u PointLightCol; uniform vec4 u AmbientLightCol; uniform vec4 u AmbientMat, u DiffuseMat, u SpecularMat; uniform float u SpecularPow; // Must be positive uniform bool u istextureon; uniform sampler2d u Texture; varying vec4 v P; varying vec3 v N; varying vec2 v TexCoord; const float c zero = 0.0; void main(void) { vec3 N = normalize(v N); // Line (a) vec3 L = normalize(u PointLightPos.xyz); // Line (b) vec3 V = normalize(-v P.xyz); // Line (c) vec3 R = reflect(-l, N); // Line (d) float NdotL = max(dot(n, L), c zero); vec4 tmpcol = vec4(c zero, c zero, c zero, c zero); if (NdotL > c zero) { tmpcol = u DiffuseMat * NdotL; tmpcol += u SpecularMat * pow(max(dot(r, V), c zero), u SpecularPow); tmpcol *= u PointLightCol; tmpcol += u AmbientLightCol*u AmbientMat; if (u istextureon) { vec4 TextureCol = texture2d(u Texture, v TexCoord.xy); gl FragColor = TextureCol*tmpCol; else gl FragColor = tmpcol; (b) 프래그먼트쉐이더 Figure 4: OpenGL ES 쉐이더를통한다면체모델의쉐이딩 - 2014 년 6 월 16 일 ( 월 ) 오후 7:00 (AS 414) - c 2014 서강대학교공과대학컴퓨터공학과임인성
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스중간고사 (6/6) ( A ) ( B ) ( C ) ( D ) ( E ) ( F F ) ( G G ) ( E E ) ( F ) ( G ) ( H ) ( I ) ( J ) ( K ) Figure 5: OpenGL fixed-function 렌더링파이프라인의일부 - 2014 년 6 월 16 일 ( 월 ) 오후 7:00 (AS 414) - c 2014 서강대학교공과대학컴퓨터공학과임인성
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (1/8) [CSE4170: 기초컴퓨터그래픽스 ] 기말고사 ( 담당교수 : 임인성 ) 답은반드시답안지에기술할것. 공간이부족할경우반드시답안지몇쪽의뒤에있다고명기한후기술할것. 그외의경우의답안지뒤쪽이나연습지에기술한내용은답안으로인정안함. OpenGL 시스템의각좌표계에대한약어는다음과같으며, 답을기술할때필요할경우적절히약어를사용하라. WdC: Window Coordinates EC: Eye Coordinates NDC: Normalized Device Coordinates OC: Object Coordinates MC: Modeling Coordinates CC: Clip Coordinates WC: World Coordinates 1. 지금아래처럼카메라변수 cam 을정의한후, typedef struct cam { float pos[3], uaxis[3], vaxis[3], naxis[3]; GLfloat mat[16]; GLdouble fovy, aspect, near c, far c; Cam; Cam cam; 디스플레이컬백함수에서다음과같이물체를그리려한다 ( 여기서 sfactor 는 float 타입의전역변수임 ). void display (void) { glclear(gl COLOR BUFFER BIT); glmatrixmode(gl MODELVIEW); glloadidentity(); // Line (a) glmultmatrixf(cam.mat); gltranslatef(-cam.pos[0], -cam.pos[1], -cam.pos[2]); // Line (b) glpushmatrix(); glscalef(sfactor, sfactor, sfactor); // Line (c) draw teapot(); glpopmatrix(); glpushmatrix(); glrotatef(angle, 0.0, 1.0, 0.0); gltranslatef(0.0, 0.0, 5.0); glscalef(6.5, 6.5, 6.5); // Line (d) draw cow( );. glpopmatrix(); glflush(); (a) 보편적인관점에서 Line (a) 와 Line (b) 지점은각각눈좌표계 (Eye Coordinate), 모델링좌표계, 세상좌표계중어느좌표계에서의의미를가질까? (b) 다음과같은함수를사용하여세상좌표계의좌표축을그려주려한다. void draw axes(void) { gllinewidth(2.0); glbegin(gl LINES); glcolor3f(1.0, 0.0, 0.0); // x 축 glvertex3f(0.0, 0.0, 0.0); - 2013 년 6 월 21 일 ( 금 ) 오전 11:50 (AS 414) - c 2013 서강대학교공과대학컴퓨터공학과임인성
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (2/8) 다음과같이설정되어있는데, cam.pos[0] = 0.0, cam.pos[1] = 0.0, cam.pos[2] = 500.0; 이때의 cam.naxis[] 벡터의세원소값을기술하라. Figure 1: 광원의기하성질설정 glvertex3f(150.0, 0.0, 0.0);. glend(); gllinewidth(1.0); 이함수를 Line (a), Line (b), Line (c) 중어느시점에서호출을해야할까? (c) 그림 1 에서가장큰원으로보이는광원효과는카메라에고정된스폿광원을사용하여생성한것이다. 이광원에대한기하성질들은 Line (a), Line (b), Line (d) 중어느시점에서설정하는것이가장자연스러운가? (d) 그림 1 에서가장작은 ( 빨간색 ) 원으로보이는광원효과는큰소의눈에고정된스폿광원을사용하여생성한것이다. 이광원에대한기하성질들은 Line (a), Line (b), Line (d) 중어느시점에서설정하는것이가장자연스러운가? (e) 그림 1 에서벽면아래쪽에반원처럼보이는광원효과는세상좌표계의가로등에고정된스폿광원을사용하여생성한것이다. 이광원에대한기하성질들은 Line (a), Line (b), Line (d) 중어느시점에서설정하는것이가장자연스러운가? (f) 문맥상 set rotate mat(cam.mat); 문장은 cam.mat[] 배열에어떤값들을어떻게넣어주는역할을할지정확히기술하라. (g) 그림 2 는이프로그램의초기렌더링결과를보여주고있다. ( 여기서세상좌표계의 x 축과 y 축이각각오른쪽과위쪽방향으로그려져있고, z 축은화면앞으로튀어나오고있음 ) 초기에카메라의위치는 Figure 2: 물주전자그리기 (h) 다음은스페셜컬백함수의일부이다.. case GLUT KEY DOWN: { float c, s, tx, ty; c = cos(3.141592*45.0/180.0); s = sin(3.141592*45.0/180.0); tx = c*cam.naxis[2] - s*cam.naxis[0]; ty = s*cam.naxis[2] + c*cam.naxis[0]; cam.naxis[2] = tx, cam.naxis[0] = ty; tx = c*cam.uaxis[2] - s*cam.uaxis[0]; ty = s*cam.uaxis[2] + c*cam.uaxis[0]; cam.uaxis[2] = tx, cam.uaxis[0] = ty; cam.pos[0] = 500.0*cam.naxis[0]; cam.pos[1] = 500.0*cam.naxis[1]; cam.pos[2] = 500.0*cam.naxis[2]; set rotate mat(cam.mat); glutpostredisplay(); break;. 아래화살표키를누를때마다화면에서물주전자가어떤식으로움직일지를적절한수치를사용하여정확히기술하라. - 2013 년 6 월 21 일 ( 금 ) 오전 11:50 (AS 414) - c 2013 서강대학교공과대학컴퓨터공학과임인성
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (3/8) Polygonal model OpenGL ES Rendering Pipeline (1)??? (2) P A (3) V V C (4) P D (5) V T (6) P C Fixed-function pipeline part Shader part Program Object Setup VS Object FS Object Attribute 0 Attribute 1 Attribute 2 Attribute 3 Attribute 7 Mapping Shader setup (1) Vertex Shader attribute vec3 vpos; attribute vec3 vnorm; attribute vec2 vtc0; attribute vec2 vtc1; Mapping & setup uniform mat4 uprojection; uniform mat4 umodelview; uniform float uscalefactor; uniform vec3 ulightposition; (8) Fragment Shader Uniforms Textures Setup (7) Rasterization Frame buffer (9) ROP (8)??? Figure 3: OpenGL ES 2.0 렌더링파이프라인 2. 그림 3 에도시한 OpenGL ES 2.0 렌더링파이프라인을보면서아래질문에답하라. (a) 은면제거를위한깊이버퍼링 (depth buffering) 계산과가장관련이깊은단계의번호는? (b) OC, MC, WC, EC, CC, NDC, WdC 등의 OpenGL 좌표계중 (2) 번시점은어떤좌표계에해당할까? (c) 삼선형보간 (trilinear interpolation) 과가장관련이깊은단계의번호는? (d) 꼭지점의나열방향을통하여뒤면 (backface) 이보이는삼각형을제거할수있는데, 실제로이러한계산이일어나는단계의번호는? (e) 3 차원필름의내용이인화지에인화가되는과정과가장관련이많은단계의번호는? (f) 정상적인렌더링과정에서모델링변환과뷰잉변환이일어나는단계의번호는? (g) 이렌더링파이프라인에서 NDC 는몇번단계와몇번단계사이에존재하는가? (h) 다면체모델에대한쉐이딩방법중의하나인퐁쉐이딩방법을구현하려할때, 가장자연스럽게퐁의조명모델공식이적용될수있는단계의번호는? (i) 정상적인렌더링과정에서투영변환이일어나는단계의번호는? (j) OpenGL ES 2.0 시스템의 gl Position 변수과가장관련이많은단계의번호는? (k) 삼각형의꼭지점에설정된여러속성들이픽셀들에대한속성으로바뀌는단계의번호는? (l) 원근투영을사용할경우실제로원근감이생성되는과정과가장관련이깊은단계의번호는? - 2013 년 6 월 21 일 ( 금 ) 오전 11:50 (AS 414) - c 2013 서강대학교공과대학컴퓨터공학과임인성
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (4/8) 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 (a) 기본조명공식 att i = { 1 k 0i + k 1i VP pli + k 2i VP pli, 2 P pli s w 0, 1.0, otherwise (b) 빛의감쇠효과의계산 ( P pli V ŝ dli ) s rli, c rli 180.0 & P pli V ŝ dli cos c rli, spot i = 0.0, c rli 180.0 & P pli V ŝ dli < cos c rli, 1.0, c rli = 180.0 (c) 스폿광원효과의계산 Figure 4: OpenGL 시스템의조명공식 3. 그림 4 에는 OpenGL 시스템에서사용하는기본조명공식이주어져있다. (a) 이공식에서 은주어진두벡터에대하여어떠한값을계산해주는연산자인지정확히기술하라. (b) 만약무한관찰자 (infinite viewer) 기능을사용할경우이공식의 ĥi 변수가어떻게정의가될지이공식의변수나상수식등을사용하여정확히기술하라 ( ˆ 기호의의미를잘생각해볼것 ). (c) 만약무한관찰자기능을사용할경우추가적으로어떤조건하에서이조명공식에기반을둔쉐이딩계산을어떻게최적화할수있을까? (d) 그림 4(a) 의식에서무한관찰자기능을사용하지않을경우카메라의위치가바뀌었을때직접적으로영향을받는변수 ( 또는식 ) 를모두나열하라. (e) 그림 4(a) 의식에서점광원을사용할경우광원의위치가바뀌었을때직접적으로영향을받을수있는변수 ( 또는식 ) 들을모두나열하라. (f) 그림 4(a) 의식에서렌더링하고자하는물체의위치와방향이모두바뀌었을때직접적으로영향을받을수있는변수 ( 또는식 ) 들을모두나열하라. (g) 위그림은하이라이트효과의조절모습을도시하고있는데, 그림 4(a) 의식에서어떤변수를통하여조절할수있을까? (h) 그림 4(a) 의식에서램버트의코사인법칙 (Lambert s cosine law) 을표현해주는부분을정확히기술하라. (i) 기본적으로퐁의조명모델은광원으로부터직접입사하여물체표면에서반사되는빛의색깔을어떻게계산할지를기술하고있다. 이경우다른물체에반사된후간접적으로들어오는빛을무시함으로써발생하는문제를조금이라도줄이기위하여간접반사를고려하고있다. 그림 4(a) 의식에서간접적으로들어오는빛과직접적인연관성이있는변수 ( 또는식 ) 들을모두기술하라. (j) 그림 4(a) 의식에서 OpenGL API 함수인 gllightf[v](*, *, *) 함수로설정할수있는변수 ( 또는식 ) 들을모두기술하라. - 2013 년 6 월 21 일 ( 금 ) 오전 11:50 (AS 414) - c 2013 서강대학교공과대학컴퓨터공학과임인성
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (5/8) (k) 그림 4(b) 의식에서 VP pli 는어떤기하정보에해당하는지정확히기술하라. (l) 그림 4(b) 의식에서조건식 P pli s w 0 이만족되는상황은어떤경우인지정확히기술하라. (m) 그림 4(c) 의식에서두벡터 P pli V 와 ŝ dli 가의미하는방향을정확히기술하라. (n) 그림 4(c) 의식에서조건식 P pli V ŝ dli cos c rli 이만족되는상황은어떤경우인지정확히기술하라. (o) 다면체모델의쉐이딩기법인고우러드쉐이딩방법을적용한다고할때, 보편적으로이조명공식은그림 3 의어느부분에서적용이될지, 가장관련이깊은단계의번호를기술하라. 4. 그림 5 는 Pixar 의 RenderMan Shanding Language 로작성한쉐이더와이를통한렌더링결과를도시하고있다. (a) 문맥상이쉐이더프로그램에서물체의뼈대의굵기를조절해주는변수는어떤것일까? (b) 문맥상이쉐이더프로그램에서가로 - 세로방향의뼈대의개수를조절해주는변수는어떤것일까? (c) OpenGL ES 2.0 Shading Language 에서제공하는 built-in name 들중 (Ci, Oi) 와가장밀접한연관이있는변수의이름은무엇일까? 5. 본시험문제지의마지막두쪽에는 OpenGL ES 2.0 Shading Language 를사용하여퐁쉐이딩방법을구현한버텍스쉐이더와프래그먼트쉐이더의예가주어져있는데, 여기서는쉐이딩계산에필요한기하정보들을 EC 로변환하여퐁의조명모델공식을적용하고있다. (a) 이버텍스쉐이더의계산결과로산출되는결과정보를저장해주는변수들을모두기술하라. (b) 이두쉐이더의변수들중일반적인렌더링과정에서항상반드시계산을해주어야하는변수가있다. 그변수이름을기술하고 ( 한개이상이면모두 ), 정상적인상황에서그변수는어떤정보를표현해주어야할까? (c) 문맥상실제로퐁의조명모델공식이적용되는물체지점의좌표를저장하고있는프래그먼트쉐이더의변수이름을기술하라. (d) 6 번문장의 uniform 변수 mvp matrix 의기하변환행렬은 OpenGL 용어를사용할경우어느좌표계에서어느좌표계로의변환에해당하는행렬을저장하고있어야할까? (e) 만약 7 번문장의 uniform 변수 modelview matrix 의기하변환행렬이항상강체변환에해당한다면 8 번문장의 uniform 변수를제거할수있다. 이때버텍스쉐이더의몇번문장의어느부분을어떻게수정을해야할까? (f) 10 번문장의 varying 변수 v position 의저장하고있는정보가 32 번문장의 varying 변수 v position 으로전달이되어야한다. OpenGL 렌더링파이프라인에서어떤 중요한 계산과정의수행시어떠한방식으로전달이되는지설명하라. (g) 프래그먼트쉐이더의 71 번문장의조건문에서이조건이성립한다는것은무엇을뜻할까? (h) 이쉐이더프로그램에서문맥상그림 4(a) 의조명공식의 a cs 변수에해당하는쉐이더변수이름을기술하라. (i) 문맥상그림 4(a) 의조명공식에서 100 번문장수행시 att factor 변수가저장하고있는값과가장밀접한관련이있는변수 ( 또는식 ) 를정확히기술하라. (j) 만약평행광원을사용할경우 att factor 변수는이프로그램에서어떤값을갖게될까? (k) 문맥상그림 4(a) 의조명공식에서 103 번문장의 max(c zero, dot(n eye, L)) 값에해당하는변수 ( 또는식 ) 를정확히기술하라. (l) EC 에서카메라의기준점인눈에해당하는점의좌표는? (m) 106번문장에서사용되고있는 -normalize(v position).xyz 벡터는어떤방향을가리키고있는지정확히기술하라. - 2013 년 6 월 21 일 ( 금 ) 오전 11:50 (AS 414) - c 2013 서강대학교공과대학컴퓨터공학과임인성
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (6/8) surface screen(float Ka = 1, Kd = 0.75, Ks = 0.4, AAA = 0.1; color BBB = 1; float CCC = 0.25, DDD = 20;) { point Nf; if (mod(s*ddd, 1) < CCC mod(t*ddd, 1) < CCC) { Oi = 1; Nf = faceforward(normalize(n),i); Ci = Os*(Cs*(Ka*ambient() + Kd*diffuse(Nf)) + BBB*Ks*specular(Nf,-normalize(I), AAA)); else { Oi = 0; Ci = 0; (a) Screen 쉐이더 Figure 5: RenderMan 쉐이더예 (b) 렌더링결과 (n) 문맥상 84 번문장의 "here" 부분에들어갈내용을위의쉐이딩언어문법에맞게정확히기술하라. (o) 문맥상 74 번부터 78 번문장까지는그림 4(b) 의식을구현하고있다. 문맥상 75 번문장의 "there" 부분에들어갈내용을위의쉐이딩언어문법에맞게정확히기술하라. (p) ( 제거해도큰문제는없지만 ) 120 번문장에서 normalize(v normal) 함수호출을통하여 v normal 벡터의길이를 1 로만들어주는이유는? (q) 문맥상그림 4(a) 의조명공식에서 120 번문장이수행된후의 N eye 변수값에해당하는변수 ( 또는식 ) 를정확히기술하라. < 한학기동안수고많았습니다!> - 2013 년 6 월 21 일 ( 금 ) 오전 11:50 (AS 414) - c 2013 서강대학교공과대학컴퓨터공학과임인성
1 // Begin of Vertex Shader 2 attribute vec4 a_position; 3 attribute vec3 a_normal; 4 attribute vec2 a_texture; 5 6 uniform mat4 mvp_matrix; 7 uniform mat4 modelview_matrix; 8 uniform mat4 invtrans_modelview_matrix; 9 10 varying vec4 v_position; 11 varying vec2 v_texture; 12 varying vec3 v_normal; 13 14 const float c_zero = 0.0; 15 const float c_one = 1.0; 16 17 void main() { 18 v_position = modelview_matrix * a_position; 19 v_normal = normalize(invtrans_modelview_matrix 20 * vec4(a_normal, c_zero)).xyz; 21 v_texture = a_texture; 22 23 gl_position = mvp_matrix * a_position; 24 25 // End of Vertex Shader 26 27 /////////////////////////////////////////////////////////////// 28 29 // Begin of Fragment Shader 30 precision mediump float; 31 32 varying vec4 v_position; 33 varying vec2 v_texture; 34 varying vec3 v_normal; 35 36 uniform vec4 material_ambient; 37 uniform vec4 material_diffuse; 38 uniform vec4 material_specular; 39 uniform float material_specular_exponent; 40 uniform vec4 light_position; 41 uniform vec4 light_ambient; 42 uniform vec4 light_diffuse; 43 uniform vec4 light_specular; 44 uniform vec3 spot_direction; 45 uniform float spot_exponent; 46 uniform float spot_cutoff_angle; 47 uniform vec4 global_ambient; 48 uniform vec3 distance_attenuation_factors; 49 uniform int distance_attenuation_flag; 50 uniform sampler2d u_texture; 51 uniform int tex_flag; 52 53 const float c_zero = 0.0; 54 const float c_one = 1.0; 55 56 vec3 N_eye; 57 58 vec4 lighting_equation() { 59 vec4 computed_color = vec4(c_zero, c_zero, c_zero, c_zero); 60 vec3 H; 61 float ndotl; 62 float ndoth; 63 float att_factor; 64 float spot_factor; 65 vec3 att_dist; 66 vec3 L; 67 68 att_factor = c_one; 69 computed_color += material_ambient * global_ambient; 70 71 if (light_position.w!= c_zero) {
72 L = light_position.xyz - v_position.xyz; 73 if (distance_attenuation_flag == 1) { 74 att_dist.x = c_one; 75 att_dist.z = "there"; 76 att_dist.y = sqrt(att_dist.z); 77 att_factor = c_one/dot(att_dist, 78 distance_attenuation_factors); 79 80 L = normalize(l); 81 82 if (spot_cutoff_angle < 180.0) { 83 vec3 spot_dir = normalize(spot_direction); 84 spot_factor = "here"; 85 if (spot_factor >= cos(radians(spot_cutoff_angle))) { 86 spot_factor = pow(spot_factor, spot_exponent); 87 88 else { 89 spot_factor = c_zero; 90 91 92 att_factor *= spot_factor; 93 // if (spot_cutoff_angle < 180.0) 94 // if (light_position.w!= c_zero) 95 else { 96 L = light_position.xyz; 97 L = normalize(l); 98 99 100 if (att_factor > c_zero) { 101 computed_color += light_ambient * material_ambient; 102 103 ndotl = max(c_zero, dot(n_eye, L)); 104 computed_color += (ndotl*light_diffuse*material_diffuse); 105 106 H = normalize(l - normalize(v_position).xyz); 107 ndoth = max(c_zero, dot(n_eye, H)); 108 if (ndoth > c_zero) { 109 computed_color += (pow(ndoth, material_specular_exponent) 110 * material_specular * light_specular); 111 112 computed_color *= att_factor; 113 114 return computed_color; 115 116 117 void main() { 118 vec4 color; 119 120 N_eye = normalize(v_normal); 121 122 color = lighting_equation(); 123 124 if (tex_flag == 1) { 125 vec4 decalcolor = texture2d(u_texture, v_texture.xy); 126 gl_fragcolor = color * decalcolor; 127 128 else 129 gl_fragcolor = color; 130 131 132 // End of Fragment Shader
서강대학교공과대학컴퓨터공학과 [CSE4170] 기초컴퓨터그래픽스기말고사 (1/8) [CSE4170] 기초컴퓨터그래픽스 기말고사 담당교수 : 임인성 답은반드시답안지에기술할것. 공간이부족할경우반드시답안지몇쪽의뒤에있다고명기한후기술할것. 그외의경우의답안지뒤쪽이나연습지에기술한내용은답안으로인정안함. OpenGL 시스템의각좌표계에대한약어는다음과같으며, 답을기술할때필요할경우적절히약어를사용하라. WdC: Window Coordinates EC: Eye Coordinates NDC: Normalized Device Coordinates OC: Object Coordinates MC: Modeling Coordinates CC: Clip Coordinates WC: World Coordinates 아래의그림 1 은본시험전반에걸쳐언급될수있으니해당문제에대하여적절히답하라. (1) vertex stream (2) Vertex Shader (3) vertex stream (4) Primitive Assembly (5) primitive stream (6) Geometry Shader (7) primitive stream (8) Clipping & Setup (9) Rasterization (10) pixel stream (11) Pixel Shader (12) pixel stream (13) Raster Operation (14) Framebuffer Figure 1: 실시간렌더링파이프라인예 1. 그림 1 에주어진실시간렌더링파이프라인의계산과정에대한질문에답하라. (a) (3) 번지점은 OpenGL 좌표계중어떤좌표계에해당할까? (b) 보편적인상황에서모델링변환과뷰잉변환이일어나는단계의번호는? (c) 전통적인 OpenGL 파이프라인에서은면제거, 즉안보이는면이제거되는계산과가장관련이깊은단계의번호는? (d) 꼭지점의좌표에투영변환행렬이곱해지는단계의번호는? (e) 꼭지점의나열순서에따라다각형을제거할수도있는단계의번호는? (f) 버텍스쉐이더의속성데이터가대응되는프래그먼트쉐이더의속성데이터로변환되는단계의번호는? (g) 투영변환행렬이암시하는뷰볼륨의밖에존재하는기하프리미티브들이제거가되는단계의번호는? (h) 다면체모델에대한쉐이딩방법중의하나인퐁쉐이딩방법을구현하려할때, 실제로퐁의조명모델공식의계산이가장자연스럽게수행될수있는단계의번호는? (i) 원근나눗셈과가장관련이깊는단계의번호는? 2. 다음쪽윗부분의그림 2(a) 에는 OpenGL 시스템에서사용하는기본조명공식이주어져있다. (a) 이공식에서 은주어진두벡터에대하여어떠한값을계산해주는연산자인지정확히기술하라. (b) 이공식에서 Lambert 의코사인법칙을표현해주는부분을정확히기술하라. (c) 만약무한관찰자 (infinite viewer) 기능을사용할경우이공식의 ĥi 변수가어떻게정의될지이공식의변수나상수식등을사용하여정확히기술하라 (ˆ 기호의의미를상기할것 ). (d) 만약무한관찰자기능을사용할경우추가적으로어떤조건하에서이조명공식에기반을둔쉐이딩계산을어떻게최적화할수있을까? (e) 무한관찰자기능을사용하지않을경우카메라의위치가바뀌었을때이공식에서직접적으로영향을받는변수 ( 또는식 ) 를모두나열하라. - 2012 년 6 월 22 일 ( 금 ) 오전 11:00 -
서강대학교공과대학컴퓨터공학과 [CSE4170] 기초컴퓨터그래픽스기말고사 (2/8) 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 (a) OpenGL 시스템의조명공식 att i = { 1 k 0i + k 1i VP pli + k 2i VP pli, 2 P pli s w 0, 1.0, otherwise (b) 빛의감쇠효과의계산 ( P pli V ŝ dli ) s rli, c rli 180.0 & P pli V ŝ dli cos c rli, spot i = 0.0, c rli 180.0 & P pli V ŝ dli < cos c rli, 1.0, c rli = 180.0 (c) 스폿광원효과의계산 Figure 2: 2 번문제공식 (f) 점광원을사용할경우광원의위치가바뀌었을때이공식에서직접적으로영향을받을수있는변수 ( 또는식 ) 들을모두나열하라. (g) 렌더링하고자하는물체의위치와방향이모두바뀌었을때이공식에서직접적으로영향을받을수있는변수 ( 또는식 ) 들을모두나열하라. (h) 아래의그림은하이라이트효과의조절모습을도시하고있는데, 이공식의어떤변수를통하여조절할수있을까? (i) 기본적으로퐁의조명모델은광원으로부터직접입사하여물체표면에서반사되는빛의색깔을어떻게계산할지를기술하고있다. 이경우다른물체에반사된후간접적으로들어오는빛을무시함으로써발생하는문제를조금이라도줄이기위하여간접반사를고려하고있다. 이공식에서간접적으로들어오는빛과직접적인연관성이있는변수 ( 또는식 ) 들을모두기술하라. (j) 이공식에서 OpenGL API 함수인 glmaterial{if[v](*, *, *) 함수로설정할수있는변수 ( 또는식 ) 를모두기술하라. (k) 그림 2(b) 의식에서 VP pli 는어떤기하정보에해당하는지정확히기술하라. (l) 그림 2(b) 의식에서조건식 P pli s w 0 이만족되는상황은어떤경우인지정확히기술하라. (m) 그림 2(c) 의식에서두벡터 P pli V 와 ŝ dli 가의미하는방향을정확히기술하라. (n) 그림 2(c) 의식에서조건식 P pli V ŝ dli cos c rli 이만족되는상황은어떤경우인지정확히기술하라. (o) 다면체모델의쉐이딩기법인 Gouraud 쉐이딩방법을적용한다고할때, 보편적으로이조명공식은그림 1 의어느부분에서적용이될지, 가장관련이깊은단계의번호를기술하라. (p) 다면체모델의쉐이딩기법인 Phong 쉐이딩방법을적용한다고할때, 보편적으로이조명공식은그림 1 의어느부분에서적용이될지, 가장관련이깊은단계의번호를기술하라. 3. 다음은색깔혼합에관한문제이다. 두장의이미지 S 와 D 의합성에대하여생각하자. (c S α S ) 와 (c D α D ) 를두이미지의대응되는화소의미리곱한색깔 (pre-multiplied color) 이라할때, - 2012 년 6 월 22 일 ( 금 ) 오전 11:00 -
서강대학교공과대학컴퓨터공학과 [CSE4170] 기초컴퓨터그래픽스기말고사 (3/8) Figure 3: 색깔합성예 1 (f) 위문제에서모든합성이끝난후결과적으로눈에보이는색깔 C 012 는무엇일지위문제의인자를사용하여정확히기술하라. (g) 아래의프로그램에서함수 test0() 을수행시킬경우그림 5(a) 와같이서로다른색깔로칠해지는여러영역을볼수있는데, 이때 (1) 번영역과 (2) 번영역의 RGB 색깔을정확히기술하라. ( 주의 : RGB 각채널값은 0 과 1 사이의값을가짐 ) α 0 C 0 α 1 C 1 Figure 4: 색깔합성예 2 α 2 =1.0 2 C 두색깔의합성을통하여생성한결과색깔 (c O α O ) 는다음과같이표현할수있다. ( ) ( ) ( ) co cs cd = F α S + F O α D S α D (a) 만약값이 (0.5, 0.5, 0.5, 0.5) 인미리곱한색깔로어떤화소를칠한다고할때, 이는그화소를어떻게칠하는것인지정확히기술하라. (b) 그림 3 에도시한합성연산의경우 F S 와 F D 의값은각각얼마인가? (c) 만약 S over D 연산을적용한다면, 합성후 α O 는어떤값을가질지를 S 와 D 의관련값을사용하여정확히기술하라. (d) 그림 4 와같은상황을생각해보자. 지금관찰자가세개의물체 M 0, M 1, M 2 를바라보고있는데, M 0 는실제색깔이 C 0 인유리로서뒤에서들어오는빛을 1 α 0 의비율로통과시킨다. 한편 M 1 은색깔이 C 1 이고빛을 1 α 1 의비율만큼만통과시키고, 제일오른쪽에있는 M 2 는불투명한벽으로서 C 2 의색깔을가진다. 이때 M 0 와 M 1 을앞에서뒤로가면서 (front-toback order) 합성한다고할때의불투명도 α 01 값이무엇일지정확히기술하라. (e) 바로위문제에서와같이 M 0 와 M 1 을앞에서뒤로가면서합성한다고할때의결과색깔 C 01 값이무엇일지, 위문제의인자를사용하여정확히기술하라. 여기서 C 0, C 1, 그리고 C 01 은미리곱한색깔이아닌원래의 RGB 색깔을의미함. void rect(glfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat R, GLfloat G, GLfloat B, GLfloat A) { glcolor4f(r, G, B, A); glbegin(gl QUADS); glvertex2f(l, b); glvertex2f(r, b); glvertex2f(r, t); glvertex2f(l, t); glend(); void test0(void) { glclearcolor(0.0, 0.0, 0.0, 0.0); glclear(gl COLOR BUFFER BIT); glenable(gl BLEND); glblendfunc(gl ONE, GL ZERO); rect(-2.0, 4.0, -2.0, 4.0, 0.0, 1.0, 0.0, 1.0); glblendfunc(gl SRC ALPHA, GL DST ALPHA); rect(-3.5, 3.0, -3.5, 3.0, 1.0, 0.0, 0.0, 1.0); rect(0.0, 4.8, -4.8, 2.0, 0.0, 0.0, 1.0, 1.0); gldisable(gl BLEND); void test1(void) { glclearcolor(0.0, 0.0, 0.0, 0.0); glclear(gl COLOR BUFFER BIT); glenable(gl BLEND); glblendfunc(gl ONE, GL ZERO); rect(-2.0, 4.0, -2.0, 4.0, 0.0, 1.0, 0.0, 1.0); glblendfunc((a), (B)); rect(-3.5, 3.0, -3.5, 3.0, 1.0, 0.0, 0.0, 1.0); gldisable(gl BLEND); (h) 다음함수 test1() 을수행시켰을때그림 5(b) 와같은결과를얻으려면, (A) 와 (B) 에어떤인자값이설정되어야할지, 다음값들중적절한인자를선택하라. ( 여 - 2012 년 6 월 22 일 ( 금 ) 오전 11:00 -
서강대학교공과대학컴퓨터공학과 [CSE4170] 기초컴퓨터그래픽스기말고사 (4/8) (1) (2) -3.5-2 0 3 4 4.8 x (1) (a) test0() 수행결과 (2) (1) (2) (3) -3.5-2 3 4 x (b) test1() 수행결과 Figure 5: 색깔의혼합 기서 (1), (2), (3) 번영역의색깔은각각 (0, 0, 0), (1, 0, 0), (0, 1, 0) 임 ) GL ZERO, GL ONE, GL SRC ALPHA, GL DST ALPHA, GL ONE MINUS SRC ALPHA, GL ONE MINUS DST ALPHA 4. 다음은 Binary Space Partitioning Tree (BSPT) 에관한문제이다. 다음쪽의그림 6 의코드를보면서아래질문에답하라. (a) 함수 display bspt front to back() 은시점의위치 viewer[3] 가주어졌을때, bspt의다각형들을앞에서뒤로가면서 (front-to-back) 하나씩나열하면서그려주는함수이다. 문맥상 (A) 에들어갈내용을 C 언어문법에맞게기술하라. (b) 문맥상 (B) 와 (C) 에들어갈내용을 C 언어문법에맞게기술하라. (c) 문맥상 (D) 와 (E) 에들어갈내용을 C 언어문법에맞게기술하라. (d) 다음 build bspt() 함수는 plist 가가리키는 npoly 개로구성된다각형리스트를받아들여 BSPT 를구성하여리턴해주는함수이다. 여기서 partition plist() 함수는 plist 에존재하는다각형들을 bspt->poly 에의해정의되는평면의앞쪽과뒤쪽에있는다각형들을분류하여그에해당하는두리스트 fplist 와 bplist 를구성해주는역할을한다. 이때문맥상 (H) 에들어갈내용을 C 언어문법에맞게기술하라. (e) 다음 los() 함수는 3 차원공간의점을나타내는 start 와 end 에의해정의되는선분이 bspt 가저장하고있는임의의다각형과교차하는지아닌지를결정해주는함수로서, 3 차원공간에서의네비게이션에유용하게활용할수있는함수이다. 이함수는문맥상언제 1 값을, 그리고언제 0 값을리턴하는지정확히기술하라. (f) 문맥상 los() 함수내의 SOGANG() 함수는특정다각형 bspt->poly 와두지점의위치 start 와 end 에대한정보가주어졌을때, 정확히어떤경우에 NULL 이아닌값을리턴해주는함수일지정확히기술하라. (g) 문맥상 los() 함수에서 (F) 와 (G) 에들어갈내용을 C 언어문법에맞게기술하라. (h) 문맥상 los() 함수에서내용적으로크게잘못된부분을지적하고옳게고쳐라. 5. 다음은 OpenGL ES 2.0 Shading Language 를사용한 Gouraud 쉐이딩방법의구현에관한문제이다. 본시험문제의마지막두쪽에는해당버텍스쉐이더의구현예가주어져있는데, 쉐이딩계산을위하여버텍스쉐이더에입력된꼭지점과법선벡터정보를 EC 로변환하여퐁의조명모델공식을적용하고있다. (a) 문맥상 EC 로변환된꼭지점의좌표를저장하고있는변수이름을기술하라. (b) 이버텍스쉐이더의계산결과로산출되는결과정보를저장해주는변수들을모두기술하라. - 2012 년 6 월 22 일 ( 금 ) 오전 11:00 -
서강대학교공과대학컴퓨터공학과 [CSE4170] 기초컴퓨터그래픽스기말고사 (5/8) typedef struct bspt { // data structure for bspt Polygon *poly; struct bspt *fchild; // for the front side struct bspt *bchild; // for the back side BSPT; BSPT *build bspt(int npoly, PLIST *plist) { int fnpoly, bnpoly; PLIST *fplist, *bplist; BSPT *bspt; if (npoly == 0) return NULL; bspt = (BSPT *) malloc(sizeof(bspt)); bspt->poly = pick poly(&npoly, &plist); totalpolygon++; fnpoly = bnpoly = 0; fplist = bplist = NULL; partition plist(bspt->poly, npoly, plist, &fnpoly, &fplist, &bnpoly, &bplist); (H) return bspt; void display bspt front to back(bspt *bspt, float *viewer) { int viewer side; if ( (A) ) return; viewer side = check side(viewer, bspt->poly); if (viewer side == BSPT FRONT) { display bspt front to back( (B), viewer); draw bspt poly(bspt->poly); display bspt front to back( (C), viewer); else { display bspt front to back( (D), viewer); draw bspt poly(bspt->poly); display bspt front to back( (E), viewer); int los(bspt *bspt, float *start, float *end) { int cs, ce, side0, side1; if (!bspt) return 1; cs = check side(start, bspt->poly); ce = check side(end, bspt->poly); if ((cs == BSPT FRONT) && (ce == BSPT FRONT)) { return los(bspt->fchild, start, end); else if ((cs == BSPT BACK) && (ce == BSPT BACK)) { return los(bspt->bchild, start, end); else { if (SOGANG(bspt->poly, start, end)) return 0; side0 = los( (F), start, end); side1 = los( (G), start, end); return side0 side1; Figure 6: BSPT 관련함수 - 2012 년 6 월 22 일 ( 금 ) 오전 11:00 -
서강대학교공과대학컴퓨터공학과 [CSE4170] 기초컴퓨터그래픽스기말고사 (6/8) (c) 다음은 Direct3D 의쉐이더인 HLSL Shader 에대한설명의일부이다. As a minimum, a vertex shader must output vertex position in homogeneous clip space. 이버텍스쉐이더코드에서이설명과가장밀접한연관이있는한문장의번호를기술하라. (d) 37) 번의조건문문장에서이조건이성립한다는것은무엇을뜻할까? (e) 문맥상그림 2(a) 의조명공식에서 57) 번문장의 max(c zero, dot(n, L)) 함수값에해당하는변수 ( 또는식 ) 을정확히기술하라. (f) EC 에서카메라의기준점인눈에해당하는점의좌표는? (g) 59) 번문장의 -normalize(p eye).xyz 변수는 EC 에서어느지점에서어느지점을향한벡터의길이를 1 로만들어준단위벡터를나타낸다. 과연어느지점에서어느지점일까? (h) 문맥상 59) 번문장의 X 변수값에저장되는내용을통칭무엇이라고부르는가? (i) 문맥상그림 2(a) 의조명공식에서 55) 번문장수행시 att factor 변수가저장하고있는값과가장밀접한관련이있는변수 ( 또는식 ) 을정확히기술하라. ii. 올바른변환을위하여 cam.mat 이저장해야할 4 행 4 열변환행렬의내용을정확히기술하라. (c) 그림 1 에서본카메라조작과정과가장관련이있는단계의번호를기술하라. 수고많았습니다 6. 다음은카메라의조작에관한문제이다. (a) 초기상태의카메라프레임이눈좌표계의좌표축과일치되어있는상태에서, 카메라프레임에대하여 M 1 M 2 M 3 순서로변환을하였다면, 그경우뷰잉변환행렬 M V 는무엇인지기술하라. (b) 초기상태 C 0 = (e, u, v, n) = ((0 0 0), (1 0 0), (0 1 0), (0 0 1)) 인카메라를사용자의조작을통하여 C 1 = ((0 10 10), (0 0 1), (0 1 0), ( 1 0 0)) 와같은상태로변환하는상황을아래와같은뷰잉변환코드로구현한다고가정하자. glmatrixmode(gl MODELVIEW); glloadidentity(); glmultmatrixf(cam.mat); gltranslatef( (A), (B), (C) ); i. 이때 (A), (B), (C) 에들어갈내용을기술하라. - 2012 년 6 월 22 일 ( 금 ) 오전 11:00 -
1) attribute vec4 a_position; 2) attribute vec3 a_normal; 3) attribute vec2 a_texture; vs_gs_simplelight_wc_prob.txt 4) uniform mat4 mvp_matrix; 5) uniform mat4 modelview_matrix; 6) uniform mat4 inv_modelview_matrix; 7) uniform float rescale_normal_factor; 8) uniform vec4 material_ambient; 9) uniform vec4 material_diffuse; 10) uniform vec4 material_specular; 11) uniform float material_specular_exponent; 12) uniform vec4 light_position; 13) uniform vec4 light_ambient; 14) uniform vec4 light_diffuse; 15) uniform vec4 light_specular; 16) uniform vec3 spot_direction; 17) uniform float spot_exponent; 18) uniform float spot_cutoff_angle; 19) uniform vec4 global_ambient; 20) varying vec4 v_color; 21) varying vec2 v_texture; 22) const float c_zero = 0.0; 23) const float c_one = 1.0; 24) vec4 p_eye; 25) vec3 N; 26) vec4 lighting_equation() { 27) vec4 computed_color = vec4( c_zero, c_zero, c_zero, c_zero ); 28) vec3 X; 29) float ndotl; 30) float ndotx; 31) float att_factor; 32) float spot_factor; 33) vec3 att_dist; 34) vec3 L; 35) att_factor = c_one; 36) computed_color += material_ambient * global_ambient; 37) if ( light_position.w!= c_zero ) { // spot light 38) L = light_position.xyz - p_eye.xyz; 39) L = normalize(l); 40) if( spot_cutoff_angle < 180.0 ) { 41) vec3 spot_dir = normalize(spot_direction); 42) spot_factor = dot( -L, spot_dir ); 43) if( spot_factor >= cos(radians( spot_cutoff_angle) ) ) { 44) spot_factor = pow(spot_factor, spot_exponent ); 45) 46) else { 47) spot_factor = c_zero; 48) 49) att_factor *= spot_factor; 49) 50) 51) else { 52) L = light_position.xyz; 53) L = normalize(l); 54) 55) if ( att_factor > c_zero ) { 56) computed_color += light_ambient * material_ambient; 57) ndotl = max(c_zero,dot(n, L )); 1 페이지
vs_gs_simplelight_wc_prob.txt 58) computed_color += ( ndotl * light_diffuse * material_diffuse ); 59) X = normalize( L - normalize(p_eye).xyz); 60) ndotx = dot( N, X ); 60) if ( ndotx > c_zero ) { 61) computed_color += (pow ( ndotx, material_specular_exponent) 62) * material_specular * light_specular ); 63) 64) computed_color *= att_factor; 65) 66) return computed_color; 67) 68) void main() { 69) p_eye = modelview_matrix * a_position; 70) N = normalize( inv_modelview_matrix * vec4( a_normal, c_zero) ).xyz; 71) v_color = lighting_equation(); 72) v_texture = a_texture; 73) gl_position = mvp_matrix * a_position; 74) 2 페이지
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (1/6) 기초컴퓨터그래픽스기말고사 (CSE4170) 담당교수 : 임인성 답은반드시답안지에기술할것. 공간이부족할경우반드시답안지몇쪽의뒤에있다고명기한후기술할것. 그외의경우의답안지뒤쪽이나연습지에기술한내용은답안으로인정안함. 1. 다음은 BSP TREE FREQUENTLY ASKED QUESTIONS (FAQ) 에기술되어있는 Binary Space Partitioning Tree (BSPT) 에관한프로그램의일부이다 ( 수업시간에다룬내용과약간다를수있음 ). struct BSP tree { plane partition; list polygons; BSP tree *front, *back; ; void Build BSP Tree(BSP tree *tree, list polygons) { polygon *root = polygons.get From List(); tree->partition = root->get Plane(); tree->polygons.add To List(root); list front list, back list; polygon *poly; while ((poly = polygons.get From List())!= 0) { int result = tree->partition.aaa(poly); // (1) switch (result) { case COINCIDENT: tree->polygons.add To List(poly); break; case IN BACK OF: backlist.add To List(poly); break; case IN FRONT OF: frontlist.add To List(poly); break; case SPANNING: polygon *front piece, *back piece; BBB(poly, tree->partition, // (2) front piece, back piece); backlist.add To List(back piece); frontlist.add To List(front piece); break; if (!front list.is Empty List()) { tree->front = new BSP tree; Build BSP Tree(, ); // (3-a) if (!back list.is Empty List()) { tree->back = new BSP tree; Build BSP Tree(, ); // (3-b) void Draw BSP Tree(BSP tree *tree, point eye) { float result = tree->partition.ccc(eye); if (result > 0) { Draw BSP Tree(tree->back, eye); tree->polygons.draw Polygon List(); Draw BSP Tree(tree->front, eye); else if (result < 0) { Draw BSP Tree(, eye); // (4-a) tree->polygons.draw Polygon List(); Draw BSP Tree(, eye); // (4-b) else { Draw BSP Tree(tree->back, eye); Draw BSP Tree(tree->front, eye); (a) 문맥상 struct BSP tree 의 partition 은네개의 float 타입의값으로구성된구조체타입의변수라할수있다. 이네개의값은무엇을나타낼까? (b) 위의 Build BSP Tree() 는다각형리스트 polygons 를넘겨받아적절히 BSPT *tree 를구축해주는함수이다. 문맥상 (1) 번라인의 AAA() 함수는주어진 tree->partition 과 poly 에대해어떤일을해주는지정확히기술하라. (c) 문맥상 (2) 번라인의 BBB() 는어떤일을해주는함수인지, 어떤정보를받아들여어떤정보를넘겨주는지정확히기술하라. (d) 문맥상 (3-a) 와 (3-b) 번라인의빈곳에들어갈내용을정확히기술하라. (e) 위의 Draw BSP Tree() 는 *tree 에저장되어있는다각형들을시점 eye 에대해뒤에서앞으로가면서 (back-to-front order) - 2011 년 6 월 15 일 ( 수 ) 오후 3:00 -
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (2/6) 나열해주는함수이다. 첫문장에서호출되는 CCC() 함수는문맥상주어진변수 tree->partition 과점 eye 에대해어떤경우에각각양수, 음수, 그리고 0 을리턴해줄까? (f) 문맥상 (4-a) 와 (4-b) 라인의빈곳에들어갈내용을정확히기술하라. (g) 위의코드에서문맥상잘못된부분을지적하고올바르게고쳐라. 2. 다음도 BSPT 의응용에관한문제이다. 지금가상의 3 차원실내공간을자유롭게돌아다니려하는데, 사용자가벽면을뚫고지나가지못하도록 BSPT 를사용하여충돌검사를하려한다. 지금모든벽면이사각형으로모델링이되어있는데, 이사각형들을사용하여구성한 BSPT TREE 에대해아래와같은함수를호출하려한다. LOS(TREE, A, B); 이때원하는것은 3 차원공간의두점 A 와 B 에의해정의된선분이실내공간의임의의벽면에해당하는사각형과교차를하는지알아내는것인데, 이작업은아래의코드로수행할수있다. 참고로이문제에서 BSPT 타입은다음과같이정의되어있음. typedef struct BSPT { Polygon *poly; struct BSPT *fchild; struct BSPT *bchild; BSPT; int LOS(BSPT *T, float *start, float *end) { int side s, side e, side f, side b; if (!T) return 1; side s = check(start,t->poly); side e = check(end,t->poly); if ((side s == BSPT FRONT) && (side e == BSPT FRONT)) { return LOS( (A) ); else if ((side s == BSPT BACK) && (side e == BSPT BACK)) { return LOS( (B) ); else { if (intersect(t->poly, start, end)) return 0; else { side f = LOS(T->fchild, start, end); side b = LOS(T->bchild, start, end); return (C) ; (a) 이함수는 0 또는 1 값을리턴하도록되어있는데, 문맥상언제 0 값을, 그리고언제 1 값을리턴하는지정확히기술하라. (b) 문맥상 check() 함수가하는일이무엇인지정확히기술하라. (c) 문맥상 (A) 와 (B) 에들어갈내용을 C 언어문법에맞게정확히기술하라. (d) 문맥상 (C) 에들어갈내용을 C 언어문법에맞게정확히기술하라. 3. 다음은 OpenGL ES 2.0 Shading Language 를사용한퐁쉐이딩 (Phong Shading) 의구현에관한문제이다. 아래에주어진버텍스쉐이더 (vertex shader) 및프래그먼트쉐이더 (fragment shader) 코드를보면서답하라. 참고로이문제에서는원근투영과점광원을사용하고있음. static const char* VertexShader = STRINGIFY( attribute vec4 Position; attribute vec3 Normal; uniform mat4 Projection; uniform mat4 Modelview; uniform float Alpha; varying vec3 X; varying vec3 Y; void main(void) { X = (Modelview * Position).xyz; Y = normalize((modelview * vec4(normal, 0.0) * Alpha).xyz); gl Position = Projection * Modelview * Position; ); ------------------------------------------------ static const char* FragmentShader = STRINGIFY( precision mediump float; varying vec3 X; varying vec3 Y; - 2011 년 6 월 15 일 ( 수 ) 오후 3:00 -
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (3/6) uniform vec4 AmbientGlobal; uniform vec4 DiffuseMaterial; uniform vec4 AmbientMaterial; uniform vec4 SpecularMaterial; uniform float Shininess; uniform vec4 LightPosition; uniform vec4 AmbientLight; uniform vec4 DiffSpecLight; void main(void) { vec4 color = AmbientGlobal * AmbientMaterial; ); vec3 N = normalize(y); // (1) vec3 L = normalize(lightposition.xyz - X); float NdotL = dot(n, L); if( NdotL > 0.0 ) { // (2) color += AmbientMaterial * AmbientLight; vec3 What1 = normalize(-x); // (3) vec3 What2 = normalize(l + What1); // (4) float NdotWhat2 = max(dot(n, What2), 0.0); vec4 diffuse = DiffuseMaterial * NdotL; vec4 specular = SpecularMaterial * pow(ndotwhat2, Shininess); gl FragColor = color + DiffSpecLight *(5); else { gl FragColor = color; (a) 위쉐이더를사용하면렌더링하고자하는물체표면의어떤지점들에대해쉐이딩계산이일어난다고할수있을까? (b) 또한문맥상 OpenGL 의어떤좌표계에서쉐이딩계산이수행될까? OC,MC, WdC, CC, NDC, EC, WC 등의기호를사용하여답하라. (c) 버텍스쉐이더의출력변수인 varying 변수 X 와 Y 에저장된값이렌더링파이프라인의어느시점에서, 그리고어떻게프래그먼트쉐이더의입력변수인 varying 변수 X 와 Y 값으로변환이되는지정확히기술하라. (d) 한점 p 를 4 행 4 열행렬 M 이나타내는아핀변환을통해기하변환을한다고하자. p 에서의법선벡터 (normal vector) n 에대해동일한아핀변환을가하려면, n 에어떤행렬을곱해야할지 M 또는 M 의내용을적절히사용하여표현하라 ( 힌트 : 본시험문제에서 A 3 3 은 4 행 4 열행렬 A 의왼쪽 - 위 3 행 3 열부행렬을나타냄 ). (e) 이문제의예제프로그램에서사용하는모델링변환과뷰잉변환은이동변환 T, T1, 회전변환 R, R1, 그리고각축방향으로 s 배확대해주는크기변환 S(s) 에대해다음과같다. M M = R S(s) R1 T1, M V = T 모델뷰행렬 M MV = M V M M 에대해 (((M MV ) 3 3 ) 1 ) t 는다음과같이세개의행렬의곱으로표현할수있는데, 이때행렬 B 와 C 의내용을정확히기술하라. (((M MV ) 3 3 ) 1 ) t = B S( 1 s ) C (f) (((M MV ) 3 3 ) 1 ) t 을크기변환인자값 s 와 M MV 의내용을적절히사용하여표현하라. (g) 위버텍스쉐이더에서문맥상 uniform 변수인 Alpha 에는어떤값이담겨져올까? (h) 다음은 Direct3D 의쉐이더인 HLSL Shader 에대한설명의일부이다. As a minimum, a vertex shader must output vertex position in homogeneous clip space. 위의쉐이더프로그램에서이설명과가장밀접한연관이있는한문장을기술하라. (i) 위버텍스쉐이더는약각비효율적으로작성되어있다. 이쉐이더를어떻게고치면좀더효율적으로렌더링계산을수행할수있을까? (j) (1) 번문장은 Y 벡터의길이를 1 로만들어주고있다. 만약이문장을제거하면렌더링결과에많은차이가있는지, 예 / 아니오 로답하고그이유를정확히설명하라. (k) (2) 번문장의 if 문은어떠한경우에지역조명모델식을적용하지않겠다는것인지정확히기술하라. (l) 만약 (2) 번문장의 if 문을제거해도제거전과동일하게쉐이딩이될지, 예 / 아니오 로답하고그이유를정확히기술하라. (m) (3) 번문장의 What1 변수에는정확히어떤지점에서어느방향을가리키는벡터가저장이될까? (n) (4) 번문장의 What2 변수가저장하는벡터를통칭무엇이라고하는가? - 2011 년 6 월 15 일 ( 수 ) 오후 3:00 -
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (4/6) (o) 문맥상 (5) 번에들어갈내용을정확한쉐이더문법을사용하여기술하라. (p) 아래그림은위의쉐이더프로그램에서어떤특정변수값을바꾸어가며조절한렌더링효과를보여주고있다. 과연어떤변수인지정확히기술하라. 5. 다음그림은몇년전에발표된어떤 GPU (Graphics Processing Unit) 의렌더링계산구조를도시하고있다. 각문제에대해가장연관성이높은파이프라인부분의이름을 A, B, C, D, 그리고 E 중의하나로기술하라. A 4. 다음의퐁의조명모델 (Phong s illumination model) 식을보고답하라. D B C I λ = I aλ k aλ m 1 + f att (d i ) I li λ {k dλ (N L i ) i=0 +k sλ (N H i ) n (a) 변수 I aλ, k aλ, d i, I li λ, k dλ, N, L i, k sλ, H i, n 중카메라의위치에영향을받는변수를모두나열하라. (b) 물체의위치와방향이바뀌었을때영향을받는변수를모두나열하라. (c) Lambert 의코사인법칙을표현해주는부분을정확히기술하라. (d) 광원의위치변화에영향을받는변수를모두나열하라. (e) H i 는어떤상황에서특히효율적으로사용이되는가? 두가지조건을명시하라. (f) 플랫쉐이딩 (flat shading), 퐁쉐이딩, 그리고고우러드쉐이딩 (Gouraud shading) 등세가지방법을계산량이적은것부터순서대로나열하라. (g) f att (d i ) 에서 d i 는 i 번째광원에대해어떤값을나타내는변수인지, 그리고이함수는어떤효과를나타내기위한것인지정확히기술하라. (h) 위문제에주어진 fragment shader 에서 I li λ 값과가장밀접한관계가있는 uniform 변수값을기술하라. (i) 앞문제에주어진프래그먼트쉐이더는한개의광원만 ( 즉 m = 1) 고려하고있는데, 이문제에주어진식과이쉐이더에서사용하는조명모델의가장큰차이를기술하라 (f att (d i ) 부분제외 ). E (a) 쉐이더를통하여퐁쉐이딩을구현할때, 퐁의조명모델이적용되는부분은? (b) 꼭지점의나열순서에따라다각형을제거할수도있는부분은? (c) 필터링방법중의하나인밉매핑 (mipmapping) 과가장밀접한관계가있는부분은? (d) OpenGL 의 glblendfunc() 함수가직접적으로영향을미치는부분은? (e) 실제로은면제거 (hidden surface elimination) 계산이수행되는부분은? (f) 카메라를기준으로하는좌표계가존재하는부분은? (g) 일반적으로 hierarchical modeling 과가장관계가깊은부분은? (h) 버텍스쉐이더의속성데이터가프래그먼트쉐이더의속성데이터로변환되는부분은? (i) 원근나눗셈연산이수행되는부분은? (j) OpenGL 의 gluperspective() 함수로설정한뷰볼륨의밖에존재하는기하프리미티브 (geometric primitive) 들이제거가되는부분은? - 2011 년 6 월 15 일 ( 수 ) 오후 3:00 -
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (5/6) (k) 정상적인원근투영변환을할때, 꼭지점의동차좌표의 W 좌표값이 1 이아닌값이나타날수있는부분은? (l) 뷰폿변환과가장밀접한관련이있는부분은? (m) 꼭지점들이기하프리미티브들로조립되는부분은? 6. 다음은광원의설정에관한문제이다. (a) 지금광부들이사용하는헤드라이트와같이카메라에고정된점광원을사용하려한다. 만약광원을항상카메라의기준점에서위로 5.0 만큼떨어진곳에위치시키려하면, 아래의코드에서 gllightfv(gl LIGHT0, GL POSITION, li pos); 문장을정확히몇번라인과몇번라인사이에삽입해야하는지, 그리고그때 (A), (B), (C), (D) 에들어갈내용은무엇인지기술하라. GLfloat li pos[4] = { (A), (B), (C), (D) ; // (1). glmatrixmode(gl MODELVIEW); // (2) glloadidentity(); // (3) // Do viewing transform. glulookat(v[0], v[1], v[2], c[0], c[1], c[2], 0.0, 1.0, 0.0); // (4) glpushmatrix(); // (5) // Do modeling transform. glrotatef(45.0, 0.0, 1.0, 0.0); // (6) gltranslatef(-2.5, 0.5, -9.5); // (7) draw object in MC(); // (8) glpopmatrix(); // (9) (b) 만약광원을세상좌표계의 (3.0, 0.5, -1.5) 인지점에고정시킨후렌더링을하려할경우에대해위문제를풀어라. (c) 만약광원을 (8) 번라인에서그리고있는물체의모델링좌표계의 (3.0, 0.5, -1.5) 지점에고정시킨후, 렌더링을하려할경우에대해위문제를풀어라. 7. 다음은 OpenGL 환경에서의텍스춰필터링에관한문제이다. 아래그림을보면서답하라. (a) 레벨 0 ( 최고해상도 ) 의밉맵 (mipmap) 텍스춰의한텍셀이나타내는영역의면적은레벨 3 의밉맵텍스춰의한텍셀이나타내는영역의면적의몇배일까? (b) 첫번째그림에서 a 는픽셀에대한원상 (pre-image) 의중점을가리키고, b 부터 e 까지는 a 를포함하는주변텍셀의중심점을나타낸다. b, c, d, 그리고 e 지점의텍셀색깔이각각 (1,1,1), (1,0,0), (1,1,0), 그리고 (0,1,1) 이라고하자. 이때선형필터 (GL LINEAR) 를사용할경우 a 지점에대해계산되는색깔은무엇일까? 반드시계산과정을밝혀라 ( 이그림에서숫자는거리에대한비율을나타냄 ). (c) 두번째그림은축소필터로 GL LINEAR 를, 확대필터로는 GL NEAREST 를사용한경우의렌더링결과이다. 지금축소및확대두필터가동시에적용이되고있는데, 과연이러한상황에는왼쪽과오른쪽부분에각각어떤필터가적용되고있을까? 그리고그이유는무엇일까? - 2011 년 6 월 15 일 ( 수 ) 오후 3:00 -
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (6/6)! " (d) 세번째그림은축소상황이발생한경우이다. 서로다른레벨의밉맵텍스춰에대해서서로다른색깔의텍스춰이미지를로드한후, 축소필터로 GL LINEAR MIPMAP NEAREST 를사용한결과인데, 만약이축소필터대신에 GL LINEAR MIPMAP LINEAR 를사용할경우렌더링결과가어떻게달라질까? 8. 다음은배열 p[*][*] 에저장된,y w 축에수직인평면상의경로를따라움직이는자동차에서바라본세상을렌더링해주는코드의일부이다. void set up rot mat(float *m, float *minv, int i) { GLfloat u[3], v[3], n[3]; v[0] = ; // (1) if (i == 0) { u[0] = p[0][0] - p[1][0]; u[1] = p[0][1] - p[1][1]; u[2] = p[0][2] - p[1][2]; else { u[0] = p[i-1][0] - p[i][0]; u[1] = p[i-1][1] - p[i][1]; u[2] = p[i-1][2] - p[i][2]; normalize vec3(u); cross prod vec3(u, v, n); m[0] = ; m[15] = 1.0; minv[0] = ; minv[15] = 1.0; void dispaly(void) { GLfloat m[16], minv[16]; glclear(gl COLOR BUFFER BIT); set up rot mat(m, minv, cur i); glpushmatrix(); gltranslatef(p[c i][0], 4.89, p[c i][2]); glmultmatrixf(m); draw car(); glpopmatrix(); glutswapbuffers(); (a) (1) 번문장에서 v 벡터의값 v[0], v[1], v[2] 의값을설정하고있는데, 각원소값은문맥상어떤값으로설정되어야할까? 세상좌표계와자동차몸체의모델링좌표계모두위쪽이 y 축방향에해당함. (b) 문맥상 set up rot mat() 함수안에서배열 m 과 minv 의값을설정하고있는데, m[4] 와 minv[4] 에저장되어야하는각값을 C 언어문법에맞게기술하라. OpenGL 에서의기하변환행렬원소의저장순서를고려할것. (c) 이쪽의위에있는그림은자동차몸체의모델링좌표계상에서운전석에카메라를배치하는과정을보여주고있다. 만약자동차를세상에배치한후, 이카메라에서세상을바라보는장면을렌더링할때의뷰잉변환행렬 M V 를기본변환행렬 T(x,y,z) ( 이동변환 ), S(x,y,z) ( 크기변환 ), R(angle,x,y,z) ( 회전변환 ) 이나이프로그램의변수 m 과 minv 가나타내는 M m 과 M minv 등의곱으로표현하라. (d) 지금운전석에배치한카메라를사용하여렌더링한다고가정할때, display() 함수의 (2) 에들어갈뷰잉변환코드를 OpenGL 함수들을적절히사용하여 C 언어문법에맞게정확히기술하라 ( 힌트 : 카메라프레임은자동차몸체를세상좌표계에배치할때같이움직임 ). glmatrixmode(gl MODELVIEW); glloadidentity(); (2) draw axes(); draw path(); 끝 - 2011 년 6 월 15 일 ( 수 ) 오후 3:00 -
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (1/8) 기초컴퓨터그래픽스기말고사 (CSE4170) 담당교수 : 임인성 답은반드시답안지에기술할것. 공간이부족할경우반드시답안지몇쪽의뒤에있다고명기한후기술할것. 그외의경우의답안지뒤쪽이나연습지에기술한내용은답안으로인정안함. 1. 아래그림 1에주어진실시간 3D 렌더링파이프라인의계산과정에대한질문에답하라. (1) vertex stream (2) Vertex Shader (3) vertex stream (4) Primitive Assembly (5) primitive stream (6) Geometry Shader (7) primitive stream (8) Clipping & Setup (9) Rasterization (10) pixel stream (11) Pixel Shader (12) pixel stream (13) Raster Operation (14) Framebuffer 그림 1: 실시간렌더링계산과정예 (a) OpenGL 파이프라인에서의색깔혼합 (color blending) 계산과가장관련이깊은단계의번호는? (b) OC, MC, WC, EC, CC, NDC, WdC 등의 OpenGL 좌표계중 (3) 번시점은어떤좌표계에해당할까? (c) 뷰폿변환과가장밀접한관련이있는단계의번호는? (d) 모델링변환과뷰잉변환이일어나는단계에해당하는번호는? (e) 전통적인 OpenGL 파이프라인 에서은면제거, 즉안보이는면이제거되는계산과가장관련이깊은단계의번호는? (f) 다면체모델에대한쉐이딩방법중의하나인퐁쉐이딩방법을구현하려할때, 실제로퐁의조명모델식의계산이가장자연스럽게수행될수있는단계에해당하는번호는? (g) 꼭지점의좌표에투영변환행렬이곱해지는단계에해당하는번호는? (h) 삼각형의꼭지점에설정된여러속성들이픽셀들에대한속성으로바뀌는단계에해당하는번호는? 2. 다음의 2차원기하변환에관한프로그램을보고답하라. int iii = 0; void display(void) { glclear(gl COLOR BUFFER BIT); glmatrixmode(gl MODELVIEW); glpushmatrix(); glrotatef(iii*90.0, 0.0, 0.0, 1.0); gltranslatef(-250.0, -250.0, 0.0); glbegin(gl TRIANGLES); glvertex2f(500.0, 0.0); glvertex2f(500.0, 500.0); glvertex2f(0.0, 500.0); glend(); glpopmatrix(); glflush(); void sogang(int button, int state, int x, int y) { if ((button == GLUT LEFT BUTTON) && - 2010 년 6 월 16 일 ( 수 ) 오후 6:00 -
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (2/8) 그림 2: OpenGL 을사용한 2 차원기하변환 (state == GLUT DOWN)) iii = (iii+1)%4; glutpostredisplay(); void university(int width, int height) { glviewport(0, 0, width, height); glmatrixmode(gl PROJECTION); glloadidentity(); glortho(0.0, (double) width, 0.0, (double) height, -1.0, 1.0); glutpostredisplay(); void OpenGLInitandRegisterCallback(void) { glclearcolor(1.0, 1.0, 1.0, 1.0); glpolygonmode(gl FRONT AND BACK, GL FILL); glcolor3f(1.0, 0.0, 0.0); glutdisplayfunc(display); glutreshapefunc(university); glutmousefunc(sogang); void main (int argc, char **argv) { glutinit(&argc, argv); glutinitdisplaymode(glut RGBA); glutinitwindowsize(500, 500); glutcreatewindow("midterm Problem"); OpenGLInitandRegisterCallback(); glutmainloop(); (a) 사용자가왼쪽마우스버튼을누를때마다화면의그림이어떤식으로순환하는지, 그림 2와같은방식으로그려라. 도형의모양과위치를가급적정확히표시하고어떤부분이적색영역인지분명히밝힐것. (b) 만약그림 2에도시한방식으로화면이바뀌도록하려면이프로그램을어떻게수정해야하는가? 어느함수의어떤문장과어떤문장사이에어떤문장 ( 들 ) 을삽입함 과같이표시하고, 삽입할문장 ( 들 ) 을 OpenGL 함수들을적절히사용하여 C언어문법에맞게정확히기술하라. (c) 원래의프로그램상태에서 university() 함수의 glortho() 함수문장을아래와같이수정할경우화면의내용이어떻게반복될지, 그림 2와같은방식으로그려라. glortho(0.0, width/2.0, 0.0, height/2.0, -1.0, 1.0); (d) 원래의프로그램상태에서 university() 함수의 glortho() 함수문장직전에아래와같은문장을삽입할경우화면의내용이어떻게반복될지, 그림 2와같은방식으로그려라. glscalef(0.5, 0.5, 1.0); ( 힌트 : 앞문제의직교투영변환을잘생각해보고, 이크기변환이직교투영에어 - 2010 년 6 월 16 일 ( 수 ) 오후 6:00 -
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (3/8) S D 그림 3: 색깔합성예 1 0 C 0 1 C 1 2 1.0 2 C 떤영향을미치는지를생각해볼것 ) 3. 다음은색깔혼합에관한문제이다. 두장의이미지 S와 D의합성에대하여생각하자. (c S α S ) 와 (c D α D ) 를두이미지의대응되는화소의미리곱한색깔 (pre-multiplied color) 이라할때, 두색깔의합성을통하여생성한결과색깔 (c O α O ) 는다음과같이표현할수있다. c O = F S c S + F D c D α O α S α D (a) 만약값이 (0.5, 0.5, 0.5, 0.5) 인미리곱한색깔로어떤화소를칠한다고할때, 이는그화소를어떻게칠하는것인지정확히기술하라. (b) 그림 3에도시한합성연산의경우 F S 와 F D 의값은각각얼마인가? (c) 만약 S over D 연산을적용한다면, 합성후 α O 는어떤값을가질지를 S와 D의관련값을사용하여정확히기술하라. (d) 그림 4와같은상황을생각해보자. 지금관찰자가세개의물체 M 0, M 1, M 2 를바라보고있는데, M 0 는실제색깔이 C 0 인유리로서뒤에서들어오는빛을 1 α 0 의비율로통과시킨다. 한편 M 1 은색깔이 C 1 이고빛을 1 α 1 의비율만큼만통과시키고, 제일오른쪽에있는 M 2 는불투명한벽으로서 C 2 의색깔을가진다. 이때 M 0 와 M 1 을앞에서뒤로가면서 (front-toback order) 합성한다고할때의불투명도 α 01 값이무엇일지정확히기술하라. 그림 4: 색깔합성예 2 (e) 바로위문제에서와같이 M 0 와 M 1 을앞에서뒤로가면서합성한다고할때의결과색깔 C 01 값이무엇일지, 위문제의인자를사용하여정확히기술하라. 여기서 C 0, C 1, 그리고 C 01 은미리곱한색깔이아닌원래의 RGB 색깔을의미함. (f) 위문제에서모든합성이끝난후결과적으로눈에보이는색깔 C 012 는무엇일지위문제의인자를사용하여정확히기술하라. (g) 아래의프로그램에서함수 test0() 을수행시킬경우그림 5(a) 와같이서로다른색깔로칠해지는여러영역을볼수있는데, 이때 (1) 번영역과 (2) 번영역의 RGB 색깔을정확히기술하라. ( 주의 : RGB 각채널값은 0과 1 사이의값을가짐 ) void rect(glfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat R, GLfloat G, GLfloat B, GLfloat A) { glcolor4f(r, G, B, A); glbegin(gl QUADS); glvertex2f(l, b); glvertex2f(r, b); glvertex2f(r, t); glvertex2f(l, t); glend(); void test0(void) { glclearcolor(0.0, 0.0, 0.0, 0.0); glclear(gl COLOR BUFFER BIT); glenable(gl BLEND); glblendfunc(gl ONE, GL ZERO); - 2010 년 6 월 16 일 ( 수 ) 오후 6:00 -
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (4/8) rect(-2.0, 4.0, -2.0, 4.0, 0.0, 1.0, 0.0, 1.0); glblendfunc(gl SRC ALPHA, GL DST ALPHA); rect(-3.5, 3.0, -3.5, 3.0, 1.0, 0.0, 0.0, 1.0); rect(0.0, 4.8, -4.8, 2.0, 0.0, 0.0, 1.0, 1.0); gldisable(gl BLEND); void test1(void) { glclearcolor(0.0, 0.0, 0.0, 0.0); glclear(gl COLOR BUFFER BIT); glenable(gl BLEND); glblendfunc(gl ONE, GL ZERO); rect(-2.0, 4.0, -2.0, 4.0, 0.0, 1.0, 0.0, 1.0); glblendfunc((a), (B)); rect(-3.5, 3.0, -3.5, 3.0, 1.0, 0.0, 0.0, 1.0); gldisable(gl BLEND); (h) 다음함수 test1() 을수행시켰을때그림 5(b) 와같은결과를얻으려면, (A) 와 (B) 에어떤인자값이설정되어야할지, 다음값들중적절한인자를선택하라. ( 여기서 (1), (2), (3) 번영역의색깔은각각 (0, 0, 0), (1, 0, 0), (0, 1, 0) 임 ) GL ZERO, GL ONE, GL SRC ALPHA, GL DST ALPHA, GL ONE MINUS SRC ALPHA, GL ONE MINUS DST ALPHA 4. 지금가상의 3차원실내공간을자유롭게네비게이션하려하는데, 사용자가벽면을뚫고지나가지못하도록 Binary Space Partitioning Tree (BSPT) 를사용하여충돌검사를하려 한다. 지금모든벽면이사각형으로모델링이되어있는데, 이사각형들을사용하여구성한 BSPT TREE에대해아래와같은함수를호출하려한다. LOS(TREE, A, B); 이때원하는것은 3차원공간의두점 A와 B에의해정의된선분이실내공간의임의의벽면에해당하는사각형과교차를하는지알아내는것인데, 이작업은아래의코드로수행할수있다. 참고로 BSPT 타입은다음과같이정의되어있음. typedef struct BSPT { Polygon *poly; struct BSPT *fchild; struct BSPT *bchild; BSPT; int LOS(BSPT *T, float *start, float *end) { int side s, side e, side f, side b; if (!T) return 1; side s = check(start,t->poly); side e = check(end,t->poly); if ((side s == BSPT FRONT) && (side e == BSPT FRONT)) { return LOS( (A), start, end); else if ((side s == BSPT BACK) && (side e == BSPT BACK)) { return LOS( (B), start, end); else { if (intersect(t->poly, start, end)) return 0; else { side f = LOS(T->fchild, start, end); side b = LOS(T->bchild, start, end); return (C) ; - 2010 년 6 월 16 일 ( 수 ) 오후 6:00 -
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (5/8) (1) (3) (1) (1) (2) (2) (2) 3-3.5-2 4 0 4.8 x -3.5-2 4 3 x (a) test0() 수행결과 (b) test1() 수행결과 그림 5: 색깔의혼합 (a) 이함수는 0 또는 1 값을리턴하도록되어있는데, 문맥상언제 0 값을, 그리고언제 1 값을리턴하는지정확히기술하라. (b) 문맥상 check() 함수가하는일이무엇인지정확히기술하라. (c) 문맥상 (A) 와 (B) 에들어갈내용을 C 언어문법에맞게정확히기술하라. (d) 문맥상 (C) 에들어갈내용을 C 언어문법에맞게정확히기술하라. 5. 이문제도 Binary Space Partitioning Tree에관한것이다. 그림 6의함수 display bspt back to front() 는시점의위치 viewer[3] 가주어졌을때, 뒤에서앞으로 (back-to-front) 가면서 bspt의다각형들을그려주는함수이다. (a) 이예제프로그램의문맥상 (A) 에들어갈가장적절한내용의 C 코드를작성하라. 이함수는결과로 BSPT FRONT 또는 BSPT BACK을리턴해야한다. (b) (B), (C), (D), (E) 에들어갈내용을정확한 C 코드형태로기술하라. (c) bspt가나타내는물체를 OpenGL의블렌딩기능을사용하여투명하게그려주려한다. (F) 에들어갈내용을정확한 C 코드형태로기술하라. (d) 위의문제를모두제대로풀었다는가정하에, 만약뒤에서앞으로 (back-to-front) 가아니라앞에서뒤로가면서 (front-toback) 다각형들을그려주려면이프로그램의어느부분을어떻게고쳐야할지, 문장번호를언급하며정확히기술하라. 6. 다음은라이팅과쉐이딩에관한문제이다. 아래의 m개의광원에대한퐁의조명모델식을보고답하라. I λ = I aλ k aλ m 1 + f att (d i ) I li λ {k dλ (N L i ) i=0 + k sλ (N H i ) n (a) 변수 I aλ, k aλ, d i, I li λ, k dλ, N, L i, k sλ, H i, n중카메라의위치에영향을받는변수를모두나열하라. (b) 물체의위치와방향이바뀌었을때영향을받는변수를모두나열하라. (c) 광원의위치변화에영향을받는변수를모두나열하라. - 2010 년 6 월 16 일 ( 수 ) 오후 6:00 -
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (6/8) typedef struct { int nv; // number of vertices float *vertex; // pointer to vertex data float *normal; // pointer to normal data float plane[4]; // plane equation Polygon; typedef struct bspt { // data structure for bspt Polygon *poly; struct bspt *fchild; // for the front side struct bspt *bchild; // for the back side BSPT; int check side(float *pos, Polygon *poly) { (A) BSPT *bspt; // object in BSPT float viewer[3]; // camera position. void display bspt back to front(bspt *bspt, float *viewer) { int viewer side; // (1) if (bspt == NULL) return; // (2) viewer side = check side(viewer, bspt->poly); // (3) if (viewer side == BSPT BACK) { // (4) display bspt back to front( (B), viewer); // (5) draw bspt poly(bspt->poly); // (6) display bspt back to front( (C), viewer); // (7) else { /* viewer side == BSPT FRONT */ // (8) display bspt back to front( (D), viewer); // (9) draw bspt poly(bspt->poly); // (10) display bspt back to front( (E), viewer); // (11) void display(void) { glblendfunc( (F) ); // (12) glenable(gl BLEND); // (13) glclear(gl COLOR BUFFER BIT GL DEPTH BUFFER BIT); // (14) display bspt back to front(bspt, viewer); // (15) glutswapbuffers(); 그림 6: BSPT 관련함수 - 2010 년 6 월 16 일 ( 수 ) 오후 6:00 -
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (7/8) (d) H i 는어떤상황에서특히효율적으로사용이되는가? 두가지조건을명시하라. (e) 플랫쉐이딩, 퐁쉐이딩, 그리고고우러드쉐이딩등세가지방법을계산량이적은것부터순서대로나열하라. 7. 다음은 Cg API를통한쉐이더프로그래밍과퐁의조명모델에관한문제이다. 아래에주어진버텍스쉐이더및픽셀쉐이더를보고답하라. 참고로이예에서는원근투영과점광원을사용하고있음. struct output { float4 X: TEXCOORD0; float3 Y: TEXCOORD1; // (0) float4 position: POSITION; ; output main(float4 A: POSITION, float4 B: NORMAL, uniform float4x4 ModelViewProj: state.matrix.mvp, uniform float4x4 ModelView: state.matrix.modelview, uniform float4x4 ModelViewIT: state.matrix. (4).invtrans) { output OUT; OUT.X = mul(modelview, A); // (1) OUT.Y = mul(modelviewit, B).xyz; // (2) OUT.position = mul(modelviewproj, A); // (3) return OUT; state.light[0].ambient, uniform float4 ld: state.light[0].diffuse, uniform float4 ls: state.light[0].specular, uniform float4 ma: state.material.ambient, uniform float4 md: state.material.diffuse, uniform float4 ms: state.material.specular, uniform float me: state.material.shininess) { output OUT; OUT.color = g a * ma; float3 N = normalize(y); float3 L = normalize(lp - X); float NdotL = dot(n, L); OUT.color += ma * la; if(ndotl >= 0.0) { // (5) float3 What1 = normalize(-x); // (6) float3 What2 = normalize(l + What1); // (7) float NdotWhat2 = dot(n, What2); float4 li = lit(ndotl, NdotWhat2, me); float3 D = md * li.y; float3 S = ms * li.z; OUT.color += (8) ; return OUT; ----------------------------------------- struct output { float3 color: COLOR; ; output main(float4 X: TEXCOORD0, float3 Y: TEXCOORD1, uniform float4 g a: state.lightmodel.ambient, uniform float4 lp: state.light[0].position, uniform float4 la: (a) 이프로그램은각픽셀을통해서보이는물체의각지점에서퐁의조명모델을적용하여쉐이딩계산을하는퐁쉐이딩계산을위한쉐이더코드이다. 이프로그램에서는 OpenGL의어떤좌표계에서쉐이딩계산을하고있을까? OC, MC, WdC, CC, NDC, EC, WC 등의기호를사용하여답하라. - 2010 년 6 월 16 일 ( 수 ) 오후 6:00 -
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (8/8) (b) 주어진한점 p를 4행 4열행렬 M이나타내는아핀변환을통해기하변환한다고할때, p에서의법선벡터 (normal vector) n에대해동일한아핀변환을가하려면 n에어떤행렬을곱해야할지 M을사용하여표현하라. (c) 만약 (0) 문장의 float3 Y: TEXCOORD1; 를 float3 Y: COLOR1; 과같이변경하였을때, 이쉐이더들이제대로작동하려면약간의수정이필요한데, 그내용을 C/Cg 문법에맞게정확히기술하라. 그림 7: 조명효과의조절 (k) 그림 7은위의쉐이더프로그램에서어떤특정변수값을바꾸어가며조절한렌더링효과를보여주고있다. 과연어떤변수인지정확히기술하라. (d) 보편적인렌더링관련쉐이더코드작성시버텍스쉐이더에서는꼭해주어야하는작업이하나있다. 위의버텍스쉐이더에서이작업과가장관련이깊은문장의번호는 (1), (2), (3) 중어떤것이며, 이작업은구체적으로무엇을의미하는지정확히기술하라. (e) 문맥상버텍스쉐이더코드의 (4) 부분에들어갈내용을정확히기술하라. 대소문자를구별할것. (f) (5) 번의 if 문장은어떠한경우에지역조명모델식을계산하지않겠다는것인지그상황을설명하라. (g) 만약 (5) 번의 if 문장을제거해도제거전과동일하게쉐이딩이될까? 예 / 아니오로답하고그이유를정확히기술하라. (h) (6) 번문장의 What1 변수에는정확히어떤지점에서어느방향을가리키는벡터가저장이될까? (i) (7) 번문장의 What2 변수가저장하는벡터를통칭무엇이라고하는가? (j) 문맥상 (8) 번에들어갈내용을 C 언어문맥에맞게정확히기술하라. - 2010 년 6 월 16 일 ( 수 ) 오후 6:00 -
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (1/9) [CSE4170: 기초컴퓨터그래픽스 ] 기말고사문제 ( 담당교수 : 임인성 ) 답은반드시답안지에기술할것. 공간이부족할경우반드시답안지몇쪽의뒤에있다고명기한후기술할것. 그외의경우의답안지뒤쪽이나연습지에기술한내용은답안으로인정안함. 1. 그림 1에는모델링좌표계 (MC) 에설계되어있는자동차모델을세상좌표계 (WC) 로배치해주는과정이도시되어있다 ( 이그림에서 z m 과 z w 축은각각오른손좌표계방향으로되어있음 ). 그림 1: 모델링변환과뷰잉변환 (a) 자동차의위치와방향에관련된정보가세상좌표계에서한점 e =(e x,e y,e z ) 와길이가 1이고서로수직인세벡터 u = (u x,u y,u z ), v = (0, 0, 1), n = (n x,n y,n z ) 로주어져있다. 이때적용되는모델링변환에해당하는 4행 4열행렬 M M 을이동변환, 크기변환, 회전변환등의기본변환행렬의곱으로적절히표현하라 ( 예를들어, M M = T 1 R 1 T 2 S 1 와같은방식으로표현하고, 각기본변환행렬의내용을정확히기술하되, 전체곱행 xm u n ym 렬은계산할필요가없음 ). (b) C = (e, (u, v, n)) 정보를사용하여카메라를배치하려할때적용되는뷰잉변환 M V 를위의문제에서사용한기본변환의행렬또는그의역행렬을가급적많이사용하여표현하라. (c) 마지막쪽의그림 9에서이문제와가장관련이깊은박스의기호를기술하라. 2. 다음은색깔혼합 (color blending) 에관한문제이다. (c A α A ) 와 (c B α B ) 를두장의이미지 A와 B의대응되는화소의미리곱한색깔 (premultiplied color) 이라하자. F A 와 F B 를각각 A와 B의화소에서 α A 와 α B 의비율로존재하는미립자들중결과이미지 O에살아남는미립자의비율이라하면, 합성의결과로생성되는미리곱한색깔은다음과같다. c O = F A c A + F B c B α O α A α B (a) 투명한물체를렌더링하거나, 안개등의기상효과, 텍스춰의혼합, 앤티앨리어싱기법들을구현하는데유용하게사용이되는 A over B 연산의경우 F A 와 F B 는각각얼마일까? (b) 그림 2의아래쪽그림은시선을따라샘플링한색깔들을카메라를기준으로앞에서뒤로가면서 (front-to-back) 점진적으로합성해주는상황을도시하고있다. 이 - 2009 년 6 월 27 일 ( 토 ) 오후 1:00 -
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (2/9) 그림 2: Back-to-front and front-to-back compositions S D D S (a) 경우 A (b) 경우 B 그림 3: 두가지경우를 OpenGL API를사용하여구현하려면, 현재까지합성한색깔을미리곱한색깔 (c D α D ) = (α D C D α D ) 형태로 RGBA 타입의색깔버퍼 (color buffer) 에저장한후, 지금추가적으로합성하려는색깔을렌더링파이프라인을타고들어오는미리곱한색깔형태의프래그먼트색깔 (c S α S )=(α S C S α S ) 로하여합성을해주면된다. 이때그림 3(a) 와 (b) 에도시된두가지경우중이문제에더적합한경우는 A와 B 중어떤것일까? (c) 위문제에연속하여, 합성의결과새로이생성되는미리곱한색깔을 (c O α O ) = (α O C O α O ) 라할때, α O 의식을정확히기술하라. (d) 이때합성된화소에칠해줄실제색깔 ( 미리곱한색깔이아닌 ) C O 에대한식을 α D, α S, C D, C S 등으로표현하라. (e) 위세문제에서의혼합연산을 OpenGL API의색깔혼합기능을사용하여구현하려할경우, 원시인자 (source factor) 와목적인자 (destination factor) 로어떤값을사용해야할까? 다음 OpenGL 상수값들중적절한인자를선택하라. GL ZERO, GL ONE GL SRC ALPHA GL DST ALPHA GL ONE MINUS SRC ALPHA GL ONE MINUS DST ALPHA (f) 만약그림 2의위쪽그림에서와같이뒤에서앞으로오면서 (back-to-front) 점진적으로합성하려할경우, 과연색깔버퍼의알파채널이필요할까? 예 / 아니오 로답하고그이유를분명히답하라. (g) 만약 OpenGL API를사용하여뒤에서앞으로오면서 (back-to-front) 점진적으로합성하려할경우, 원시인자 (source factor) 와목적인자 (destination factor) 로어떤값을사용해야할까? 위의값들중적절한인자를선택하라. (h) 그림 4(a) 와 (b) 에는두개의입력이미지가주어져있다. GIRL 이미지와 NAGEL 이미지모두 RGBA 타입의이미지로서, GIRL 이미지의경우모든 A 채널값이 1.0으로저장되어있다. 반면 NAGEL 이 - 2009 년 6 월 27 일 ( 토 ) 오후 1:00 -
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (3/9) 역을제외한나머지영역 ( 즉 A 채널값이 1.0으로지정되어있는부분 ) 은대응되는 GIRL 이미지의색깔로, 나머지영역은검정색으로칠하도록합성한예이다. 이렇게합성하기위해서 (A) 와 (B) 에필요한 OpenGL 상수를정확히기술하라. (a) GIRL 이미지 (b) NAGEL 이미지 (j) 마지막쪽의그림 9에서이문제와가장관련이깊은박스의기호를기술하라. 3. 다음은카메라의조작에관한문제이다. (c) 합성예 1 (d) 합성예 2 그림 4: 색깔혼합예미지의경우흰색부분의화소에대해서는 A 채널값이 0.0으로저장되어있고, 흰색을제외한나머지영역의화소에대해서는 1.0으로지정이되어있다. 이때아래와같은코드를사용하여 NAGEL 이미지에서흰색이있은영역을제외한나머지영역 ( 즉 A 채널값이 1.0으로지정되어있는부분 ) 의색깔은자신의색깔로, 나머지영역은 GIRL 이미지의색깔을사용하여그림 4(c) 이미지와같은그림을생성하려한다. 이때 (A) 와 (B) 에들어갈 OpenGL 상수를정확히기술하라. glenable(gl BLEND); glblendfunc(gl ONE, GL ZERO); draw GIRL(); glblendfunc( (A), (B) ); draw NAGEL(); gldisable(gl BLEND); (i) 위문제에연속하여, 그림 4(d) 의이미지는 NAGEL 이미지에서흰색이있은영 (a) 지금광부들이사용하는헤드라이트의예에서와같이카메라에고정된점광원을사용하려한다. 만약광원을항상카메라의기준점에서위로 3.0만큼떨어진곳에위치시키려하면, 아래의코드에서 gllightfv(gl LIGHT0, GL POSITION, li pos); 함수를정확히어느지점에서호출해야하는지 ( 라인번호를사용하여위치지정 ), 그리고그때 (A), (B), (C), (D) 에들어갈내용은무엇인지기술하라. GLfloat li pos[4] = { (A), (B), (C), (D) ; // (1). glmatrixmode(gl MODELVIEW); // (2) glloadidentity(); // (3) glulookat(v[0], v[1], v[2], c[0], c[1], c[2], 0.0, 1.0, 0.0); // (4) glpushmatrix(); // (5) Do modeling transform and draw objects glpopmatrix(); // (6) (b) 만약광원을세상좌표계의 (3.0, 0.5, - 1.5) 인지점에고정시킨후렌더링을하려할경우에대해위문제를풀어라. - 2009 년 6 월 27 일 ( 토 ) 오후 1:00 -
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (4/9) 그림 6: 라이팅계산 4. 다음은라이팅계산에관한문제이다. (a) 점광원, 평행광원, 그리고분산광원을비교할때계산비용이높은것으로부터낮은순서로나열하라. (b) 퐁쉐이딩, 플랫쉐이딩, 그리고고우러드쉐이딩을비교할때계산비용이높은것으로부터낮은순서로나열하라. (c) 위의세가지쉐이딩방법중선형보간 (linear interpolation) 과가장관련이적은것은? (d) 그림 5의식에서이상한부분을지적하고옳게고쳐라. (e) 그림 5의식에서 Lambert의코사인법칙을표현해주는부분을정확히기술하라. (f) 그림 5의식에서카메라에서바라보는방향에영향을받는변수를모두나열하라. (g) 그림 5의식에서물체의위치와방향이바뀌었을때영향을받는변수를모두나열하라. (h) 그림 6은그림 5의식의어떤변수의성질을설명하기위한것인가? (i) 전통적인 fixed-function 렌더링파이프라인을고려할때, 마지막쪽의그림 9에서이문제와가장관련이깊은두개의박스의기호를기술하라. 5. 다음은 Cg API를통한쉐이더프로그래밍과퐁의조명모델에관한문제이다. 아래에주어진 Cg 버텍스쉐이더및픽셀쉐이더를보고답하라. 참고로이예에서는원근투영과점광원을사용하고있음. struct output { float4 X: TEXCOORD0; float3 Y: TEXCOORD1; float4 position: POSITION; ; output main(float4 A: POSITION, float4 B: NORMAL, uniform float4x4 ModelViewProj: state.matrix.mvp, uniform float4x4 ModelView: state.matrix.modelview, uniform float4x4 ModelViewIT: state.matrix. (4).invtrans) { output OUT; OUT.X = mul(modelview, A); // (1) OUT.Y = mul(modelviewit, B).xyz; // (2) OUT.position = mul(modelviewproj, A); // (3) return OUT; =============================== struct output { float3 color: COLOR; ; output main(float4 X: TEXCOORD0, float3 Y: TEXCOORD1, uniform float4 g a: state.lightmodel.ambient, uniform float4 lp: state.light[0].position, uniform float4 la: state.light[0].ambient, uniform float4 ld: state.light[0].diffuse, uniform float4 ls: state.light[0].specular, uniform float4 ma: state.material.ambient, uniform float4 md: state.material.diffuse, uniform float4 ms: state.material.specular, uniform float me: state.material.shininess) { - 2009 년 6 월 27 일 ( 토 ) 오후 1:00 -
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (5/9) output OUT; OUT.color = g a * ma; float3 N = normalize(y); float3 L = normalize(lp - X); float NdotL = dot(n, L); if(ndotl >= 0.0) { // (5) b 1 4 e a 3 2 c d texel pixel preimage OUT.color += ma * la; float3 What1 = normalize(-x); // (6) float3 What2 = normalize(l + What1); // (7) float NdotWhat2 = dot(n, What2); float4 li = lit(ndotl, NdotWhat2, me); float3 D = md * li.y; float3 S = ms * li.z; OUT.color += (8) ; return OUT; (a) 이프로그램은각픽셀을통해서보이는물체의각지점에서퐁의조명모델을적용하여쉐이딩계산을하는퐁쉐이딩계산을위한쉐이더코드이다. 이프로그램에서는 OpenGL의어떤좌표계에서쉐이딩계산을하고있을까? OC, MC, WdC, CC, NDC, EC, WC 등의기호를사용하여답하라. (b) 보편적인렌더링관련쉐이더코드작성시버텍스쉐이더에서는꼭해주어야하는작업이하나있다. 위의버텍스쉐이더에서이작업과가장관련이깊은문장의번호는 (1), (2), (3) 중어떤것이며, 이작업은구체적으로무엇을의미하는지정확히기술하라. (c) 문맥상버텍스쉐이더코드의 (4) 부분에들어갈내용을정확히기술하라. 대소문자를구별할것. (d) ( 사실없어도문제는없으나 ) (5) 번의 if 그림 7: 선형필터문장은어떠한경우에지역조명모델식을계산하지않겠다는것인지그상황을설명하라. (e) (6) 번문장의 What1 변수에는정확히어떤지점에서어느방향을가리키는벡터가저장이될까? (f) (7) 번문장의 What2 변수가저장하는벡터를통칭무엇이라고하는가? (g) 문맥상 (8) 번에들어갈내용을 C 언어문맥에맞게정확히기술하라. (h) 그림 6은위의쉐이더프로그램에서어떤특정변수값을바꾸어가며조절한렌더링효과를보여주고있다. 과연어떤변수인지정확히기술하라. (i) 마지막쪽의그림 9에서위의쉐이더코드의두번째에있는 output main() 함수가수행되는부분에해당하는박스의기호를기술하라. 6. 다음은 OpenGL 환경에서의텍스춰필터링에관한문제이다. (a) 레벨 3의밉맵텍스춰의한텍셀이나타내는영역의면적은레벨 1의밉맵텍스춰의한텍셀이나타내는영역의면적의몇배일까? 참고로원래주어진고해상도이미지의레벨은 0임. - 2009 년 6 월 27 일 ( 토 ) 오후 1:00 -
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (6/9) (b) 그림 7에서 a는픽셀에대한원상 (preimage) 의중점을가리키고, b부터 e까지는 a를포함하는주변텍셀의중심점을나타낸다. b, c, d, 그리고 e 지점의텍셀색깔이각각 (1, 1, 1), (1, 0, 0), (1, 1, 0), 그리고 (0, 1, 1) 이라고하자. 이때선형필터를사용할경우 a 지점에대하여계산되는색깔은무엇일까? 반드시계산과정을밝혀라 ( 이그림에서숫자는거리에대한비율을나타냄 ). (c) 그림 8(a) 는확대필터로 GL NEAREST와 GL LINEAR 중의하나를, 축소필터로는다음네가지필터중하나를사용하여렌더링한결과이다 ( 이과정에서서로다른레벨의텍스춰로서로다른색깔의이미지를사용하였음 ). GL NEAREST MIPMAP NEAREST GL LINEAR MIPMAP NEAREST GL NEAREST MIPMAP LINEAR GL LINEAR MIPMAP LINEAR 렌더링결과를볼때, 과연확대필터와축소필터로각각어떤필터를사용하였을까? (d) 그림 8(a) 을볼때, 과연확대상황이발생하고있을까? 예 / 아니오 로답하고, 아니라면그이유를, 그렇다면구체적으로어느부분에서확대상황이발생하고있는지간단한그림을사용하여정확히기술하라. (e) 같은그림에서육면체의왼쪽측면을보면서로다른색깔의텍스춰가적용되고있는데, 파란색과녹색의텍스춰중어떤색깔의텍스춰의레벨이더높은지, 그리고그이유를설명하라. (f) 그림 8(b) 는여섯개의사각형으로이루어진육면체의각면에대하여동일한텍스춰를적용하여렌더링한결과이다. 이 예에서는 [0, 1] [0, 1] 영역의텍스춰공간전체에대한텍스춰이미지를각사각형에적용되도록, 각사각형의꼭지점에텍스춰좌표를부여하였다. 반면에그림 8(c) 는다른렌더링인자는모두동일한상황에서, 텍스춰행렬스택만조작하여생성한결과이다. 즉다음과같은코드를적절히삽입하였는데, (A) 안에들어갈 OpenGL 문장 ( 들 ) 을기술하라. 이그림에서텍스춰가적용된이미지영역의크기가각방향반으로줄어들었고, 그중심은육면체각면의중심에해당한다. 여기서텍스춰랩 (wrap) 모드는 GL CLAMP임. glmatrixmode(gl TEXTURE); glpushmatrix(); (A) glmatrixmode(gl MODELVIEW);. glmatrixmode(gl TEXTURE); glpopmatrix(); (g) 마지막쪽의그림 9에서이문제와가장관련이깊은박스의기호를기술하라. 7. 다음은임의의광선 p(t) =o + td와세개의꼭지점으로구성된삼각형 T =(p 0, p 1, p 2 ) 와의교점을구해 ( 물론교차할경우 ), T 를기준으로하는 barycentric coordinates로표현해주는것에관한문제이다. 여기서각벡터의좌표값은다음과같고, 편의상 d의길이는 1임. o x d x p xi o = o y, d = d y, p i = p yi o z d z p zi (a) 이광선과삼각형의교점을 p(b 1,b 2 ) = (1 b 1 b 2 )p 0 + b 1 p 1 + b 2 p 2 와같이표 - 2009 년 6 월 27 일 ( 토 ) 오후 1:00 -
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (7/9) 현하려한다. 지금광선의출발점에해당하는 o로부터의거리에해당하는 t와교점의 barycentric coordinates에해당하는 b 1 과 b 2 를계산해야하는데, 이는아래와같이 3원 1차연립방정식을풀어해결할수있다. 이때 3행 3열행렬의 9개의원소 m 1, m 2,, m 9 의각값을정확히기술하라. m 1 m 2 m 3 t o x p x0 m 4 m 5 m 6 b 1 = o y p y0 m 7 m 8 m 9 b 2 o z p z0 (b) s = o p 0, e 1 = p 1 p 0, e 2 = p 2 p 0 라할때, 이연립방정식의해는다음과같이표현할수있다. 여기서 과 는각각벡터의내적 (inner product) 과외적 (cross product) 를나타냄. t (s e 1 ) e 2 b 1 = 1 (d e 2 ) e 1 (d e 2 ) s (s e 1 ) d b 2 이식을부주의하게프로그래밍할경우, 오버플로우에러가발생할수있다. 과연이런경우는기하학적으로어떠한상황에해당하는가? (c) 바로위문제에서 t, b 1, b 2 값을오버플로우에러없이계산을하였다고가정하자. 이경우과연각변수값이어떤범위의값을가질때, 광선과삼각형이교차한다고말할수있을까? (d) 3차원공간의두벡터 a와 b의외적 a b를계산하는데정확히몇번의 ( 덧셈 / 뺄셈 ), 곱셈, 그리고나눗셈연산이필요한지를밝혀라. 외적의계산식을통하여설명하고, 덧셈과뺄셈연산은같은연산으로취급할것. (e) 위의식을사용하여한광선과삼각형의교점을효율적으로계산하기위하여 t, b 1, b 2 를계산하는데소요되는 ( 덧셈 / 뺄셈 ), 곱셈, 그리고나눗셈연산의회수를기술하라. ( 주의 : 일반적으로나눗셈은연산비용이높으므로, 한벡터의각원소를동일한값으로나누어주는연산은일단그값으로나눗셈을한후벡터의각원소에곱해주는방식을취한다고가정 ). 8. 다음은임의의광선 p(t) =o + td와축에정렬된바운딩박스 (Axis-Aligned Bounding Box, AABB) 가교차하는지를판별해주는프로그램의일부이다. 이코드를보고답하라. float tx min, ty min, tz min; float tx max, ty max, tz max; float a = 1.0f/aa; if (a >= 0.0) { tx min = (x0 - p) * a; tx max = (x1 - p) * a; else { tx min = (x1 - p) * a; tx max = (x0 - p) * a; float b = 1.0f/bb; if (b >= 0.0) { ty min = (y0 - r) * b; ty max = (y1 - r) * b; else { ty min = (y1 - r) * b; ty max = (y0 - r) * b; float c = 1.0f/cc; if (c >= 0.0) { tz min = (z0 - q) * c; tz max = (z1 - q) * c; else { tz min = (z1 - oz) * c; - 2009 년 6 월 27 일 ( 토 ) 오후 1:00 -
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (8/9) tz max = (z0 - oz) * c; float t0, t1; if (tx min > tymin) t0 = (A) ; else t0 = (B) ; if (tz min > t0) t0 = (C) ; if (tx max < tymax) t1 = tx max; else t1 = ty max; if (tz max < t1) t1 = tz max; return (t0 < t1 && t1 > 0); (a) aa, bb, cc가각각광선의방향벡터 d의 x, y, z 좌표값을의미한다고할때, 문맥상눈의위치에해당하는 o의 x, y, z 좌표를위코드의변수를사용하여표현하라. (b) 문맥상 (A), (B), 그리고 (B) 에들어갈내용을 C 언어문법에맞게정확히기술하라. (c) 만약마지막문장이수행될때, t0 < t1이거짓이라면, 이는어떤상황에해당하는가? (d) 만약마지막문장이수행될때, t0 < t1는참이나 t1 > 0이거짓이라면, 이는어떤상황에해당하는가? 그림 9: Microsoft Direct3D 10 그래픽스파이프라인 (from Wikipedia) - 2009 년 6 월 27 일 ( 토 ) 오후 1:00 -
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (9/9) m 1 I λ = I aλ k aλ + f att (d) I li λ {k dλ (N L i )+k sλ (N H) n i=0 그림 5: 라이팅계산수식 (a) (b) (c) 그림 8: 텍스춰필터링 - 2009 년 6 월 27 일 ( 토 ) 오후 1:00 -
[CSE4170] (1/7) [CSE4170] : כ. כ.. 1.. (a) 1(a).. glmatrixmode(gl MODELVIEW); glpushmatrix(); gltranslatef(0.8, 0.7, 0.0); glrotatef(180.0, 0.0, 1.0, 0.0); glrotatef(-90.0, 1.0, 0.0, 0.0); glscalef(0.95, 0.95, 0.95); glmatrixmode(gl TEXTURE); // (A) glpushmatrix(); // (B) gltranslatef(-0.5, 0.0, 0.0); // (C) glscalef(2.0, 1.0, 1.0); // (D) draw object(&teapot); glpopmatrix(); // (E) glmatrixmode(gl MODELVIEW); // (F) glpopmatrix();. 2: GL CLAMP, draw object(&teapot);, 2 (s, t) כ 0 1 כ (-1.0, -1.0) כ. (A) (F),. (b) GL CLAMP GL REPEAT, (C) (D),. (c) 1(a) (b) (c),., 1.(a)? float ttt = 0.0; int mode = 1; void next(int t) { if (mode == 1) { if ((ttt += 0.1) >= 1.0) mode = -1; else { if ((ttt -= 0.1) <= -1.0) mode = 1; glutpostredisplay(); gluttimerfunc(500, next, 1); - 2008 6 18 ( ) 2:45 (AS412) - c 2008
[CSE4170] (2/7) (a) (b) (c) 1: 2. 3, Binary Space Partitioning Tree (BSPT)., BSPT TREE. LOS(TREE, A, B); כ 3 A B כ,. BSPT. typedef struct BSPT { Polygon *poly; struct BSPT *fchild; struct BSPT *bchild; BSPT; return 0; else { side f = LOS(T->fchild, start, end); side b = LOS(T->bchild, start, end); return (C) ; (a) 0 1 כ כ כ, 1, 0. (b) check(). (c) (A) (B) C. (d) (C) C. int LOS(BSPT *T, float *start, float *end) { int side s, side e, side f, side b; if (!T) return 1; side s = check(start,t->poly); side e = check(end,t->poly); if ((side s == BSPT FRONT) && (side e == BSPT FRONT)) { return LOS( (A), start, end); else if ((side s == BSPT BACK) && (side e == BSPT BACK)) { return LOS( (B), start, end); else { if (intersect(t->poly, start, end)) 3. programmable GPU. 3 4. (a) 3. (b) 3. (c) 3. (d) 3 OpenGL GL SRC ALPHA. (e) 3 OpenGL GL CCW. - 2008 6 18 ( ) 2:45 (AS412) - c 2008
[CSE4170] (3/7) A D B C E 3: NVIDIA GeForce 6 Series GPU (f) 90 OpenGL Gouraud, 4. (g) 4 H 3. (h), 3 4. 4.. (c S α S ) (c D α D ) S D (pre-multiplied color),. ( co α O ) = F S ( cs α S ) + F D ( cd α D (a) (0.6, 0.6, 0.6, 0.6), כ כ. (b) F S =1 α D F D =1 כ. ) 4: NVIDIA G80 specification (c) 5 F S F D? (d) 6 (a). (b). (A) (B) OpenGL ( (0.0, 0.0, 0.0, 0.0), draw rectangle(), כ ). GL ZERO, GL ONE, GL SRC ALPHA, GL DST ALPHA, GL ONE MINUS SRC ALPHA, - 2008 6 18 ( ) 2:45 (AS412) - c 2008
[CSE4170] (4/7) (a) S D 5: 1 6: GL ONE MINUS DST ALPHA (b) void blend(void) { glblendfunc(gl ONE, GL ZERO); draw rectangle(-2.0, 4.0, -2.0, 4.0, 1.0, 1.0, 1.0, 1.0); glblendfunc( (A), (B) ); draw rectangle(-3.5, 3.0, -3.5, 3.0, 1.0, 0.0, 0.0, 1.0); 5.. (a) 3 5? (b) 512 512 GL UNSIGNED BYTE GL RGBA כ? כ. (c) 7(a) a (preimage), b e a. b, c, d, e (1, 1, 1), (1, 0, 0), (1, 1, 0), (0, 1, 1). a?, כ. (d) 7(b) GL LINEAR MIPMAP LINEAR, GL NEAREST. כ, כ. (e) 7(c)., (trilinear interpolation filter)? /. 6. Cg API. Cg.. struct output { float4 X: TEXCOORD0; float3 Y: TEXCOORD1; float4 position: POSITION; ; output main(float4 A: POSITION, float4 B: NORMAL, uniform float4x4 ModelViewProj: state.matrix.mvp, uniform float4x4 ModelView: state.matrix.modelview, uniform float4x4 ModelViewIT: state.matrix. (4).invtrans) { output OUT; OUT.X = mul(modelview, A); // (1) OUT.Y = mul(modelviewit, B).xyz; // (2) OUT.position = mul(modelviewproj, A); // (3) return OUT; =============================== struct output { float3 color: COLOR; ; output main(float4 X: TEXCOORD0, float3 Y: TEXCOORD1, uniform float4 g a: state.lightmodel.ambient, uniform float4 lp: state.light[0].position, uniform float4 la: state.light[0].ambient, - 2008 6 18 ( ) 2:45 (AS412) - c 2008
[CSE4170] (5/7) b 1 a c texel 4 e 3 2 d pixel preimage (a) (b) (c) 7: uniform float4 ld: state.light[0].diffuse, uniform float4 ls: state.light[0].specular, uniform float4 ma: state.material.ambient, uniform float4 md: state.material.diffuse, uniform float4 ms: state.material.specular, uniform float me: state.material.shininess) { output OUT; OUT.color = g a * ma; float3 N = normalize(y); float3 L = normalize(lp - X); float NdotL = dot(n, L); if(ndotl >= 0.0) { // (5) OUT.color += ma * la; float3 What1 = normalize(-x); // (6) float3 What2 = normalize(l + What1); // (7) float NdotWhat2 = dot(n, What2); float4 li = lit(ndotl, NdotWhat2, me); float3 D = md * li.y; float3 S = ms * li.z; OUT.color += (8) ; return OUT; (a). OpenGL? OC, MC, WdC, CC, NDC, EC, WC 8:. (b). (1), (2), (3) כ,. (c) (4). כ. (d) ( ) (5) if כ. (e) (6) What1? (f) (7) What2? (g) (8) C. (h) 8 כ.. (i). - 2008 6 18 ( ) 2:45 (AS412) - c 2008
[CSE4170] (6/7). I λ = I aλ k aλ + I lλ {k dλ (N L)+k sλ (N H) n (j) 4 output main(). 7. Binary Space Partitioning Tree. 9 display bspt back to front() viewer[3], (back-to-front) bspt. (a) (A) C. BSPT FRONT BSPT BACK. (b) (B), (C), (D), (E) C. (c) bspt OpenGL. (F) C. (d), (back-to-front) (front-to-back),. 0.0, 1.0, 0.0); // (4) (b), M 1 M 2 M 3, M V. (c) C 0 =(e, u, v, n) =((000), (100), (010), (001)) C 1 = ((0 10 10), (0 0 1), (0 1 0), ( 1 00)). glmatrixmode(gl MODELVIEW); glloadidentity(); glmultmatrixf(cam.mat); gltranslatef( (A), (B), (C) ); i. (A), (B), (C). ii. cam.mat 4 4. 8.. (a) כ, 3.0. gllightfv(gl LIGHT0, GL POSITION, li pos);, (A), (B), (C). GLfloat li pos[4] = { (A), (B), (C), 1.0 ; // (1). glmatrixmode(gl MODELVIEW); // (2) glloadidentity(); // (3) glulookat(v[0], v[1], v[2], c[0], c[1], c[2], - 2008 6 18 ( ) 2:45 (AS412) - c 2008
[CSE4170] (7/7) typedef struct { int nv; // number of vertices float *vertex; // pointer to vertex data float *normal; // pointer to normal data float plane[4]; // plane equation Polygon; typedef struct bspt { // data structure for bspt Polygon *poly; struct bspt *fchild; // for the front side struct bspt *bchild; // for the back side BSPT; int check side(float *pos, Polygon *poly) { (A) BSPT *bspt; // object in BSPT float viewer[3]; // camera position. void display bspt back to front(bspt *bspt, float *viewer) { int viewer side; // (1) if (bspt == NULL) return; // (2) viewer side = check side(viewer, bspt->poly); // (3) if (viewer side == BSPT BACK) { // (4) display bspt back to front( (B), viewer); // (5) draw bspt poly(bspt->poly); // (6) display bspt back to front( (C), viewer); // (7) else { /* viewer side == BSPT FRONT */ // (8) display bspt back to front( (D), viewer); // (9) draw bspt poly(bspt->poly); // (10) display bspt back to front( (E), viewer); // (11) void display(void) { glblendfunc( (F) ); // (12) glenable(gl BLEND); // (13) glclear(gl COLOR BUFFER BIT GL DEPTH BUFFER BIT); // (14) display bspt back to front(bspt, viewer); // (15) glutswapbuffers(); 9: BSPT - 2008 6 18 ( ) 2:45 (AS412) - c 2008
43-170 (1/6) (43-170) : כ. כ.. 1.. (a) WC, M 1, M 2, M 3 M V כ. (b) (halfway vector)? (c),,? (d) OpenGL (back-face culling), OC,MC,WdC, CC, NDC, EC, WC. (e) (per-vertex operation) (per-pixel operation)? (f) (preimage)? (g), כ כ,? (h) OpenGL כ. i. depth buffering ii. view volume clipping iii. lighting computation in EC iv. texture mapping v. perspective transformation vi. back-face culling vii. blending (i) OpenGL. i. lighting ii. blending iii. perspective division iv. depth buffering v. texture mapping vi. viewport transformation 2.. S D. (c S α S ) (c D α D ) (pre-multiplied color), (c O α O ). ) ) ) ( co α O = F S ( cs α S + F D ( cd α D (a) כ (0.3, 0.3, 0.3, 0.3), כ. (b) 1 F S F D כ? (c) S over D, α O כ S D כ. (d) 2. M 0, M 1, M 2, M 0 C 0 1 α 0. M 1-2007 6 20 ( ) 3:00 -
43-170 (2/6) S D 1: 1 α 0 C 0 α 1 C 1 2: 2 α 2 =1.0 2 C C 1 1 α 1, M 2 C 2. M 0 M 1 (frontto-back order) α 01 כ. (e) M 0 M 1 C 01 כ,. C 0, C 1, C 01 RGB. (f) C 012. (g) test0() 3(a), (1) (2) RGB. ( : RGB כ 0 1 כ ) void test0(void) { glclearcolor(0.0, 0.0, 0.0, 0.0); glclear(gl COLOR BUFFER BIT); glenable(gl BLEND); glblendfunc(gl ONE, GL ZERO); rect(-2.0, 4.0, -2.0, 4.0, 0.0, 1.0, 0.0, 1.0); glblendfunc(gl SRC ALPHA, GL DST ALPHA); rect(-3.5, 3.0, -3.5, 3.0, 1.0, 0.0, 0.0, 1.0); rect(0.0, 4.8, -4.8, 2.0, 0.0, 0.0, 1.0, 1.0); gldisable(gl BLEND); void test1(void) { glclearcolor(0.0, 0.0, 0.0, 0.0); glclear(gl COLOR BUFFER BIT); glenable(gl BLEND); glblendfunc(gl ONE, GL ZERO); rect(-2.0, 4.0, -2.0, 4.0, 0.0, 1.0, 0.0, 1.0); glblendfunc((a), (B)); rect(-3.5, 3.0, -3.5, 3.0, 1.0, 0.0, 0.0, 1.0); gldisable(gl BLEND); (h) test1() 3(b), (A) (B) כ? ( (1), (2), (3) כ (0, 0, 0), (1, 0, 0), (0, 1, 0) ). GL ZERO, GL ONE, GL SRC ALPHA, GL DST ALPHA, GL ONE MINUS SRC ALPHA, GL ONE MINUS DST ALPHA void rect(glfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat R, GLfloat G, GLfloat B, GLfloat A) { glcolor4f(r, G, B, A); glbegin(gl QUADS); glvertex2f(l, b); glvertex2f(r, b); glvertex2f(r, t); glvertex2f(l, t); glend(); - 2007 6 20 ( ) 3:00 -
43-170 (3/6) (1) (3) (1) (1) (2) (2) (2) 3-3.5-2 4 0 4.8 x -3.5-2 4 3 x (a) test0() (b) test1() 3: 3.. (a) Phong כ. I λ = I aλ k aλ + m 1 i=0 f att (δ i ) I li λ {k dλ (N L i ) + k sλ (R V ) n ( N = L i = R = V =1),. (b) R כ ( כ ). (c) f att (δ i ) כ, δ i כ. (d) 4 Cg ( ). SomeMatrix כ. ModelView. (e) AnotherMatrix כ. (f) (A) Cg. (g) computer. ( ). (h) computer normalize(*) 1.? (i) normalize(*)? /. (j) sogang,? (k) float4 A = lit(a, b, c); lit() a, b, c כ A, A.x, A.y, A.z כ. ( : ) (l) diffuse כ. (m), OC, - 2007 6 20 ( ) 3:00 -
43-170 (4/6) b 1 4 e a 3 2 c d 5: texel pixel preimage MC, WdC, CC, NDC, EC, WC. (n) Phong ( )? /. 4. OpenGL. (a) 3 1? 0. (b) 5 a (preimage), b e a. b, c, d, e (1, 1, 1), (1, 0, 0), (1, 1, 0), (0, 1, 1). a? ( ). (c) 6(a) GL NEAREST GL LINEAR, ( ). GL NEAREST MIPMAP NEAREST, GL LINEAR MIPMAP NEAREST, GL NEAREST MIPMAP LINEAR, GL LINEAR MIPMAP LINEAR,? (d),?,. (e),,. (f) 6(b). [0, 1] [0, 1],. 6(c),., (A) OpenGL ( ).,. (wrap) GL CLAMP. glmatrixmode(gl TEXTURE); glpushmatrix(); (A) glmatrixmode(gl MODELVIEW);. glmatrixmode(gl TEXTURE); glpopmatrix(); - 2007 6 20 ( ) 3:00 -
43-170 (5/6) struct output { float4 position: POSITION; float4 ppp: TEXCOORD0; float3 nnn: TEXCOORD1; float3 L: TEXCOORD2; float3 H: TEXCOORD3; ; output main(float4 position: POSITION, float4 normal: NORMAL, uniform float4 light position, uniform float4x4 SomeMatrix, uniform float4x4 ModelView, uniform float4x4 AnotherMatrix) { output OUT; OUT.position= mul(somematrix, position); OUT.ppp = mul(modelview, position); OUT.nnn = normalize(mul(anothermatrix, normal).xyz); OUT.L = normalize(light position - OUT.ppp).xyz; float3 V = normalize( (A) ); OUT.H = normalize(out.l + V); return OUT; struct output { float3 color: COLOR; ; output main(float4 position: TEXCOORD0, float3 graphics: TEXCOORD1, float3 sogang: TEXCOORD2, float3 computer: TEXCOORD3, uniform float4 global ambient, uniform float4 light position, uniform float4 light ambient, uniform float4 light diff spec, uniform float4 mat ambient, uniform float4 mat diffuse, uniform float4 mat specular, uniform float mat shininess) { output OUT; OUT.color = global ambient * mat ambient; float3 G = normalize(graphics); float GdotS = dot(g, sogang); if(gdots >= 0.0) { OUT.color += mat ambient * light ambient; computer = normalize(computer); float GdotC = dot(g, computer); float4 lighting = lit(gdots, GdotC, mat shininess); float3 diffuse = mat diffuse * lighting.y; float3 specular = mat specular * lighting.z; OUT.color += light diff spec * (diffuse + specular); return OUT; 4: Cg - 2007 6 20 ( ) 3:00 -
43-170 (6/6) (a) (b) (c) 6: - 2007 6 20 ( ) 3:00 -
43-170 (1/8) (43-170) : כ. כ..,,, כ. 1.? 2.. (a),,. gllightfv(gl LIGHT0, GL POSITION, li pos);, (A), (B), (C) כ. GLfloat li pos[4] = {(A), (B), (C), 1.0 ;. glmatrixmode(gl MODELVIEW); glloadidentity(); glulookat(v[0], v[1], v[2], c[0], c[1], c[2], 0.0, 1.0, 0.0); (b), M 1 M 2 M 3, OpenGL glmultmatrixf() ( GLfloat m1, m2, m3, mi1, mi2, mi3 ). (c) (10.0, 0.0, 0.0). x, z, y., (D) (E) C/C++. glmatrixmode(gl MODELVIEW); glloadidentity(); glrotatef( (D) ); gltranslatef( (E) ); 3. p(t) =o + td T =(p 0, p 1, p 2 ) ( ), T barycentric coordinates כ. כ, d 1. o = o x o y o z, d = d x d y d z, p i = p xi p yi p zi (a) p(b 1,b 2 ) = (1 b 1 b 2 )p 0 + b 1 p 1 + b 2 p 2. o t barycentric coordinates b 1 b 2, 3 1. 3 3 9 m 1, m 2,, m 9 כ ( כ ). m 1 m 2 m 3 m 4 m 5 m 6 m 7 m 8 m 9 t b 1 b 2 = o x p x0 o y p y0 o z p z0 (b) s = o p 0, e 1 = p 1 p 0, e 2 = p 2 p 0,. (inner product) (cross product). t b 1 b 2 1 = (d e 2 ) e 1 (s e 1) e 2 (d e 2 ) s (s e 1 ) d - 2006 6 17 ( ) 3:00 -
43-170 (2/8),.? (c) t, b 1, b 2 כ. כ כ,? (d) 3 a b a b ( / ),, כ., כ. (e) t, b 1, b 2 כ ( / ),,. כ ( :, כ כ ). 4. 1. (a) ray (ray.eye[0], ray.eye[1], ray.eye[2]) (ray.dir[0], ray.dir[1], ray.dir[2]). ray hit SPHERE(*) obj->expr[0], obj->expr[1], obj->expr[2], obj->expr[3] כ. (b) ray hit SPHERE(*) obj ray t כ, -1 כ. A 1 כ, כ? (c) (X) C/C++. (d) ray hit SPHERE(*) line (1) line (4) כ. (, ),,. (e),,. (f) compute point and normal() pt[k] norm[k]. (Y) C/C++. 5. 2 Phong Cg (vertex shader). ModelViewProj, ModelView, ModelViewIT. (a) (X) Cg. (b) (Y) Cg. (c), 0?. (d), 3? ( כ ). 6. 3 m. (a). (b). - 2006 6 17 ( ) 3:00 -
43-170 (3/8) typedef enum { SPHERE, BOX, POLYHEDRON OBJECT TYPE; typedef struct object { OBJECT TYPE obj type; double *expr; double ka[3], kd[3], ks[3], n; struct object *next; OBJECT; OBJECT *obj list; typedef struct ray { double eye[3], dir[3]; RAY; RAY ray; #define SET RAY EYE ray.eye[0] = cam.e[0], ray.eye[1] = cam.e[1], ray.eye[2] = cam.e[2]; #define DOT PROD3(a, b, res) res = a[0]*b[0] + a[1]*b[1] + a[2]*b[2] double ray hit SPHERE(OBJECT *obj) { int k; double A, B, C, D, Dsqrt, t; double eminusg[3]; A = 1; for (k = 0; k < 3; k++) eminusg[k] = ray.eye[k] - obj->expr[k]; DOT PROD3(ray.dir, eminusg, B); B *= 2.0; DOT PROD3(eminusg, eminusg, C); C -= (X); D = B*B - 4.0*A*C; if (D < 0.0) return -1.0; // line (1) Dsqrt = sqrt(d); if ((t = 0.5*(-B - Dsqrt)/A) >= 0.0) return t; // line (2) if ((t = 0.5*(-B + Dsqrt)/A) >= 0.0) return t; // line (3) return -1; // Line (4) void compute point and normal(object *obj, double t, double *pt, double *norm) { int k; if (obj->obj type == SPHERE) { for (k = 0; k < 3; k++) { pt[k] = ray.eye[k] + t*ray.dir[k]; norm[k] = (Y); else void ray hit(object **this obj, double *t) { OBJECT *cur obj; double cur t; *this obj = NULL; *t = -1.0; for (cur obj = obj list; cur obj; cur obj = cur obj->next) { if (cur obj->obj type == SPHERE) cur t = ray hit SPHERE(cur obj); else if (cur t >= 0.0) { if (*t < 0.0) { *t = cur t; *this obj = cur obj; else if (cur t < *t) { *t = cur t; *this obj = cur obj; 1: - 2006 6 17 ( ) 3:00 -
43-170 (4/8) struct output { float4 position: POSITION; float4 a: TEXCOORD0; float3 b: TEXCOORD1; float3 A: TEXCOORD2; float3 B: TEXCOORD3; ; output main(float4 position: POSITION, float4 normal: NORMAL, uniform float4 light position, uniform float4x4 ModelViewProj, uniform float4x4 ModelView, uniform float4x4 ModelViewIT) { output OUT; OUT.position= mul((x), position); OUT.a = mul(modelview, position); OUT.b = normalize(mul(modelviewit, normal).xyz); OUT.A = normalize(light position - OUT.a).xyz; float3 V = normalize((y)); OUT.B = normalize(out.a + V); return OUT; 2: Phong m 1 I λ = I aλ k aλ + f att (d i ) I li λ {k dλ (N L i )+k sλ (R 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) 3: Phong - 2006 6 17 ( ) 3:00 -
43-170 (5/8) (c) (d i ). (d). (e) f att (d i ) כ כ, d i. (f) 4 Cg (pixel shader).,. 3 (2)? (g) float4 A = lit(a, b, c); lit() a, b, c כ A, A.x, A.y, A.z כ. ( : ) (h) 3 (2) diffuse כ. 7.. (a) OpenGL (back-tofront) (pre-multiplied color). S D (source color) (destination color), ρ S ρ D כ?. ( co α O ) = ρ S ( cs α S ) + ρ D ( cd 1 (b) (front-toback). ρ S ρ D כ?. ) ) ) ( co α O = ρ S ( αd C D α D ) +ρ D ( αs C S α S (c) test0() 5(a), (1) (2) RGB. ( : RGB כ 0 1 כ ) void rect(glfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat R, GLfloat G, GLfloat B, GLfloat A) { glcolor4f(r, G, B, A); glbegin(gl QUADS); glvertex2f(l, b); glvertex2f(r, b); glvertex2f(r, t); glvertex2f(l, t); glend(); void test0(void) { glclearcolor(0.0, 0.0, 0.0, 0.0); glclear(gl COLOR BUFFER BIT); glenable(gl BLEND); glblendfunc(gl ONE, GL ZERO); rect(-2.0, 4.0, -2.0, 4.0, 0.0, 1.0, 0.0, 1.0); glblendfunc(gl SRC ALPHA, GL DST ALPHA); rect(-3.5, 3.0, -3.5, 3.0, 1.0, 0.0, 0.0, 1.0); rect(0.0, 4.8, -4.8, 2.0, 0.0, 0.0, 1.0, 1.0); gldisable(gl BLEND); void test1(void) { glclearcolor(0.0, 0.0, 0.0, 0.0); glclear(gl COLOR BUFFER BIT); glenable(gl BLEND); glblendfunc(gl ONE, GL ZERO); rect(-2.0, 4.0, -2.0, 4.0, 0.0, 1.0, 0.0, 1.0); glblendfunc((a), (B)); rect(-3.5, 3.0, -3.5, 3.0, 1.0, 0.0, 0.0, 1.0); gldisable(gl BLEND); (d) test1() 5(b), (A) (B) כ? ( (1), (2), (3) כ (0, 0, 0), (1, 0, 0), (0, 1, 0) ). GL ZERO, GL ONE GL SRC ALPHA, GL DST ALPHA, - 2006 6 17 ( ) 3:00 -
43-170 (6/8) struct output { float3 color: COLOR; ; output main(float4 position: TEXCOORD0, float3 normal: TEXCOORD1, float3 L: TEXCOORD2, float3 H: TEXCOORD3, uniform float4 global ambient, uniform float4 light position, uniform float4 light ambient, uniform float4 light diff spec, uniform float4 mat ambient, uniform float4 mat diffuse, uniform float4 mat specular, uniform float mat shininess) { output OUT; OUT.color = global ambient*mat ambient; float3 N = normalize(normal); float NdotL = dot(n, L); if (NdotL >= 0.0) { OUT.color += mat ambient*light ambient; H = normalize(h); float NdotH = dot(n, H); float4 lighting = lit(ndotl, NdotH, mat shininess); float3 diffuse = mat diffuse*lighting.y; float3 specular = mat specular*lighting.z; OUT.color += light diff spec*(diffuse + specular); return OUT; 4: Phong (1) (3) (1) (1) (2) (2) (2) 3-3.5-2 4 0 4.8 x -3.5-2 4 3 x (a) test0() (b) test1() 5: - 2006 6 17 ( ) 3:00 -
43-170 (7/8) GL ONE MINUS SRC ALPHA, GL ONE MINUS DST ALPHA 8. OpenGL. (a) 0( ) 3? (b) 6(a) a (preimage), b e a. b, c, d, e (1, 1, 1), (1, 0, 0), (1, 1, 0), (0, 1, 1). a? ( ). (c) 6(b) GL LINEAR, GL NEAREST.,?? (d) 6(c)., GL LINEAR MIPMAP NEAREST, GL LINEAR MIPMAP LINEAR? (f) Phong, Phong? (g)? (h), W כ 1 כ? 9. 7 NVIDIA GeForce 6 Series GPU. (A, B, C, D, E ). (a) OpenGL glblendfunc()? (b)? (c)? (d)? (e) OpenGL gluperspective()? - 2006 6 17 ( ) 3:00 -
43-170 (8/8) b 1 a c texel 4 e 3 2 d pixel preimage (a) (b) (c) 6: A D B C E 7: NVIDIA GeForce 6 Series GPU - 2006 6 17 ( ) 3:00 -
43-170 (1/8) (43-170) : כ. כ.. WC,,, כ. 1. 1. 3 OpenGL. (a) 1? כ. (b) 1 Mw 1 T(x, y, z), S(x, y, z), R(a, x, y, z),,. (c) 3 Line (a) Line (b) ( x y, ). (d) draw car() 2, draw wheel and nut() draw nut() (wheel 0 nut 0 ) ( ). כ. T(x, y, z), S(x, y, z), R(a, x, y, z),, כ. 0 1 2 3 M w M w M w M w M M n0 M 1 n M 4 n0 M 1 n M M 4 n n n0 M 1 n M M 4 n n0 M 1 n M 4 n 0 1 4 0 1 4 0 1 4 0 1 4 M b 0 1 2 3 1: (e) 3. N M 2: - 2005 6 13 ( ) 6:30 -
43-170 (2/8) void draw wheel and nut(float angle) { int i; draw wheel(); for (i = 0; i < 5; i++) { glpushmatrix(); glrotatef(72.0*i, 0.0, 1.0, 0.0); gltranslatef(rad-0.5, 0, ww); // rad = 1.7, ww = 1.0 draw nut(); glpopmatrix(); void draw car(void) { float angle y = 0.0, angle z = 0.0; angle y = wheel rot angle in y(); angle z = wheel rot angle in z(); draw body(); glpushmatrix(); gltranslatef(-3.9, -3.5, 4.5); glrotatef(angle y, 0.0, 1.0, 0.0); // Line (a) glrotatef(angle z, 0.0, 0.0, 1.0); // Line (b) draw wheel and nut(angle y); // wheel 0 glpopmatrix(); glpushmatrix(); gltranslatef(3.9, -3.5, 4.5); glrotatef(angle z, 0.0, 0.0, 1.0); draw wheel and nut(0.0); // wheel 1 glpopmatrix(); // draw wheel 2 here // draw wheel 3 here 3: - 2005 6 13 ( ) 6:30 -
43-170 (3/8) 2.. m 4. S D D S I λ = I aλ k aλ m 1 + f att (d i ) I li λ {k dλ (N L i ) i=0 + k sλ (N H i ) n (a) I aλ, k aλ, d i, I li λ, k dλ, N, L i, k sλ, H i, n. (b). (c). (d) H i?. (e),, כ. (f) 4 כ? (g) 4(b) MC, WC, EC, CC, NDC, WdC OpenGL? (h) 4(b) N L i, כ. כ? כ? (i) n /? (j) Line (a). (k) Line (b) specular כ. 3. (blending). A B (a) A (b) B 5:. (c A α A ) (c B α B ) (pre-multiplied color). F A F B A B α A α B O,. ( co α O ) = F A ( ca α A ) + F B ( cb α B (a),,, A over B F A F B? (b) A, B, C, D, E, F A over B over C over D over E over F. over, over. (Hint: (a + b) + c = a + (b + c)). (c) (front-to-back). RGBA (c D α D )=(α D C D α D ) (c S α S )=(α S C S α S ). 5 A B כ? (d) (c O α O )=(α O C O α O ) α O. ) - 2005 6 13 ( ) 6:30 -
43-170 (4/8) struct output { float4 position: POSITION; float4 pec: TEXCOORD0; float3 nec: TEXCOORD1; ; output main(float4 position: POSITION, float4 normal: NORMAL, uniform float4x4 ModelViewProj, uniform float4x4 ModelView, uniform float4x4 ModelViewIT) { output OUT; OUT.position= mul(modelviewproj, position); OUT.pEC = mul(modelview, position); OUT.nEC = mul(modelviewit, normal).xyz; return OUT; (a) struct output { float3 color: COLOR; ; output main(float4 position: TEXCOORD0, float3 normal: TEXCOORD1, uniform float nv flag, uniform float4 global ambient, uniform float4 light position, uniform float4 light ambient, uniform float4 light diff spec, uniform float4 mat ambient, uniform float4 mat diffuse, uniform float4 mat specular, uniform float mat shininess) { output OUT; OUT.color = global ambient * mat ambient; float3 N = normalize(normal); float3 L = normalize(light position - position); float NdotL = dot(n, L); if (NdotL >= 0.0) { OUT.color += mat ambient * light ambient; float3 V = normalize(-position); float3 H = normalize( ); // Line (a) float NdotH = dot(n, H); float4 lighting = lit(ndotl, NdotH, mat shininess); float3 diffuse = mat diffuse * lighting.y; float3 specular = mat specular * lighting.z; OUT.color += light diff spec * (diffuse + specular); // Line (b) return OUT; (b) 4: - 2005 6 13 ( ) 6:30 -
43-170 (5/8) (e) ( ) C O α D, α S, C D, C S. (f) OpenGL, (source factor) (destination factor) כ? כ. GL ZERO, GL ONE GL SRC ALPHA, GL DST ALPHA, GL ONE MINUS SRC ALPHA, GL ONE MINUS DST ALPHA (g) 6. BRICK NAGEL RGBA, BRICK A כ 1.0. NAGEL כ A 0.0, 1.0. NAGEL ( A כ 1.0 ) BRICK,. glblendfunc(*, *);. draw NAGEL image(); glenable(gl BLEND); glblendfunc(, ); draw BRICK image(); gldisable(gl BLEND); 4. NVIDIA R. Fernando Programming Graphics Hardware.. Texture filtering is used to compute the color of a screen pixel based on its footprint in the texture map. A pixel of the texture map is usually referred as a (A). When a screen pixel covers one (A) or less - texture (B) -, its color is taken as the closest (A) from the pixel s footprint center, or is computed by (C) filtering, that (a) BRICK (c) 6: (b) NAGEL is (C) interpolation of the four closest (A)s. When it covers several (A)s - texture (D) -,(E) is the preferred solution: Precomputed lower resolution versions of the original texture map - called (F) levels - are stored along with the full resolution version and the right (F) level is selected to come down back to the (B) case. (G) filtering is when (C) filtering is performed twice based on two consecutive (F) levels and the results are averaged together. In addition to the filtering method, (H) filtering can also be optionally selected when performing a texture lookup. (H) filtering increases quality for the cases where the pixel s footprint is elongated in one direction: It consists in performing the filtering computations above at several points in the pixel s footprint along this direction. 5.. (a) 7 η 1 1 I η 2 2, Snell T ( I, N, M, T 1 ). θ 1-2005 6 13 ( ) 6:30 -
43-170 (6/8) c 1 N M refracted T N -N I perf -I 7: T incident, θ 2 sin θ 2 כ כ (I, N, η 1, η 2, θ 1 כ ). (b) T T =sinθ 2 M cos θ 2 N, cos θ 2 כ η 1, η 2, cos θ 1 כ (M N ). (c) 8. ray (ray.eye[0], ray.eye[1], ray.eye[2]) (ray.dir[0], ray.dir[1], ray.dir[2]). ray hit SPHERE(*) obj->expr[0], obj->expr[1], obj->expr[2], obj->expr[3] כ. (d) Line (a) C/C++. (e) ray hit SPHERE(*) obj ray t כ, -1 כ. Line (b) A 1 כ כ,. (f) Line (c) C/C++. (g) Line (d) C/C++. 6. 9 NVIDIA GeForce 6 Series. (A, B, C, D, E ). (a)? (b)? (c)? (d)? (e)? (f) Hierarchical modeling? (g) Depth buffering? (h) fixed-function pipeline 90 OpenGL? (i) OpenGL כ? (j) 3 כ? (k) OpenGL GL LINEAR MIPMAP LINEAR? - 2005 6 13 ( ) 6:30 -
43-170 (7/8) typedef enum { SPHERE, BOX, POLYHEDRON OBJECT TYPE; typedef struct object { OBJECT TYPE obj type; double *expr; double ka[3], kd[3], ks[3], n; struct object *next; OBJECT; OBJECT *obj list; typedef struct CAMERA cam; camera { double e[3], u[3], v[3], n[3]; double fovy, aspect; CAMERA; typedef struct window { int w, h; double d; double wc[3], wh, ww; double a[3], b[3], c[3]; unsigned char *pixmap; WINDOW; WINDOW win; typedef struct RAY ray; ray { double eye[3], dir[3]; RAY; #define SET RAY EYE ray.eye[0] = cam.e[0], ray.eye[1] = cam.e[1], ray.eye[2] = cam.e[2]; #define DOT PROD3(a, b, res) res = // Line (a) double ray hit SPHERE(OBJECT *obj) { int k; double A, B, C, D, Dsqrt, t; double eminusg[3]; A = 1; // Line (b) for (k = 0; k < 3; k++) eminusg[k] = ray.eye[k] - obj->expr[k]; DOT PROD3(ray.dir, eminusg, B); B *= ; // Line (c) DOT PROD3(eminusg, eminusg, C); C -= obj->expr[3]*obj->expr[3]; D = B*B - 4.0*A*C; if (D < 0.0) return -1.0; Dsqrt = sqrt(d); if ((t = 0.5*(-B - Dsqrt)/A) >= 0.0) return t; if ((t = 0.5*(-B + Dsqrt)/A) >= 0.0) return t; ; // Line (d) void ray hit(object **this obj, double *t) { OBJECT *cur obj; double cur t; *this obj = NULL; *t = -1.0; for (cur obj = obj list; cur obj; cur obj = cur obj->next) { if (cur obj->obj type == SPHERE) cur t = ray hit SPHERE(cur obj); elsẹ. if (cur t >= 0.0) { if (*t < 0.0) { *t = cur t; *this obj = cur obj; else if (cur t < *t) { *t = cur t; *this obj = cur obj; 8: - 2005 6 13 ( ) 6:30 -
43-170 (8/8) A D B C E 9: NVIDIA GeForce 6 Series Architecture - 2005 6 13 ( ) 6:30 -
43-170 (1/4) (43-170) : 1.. (a) OpenGL? (b) OpenGL? (c) OpenGL : depth test, backface culling, viewing transform, perspective division, texture mapping (d) NVIDIA GeForceFX programmable GPU,? (e) programmable GPU כ? (f) 6 BSPT Quake 3 BSPT,. (g) BSPT (frontto-back) (sorting). BSPT n, כ? (h)? (i). כ, כ? (j) (preimage)? 2. 1 E. Haines Real-Time Rendering. 3. / (Application A, Geometry G, Rasterizer R ). (a) Pixel shader (b) BSPT (c) Blending (d) Perspective division (e) Viewing transformation (f) Collision detection (g) Vertexshader (h) Texture mapping (i) Depth buffering (j) Backface culling 3.. (a). GLfloat li pos[4] = f(a), (B), (C), 1.0 g;. glmatrixmode(gl MODELVIEW); glloadidentity(); glulookat(v[0], v[1], v[2], c[0], c[1], c[2], 0.0, 1.0, 0.0);,. gllightfv(gl LIGHT0, GL POSITION, li pos); - 2004 6 18 2:00 -
43-170 (2/4) 1:, (A), (B), (C). (b), M 1! M 2! M 3, OpenGL glmultmatrixf() ( GLfloat m1, m2, m3, mi1, mi2, mi3. ). (c) (10:0; 0:0; 0:0). y, x, z., (A) (B). glmatrixmode(gl MODELVIEW); glloadidentity(); glrotatef( (A) ); gltranslatef( (B) ); 4.. S D. (c S ff S ) (c D ff D ) (pre-multiplied color) S D 2: 1.. ψ! ψ ψ c O = F S + F D ff O! c S ff S! c D ff D (a) (0:8; 0:0; 0:0; 0:8), כ כ? (b) F S = 1 ff D F D = 1 כ. (c) 2 F S F D? (d) 3 (a). (b) 4. (A) (B) OpenGL ( (0.0, 0.0, 0.0, 0.0) ). - 2004 6 18 2:00 -
43-170 (3/4) (a) (b) 3: 2 void blend(void) f glblendfunc(gl ONE, GL ZERO); draw rectangle(-2.0, 4.0, -2.0, 4.0, 1.0, 1.0, 1.0, 1.0); glblendfunc( (A), (B) ); draw rectangle(-3.5, 3.0, -3.5, 3.0, 1.0, 0.0, 0.0, 1.0); g 4: GL ZERO, GL ONE, GL SRC ALPHA, GL DST ALPHA, GL ONE MINUS SRC ALPHA, GL ONE MINUS DST ALPHA display bspt back to front() viewer[3], (back-to-front) bspt. 5.. (a),, כ. (b),, כ. (c) (2:0; 3:0; 1:0) ( 2:0; 4:0; 1:0), (0:0; 0:0; 0:0) P N (0:0; 1:0; 0:0), R כ ( ). (d). X m 1 I = I a k a + f att (d) I li fk d (N i L i )+k s (N i H i ) n g i=0 6. Binary Space Partitioning Tree. 5 (a) (A) C. BSPT FRONT BSPT BACK. (b) (B), (C), (D), (E) C. (c) bspt OpenGL. (F) C. - 2004 6 18 2:00 -
43-170 (4/4) typedef struct f int nv; // number of vertices float *vertex; // pointer to vertex data float *normal; // pointer to normal data float plane[4]; // plane equation g Polygon; typedef struct bspt f // data structure for bspt Polygon *poly; struct bspt *fchild; // for the front side struct bspt *bchild; // for the back side g BSPT; int check side(float *pos, Polygon *poly) f (A) g BSPT *bspt; // object in BSPT float viewer[3]; // camera position. void display bspt back to front(bspt *bspt, float *viewer) f int viewer side; if (bspt == NULL) return; viewer side = check side(viewer, bspt->poly); if (viewer side == BSPT BACK) f display bspt back to front( (B), viewer); draw bspt poly(bspt->poly); display bspt back to front( (C), viewer); g else f /* viewer side == BSPT FRONT */ display bspt back to front( (D), viewer); draw bspt poly(bspt->poly); display bspt back to front( (E), viewer); g g void display(void) f glblendfunc( (F) ); glenable(gl BLEND); glclear(gl COLOR BUFFER BIT GL DEPTH BUFFER BIT); display bspt back to front(bspt, viewer); glutswapbuffers(); g 5: BSPT - 2004 6 18 2:00 -
"f"f"fy y y @/@/@/ <Æ <Æ <Æ /BN/BN/BNõΦõΦõΦ@/@/@/ <Æ <Æ <Æ ( ( ( ÉÓÉÓÉÓ' ' ' <Æ <Æ <ÆõΦõΦõΦ 43-170 lfflfflff í í í ( ( ( ÉÓÉÓÉÓ' ' ' Õ Õ Õ AνAνAνi Λi Λi ΛÛ Û Û lfflfflff ú ú ú ± ± ± (1/4) lff í ( ÉÓ' Õ Aνi ΛÛ (43-170) lff ú ± à à à : "fy @/ <Æ ( ÉÓ' <ÆõΦ e ffξ $íω 1. 6 ëνh]j ú fl Λ. (a) OpenGL fi sffáôλ ffξ "f ; x_ffi "îω 4Sq >ρíss sffã ' & fflh a >ρ fflh? (b) 6 E$ ffi8a A ρξíss ` OpenGL fi sffáôλ ffξ "fã ' & fflhíνh"f@/ Ð P±fl Λ. (1) AνÛ ' o, (2)ÂÓeçΩ μξ 8, (3)Λ sff h A >ρíss, (4)%7 Û 2X BνiçΩ (c) 6 E$ ffi8a A ρξíss ` OpenGL fi sffáôλ ffξ "fã ' & fflhíνh"f@/ Ð P±fl Λ. (1) %7 Û 2X BνiçΩ, (2)ÂÓeçΩ ^ffi @/ ô»ç ]X±éSS, (3) Ò o ú D +Ë(blending), (4) U sff!q( a A (d) OpenGL E$ ffi8a A fi sffáôλ ffξ "f %7 Û 2X BνiçΩ Ñ t Ð ffflëχq[ t#q fflh áôaνõ ΞàÔ $íωfl fflh 4 tff &ñω Ð fflh Á %ÁΨ ffξ? (e) 6 Õ Aνi ΛÛ >ρíss Πæ OpenGL fi sffáô Λ ffξ "f & sff &#Q e tff ú Ér >ρíss ` P±fl Λ. (1) ; x_ffi "îω 4Sq_ffi &hλ6 x, (2) BSPT >ρíss, (3) Πæ[ρt ffi ±, (4) Ér μξ ]jfi, (5)%7 Û 2X a _ffi μξ 8, (6)ÈÒ%òΩ μξ 8 (f) = Gtff&h Z>± ρξíss (per-vertex operation)õφ i Λ!sqZ>± ρξíss (per-pixel operation)_ffi ffiâω>ρ & fflh E$ ffi8a A ρξíss Ér Á %ÁΨ ffξ? (g) %7 Û 2X è S!ν "f jφ»h 9±' Ð sff Ξ+ A 9±' a%~ Ér ffiμ±õφ ú fflh fl fflhx<, è_ffi &ñω d Kν4R õφ ρξ Õ χq +Éffi? ú ` ú fl Õ sffä [O±"îΩfl Λ. 2. 6 Ér ΏBjΛ _ffi 'aô»ç ëνh]jsff. (a) ílff Iν, 7 ΏBjΛ áôyue sff èνh a >ρ a õφ 9±uff &#Q e fflh Iν "f, ΏBj Λ Λ fflh Óüt^ @/fl # M 1 M 2 M 3 íνh"f Ð μξ 8 ` fl %i μξ, Õ ffiâωä ÂÓeçΩ μξ 8 ` KνÅÒ fflh OpenGL ï $íωfl Λ (0A_ffi [j ' >= Ér y y GLfloat ff 9Φ_ffi í ffξ' μξã m1, m2, m3 offvff fflh /BM $ &#Q e, Õ ' >=[ t_ffi %iλ' >= Ér y y mi1, mi2, mi3 offvff fflh/bm $ &#Q e 6. ). Õ aë> 2: Λ sffh A >ρíss (b) ílff Iν Ð ÅÒ#Q ffξ ΏBjΛ C 0 = ((000),(100),(010),(001)) ffξ Ώ BjΛ ± 6 xφ ` : xfl # C 1 = (( 1000),(0 0 1), (010),(1 0 0))ü< ú Ér Iν Ð μξ 8 sff &%3 ` M:_ffi Aνü< ú Ér ÂÓeçΩ μξ 8 ï Òqty fl Φ. glmatrixmode(gl MODELVIEW); glloadidentity(); glmultmatrixf(cam.mat); gltranslatef((a), (B), (C)); i. (A), (B), Õ off (C) [ t#q ú?/6 x Ér? ii. `ffi Π Ér μξ 8 ` 0Afl # cam.matsff$ Kν» +É 4' 4 P± μξ 8 ' >= Ér? 3. 6 Ér Λ sffh A >ρíss 'aô»ç ëνh]jsff. (a) &h Ffig"é, îω' Ffig"é, Õ off ìfiríss Ffig"é ` qff +É M: >ρíss qff6 xsff Zρ Ér ffi ΨÜ ÐÂÒ' ú ÉríνH"f Ð P±fl Λ. (b) ; x I%sff`çΩ, e Ï?@ I%sff`çΩ, Õ off Ä χq I%sff`çΩ` qff +É M:>ρíSS qff6 xsff Zρ Ér ffi Ψ Ü ÐÂÒ' ú ÉríνH"f Ð P±fl Λ. (c) 0A_ffi [j tff I%sff`çΩ ~ ÓZOΦ Πæ LERPõΦ 'a>ρ &hλ Ér ffi Ψ Ér? (d) Õ aë> 1_ffi d Λ "fsff ô»ç ÂÒìfir` tff&hλfl `ffi >ß 5gΛ. (e) Õ aë> 2 fflh Õ aë> 1_ffi d Λ_ffi #Q "Ξ μξã ü< 'a μξsff U ` ffi? (f) Õ aë> 1_ffi d Λ "fώbjλ "fπ Λ Ð fflh ~ Ó Ó %òω Ó` ~ÃÎ fflh μξã P±fl Λ. - 2003 ffiξ 6 Z4 17 9± Êê 7:00 -
"f"f"fy y y @/@/@/ <Æ <Æ <Æ /BN/BN/BNõΦõΦõΦ@/@/@/ <Æ <Æ <Æ ( ( ( ÉÓÉÓÉÓ' ' ' <Æ <Æ <ÆõΦõΦõΦ 43-170 lfflfflff í í í ( ( ( ÉÓÉÓÉÓ' ' ' Õ Õ Õ AνAνAνi Λi Λi ΛÛ Û Û lfflfflff ú ú ú ± ± ± (2/4) m 1 I λ = I aλ k aλ + f att (d) I li λ {k dλ (N L i )+k sλ (N H) n i=0 Õ aë> 1: Λ sffh A >ρíss à d Λ (g) Õ aë> 1_ffi d Λ "f Óüt^ _ffi 0Auffü< ~ Ó Ósff Π 7fl%3 ` M: %òω Ó` ~ÃÎ fflh μξã P± fl Λ. 4. 6 Ér Ò o ú D +Ë 'aô»ç ëνh]jsff. _ffi sffpfftff Aü< B_ffi +Ë$íΩ @/fl # Òqty fl Φ. (c A α A )ü< (c B α B ) sffpfftff_ffi @/6 x & fflh o è_ffi pffoff Y Lô»ÇÒ o ú (pre-multiplied color)sff Λ fl Φ. F A ü< F B y y Aü< B_ffi o è "f_ffi α A ü< α B _ffi qffö± Ð >rfνfl fflh pffwnφφ [ t Πæ ffiμ±õφ sffpfftff O ú z fflh pffwnφφ _ffi qffö± sffλ fl μξ, +Ë$íΩ_ffi ffiμ±õφ Òqt$íΩ & fflh pffoff Y Lô»ÇÒ o ú Ér 6 õφ ú. ( co α O ) = F A ( ca α A ) + F B ( cb α B (a) ëss F A = α B sff F B =1 α A 9± ffiâωä #Q* ô»ç ~ Ód ΛÜ Ðsffpfftff +Ë$íΩsff & fflhtff [O±"îΩfl Λ. sffä lffõüt +Éffi Ψ. (b) ÈÒ"îΩô»Ç Óüt^ E$ ffi8a Afl fi, îss >h 1px_ffi lff òõφ, %7 Û 2X_ffi D +Ë, Φ pwffî qoff#qdçω lffzoφ[ t` & fl fflhx<ä 6 xfl >ß± 6 xsff & fflh A over B ρξíss _ffi ffiâωä F A ü< F B fflh y y O±Ξ ffξ? (c) #Q "Ξ i Λ!sq_ffi pffoff Y Lô»Ç Ò o ú sff (0.5, 0.5, 0.5, 0.5)sffΛ μξ, sff i Λ!sq Ér #Q "Ξ RGB Ò o ú Ð#Qb G>ß 9±Kν4R e fflh Iν ffξ? (d) çss ÈÒ"îΩô»Ç Óüt^ [ t` ΏBjΛ lffïfirü Ð fl # +' e fflh ffi ΨÂÒ' rff fl # ú Ü Ð μξ"f Ψ YV@/ Ð Õ χ9åòχ9 ô»ç. OpenGL_ffi Ò o ú D +Ë lff0px` ± 6 xfl χ9 +É M:, "é rff ffξφ (source factor)ü< 3lq&hΛ ffξ Φ (destination factor) Ð #Q "Ξ ú ` ± 6 x Kν» +Éffi? 6 ú [ t Πæ &hλ]x±ô»ç ffξφ Ξ fl Λ. GL ZERO, GL ONE GL SRC ALPHA GL DST ALPHA GL ONE MINUS SRC ALPHA GL ONE MINUS DST ALPHA 5. 6 Ér %7 Û 2X 9±' a A 'aô»ç ëνh]jsff. ) - 2003 ffiξ 6 Z4 17 9± Êê 7:00 - (a) YU6 2_ffi x9φë s %7 Û 2X_ffi ô»ç %7!sqsff ff?/ fflh %òω%iλ_ffi μξ&hλ Ér YU6 5_ffi x9φë s %7 Û 2X_ffi ô»ç %7!sqsff ff?/ fflh %òω%iλ_ffi μξ&hλ_ffi Y>fi Cν 9±ffi? (b) Kν 512 512sff y %7!sq GL UNSIGNED BYTEü< GL RGBA + Ad Λ` ± 6 xfl fflh %7 Û 2X sffpfftff @/fl # fflh 0pxô»Ç YU6 @/fl # x9φë s` $íω +É ffiâω Ä O±Ξ ëss pu_ffi %7 Û 2X Bj off 9± +É ffi (>ρíss õφ&ñω` lffõüt +Éffi Ψ)? (c) Õ aë> 3(a) "f a fflh i Λ!sq @/ô»ç "é (preimage)_ffi Πæ&h ` offvff, bâò' effi tff fflh a í <Êfl fflh ÅÒ μξ %7!sq_ffi Πæd &h ` ff p. b, c, d, Õ off e tff&h _ffi %7!sq Ò o ú sff y y (1, 1, 1), (1, 0, 0), (1, 1, 0), Õ off (0, 1, 1)sffΛ fl Φ. y y jφ»h 9±' ü< Ξ+ A 9±' ± 6 x +É ffiâωä a tff&h @/fl # >ρíss & fflh Ò o ú Ér Á %ÁΨsff cffi?, 9± fl μξ ì Íì Íì Í rffrffrff >ρíss õφ&ñω` 1SS) Λ. (sff Õ aë> "f ÕüwΦ fflh fi off @/ô»ç qffö± ` ff ÍÇr.) (d) Õ aë> 3(b) fflh è 9±' fflh GL LINEAR MIPMAP LINEAR, SX @/ 9±' fflh GL NEAREST ± 6 xô»ç ffiâωä _ffi E$ ffi8a A ffiμ±õφsff. õφ ρξ sff Õ aë>_ffi S!ν Ér è S!νsff 1ÏÒqtô»Ç ffi Ψ ffξtff, mff μξ SX @/ S!νsff 1ÏÒqtô»Ç ffi Ψ ffξtff ^ &hλü Ð lffõüt fl Λ. (e) Õ aë> 3(c) fflh è S!νsff 1ÏÒqtô»Ç ffiâωä sff. "f Ð Ér YU6 _ffi x9φë s %7 Û 2X @/ Kν"f "f Ð Ér Ò o ú _ffi %7 Û 2X sffpfftff ± 6 xfl %i fflhx<, õφ ρξ sffõ aë> Ér Ξ+ A 9± ' (trilinear interpolation filter) ± 6 xô»ç ffiμ±õφλ +É Ã e fflh? V/ mff Ð ú fl Õ XO >ß ú ô»ç sffä 1SS) Λ.
"f"f"fy y y @/@/@/ <Æ <Æ <Æ /BN/BN/BNõΦõΦõΦ@/@/@/ <Æ <Æ <Æ ( ( ( ÉÓÉÓÉÓ' ' ' <Æ <Æ <ÆõΦõΦõΦ 43-170 lfflfflff í í í ( ( ( ÉÓÉÓÉÓ' ' ' Õ Õ Õ AνAνAνi Λi Λi ΛÛ Û Û lfflfflff ú ú ú ± ± ± (3/4) b 1 a c texel 4 e 3 2 d pixel preimage (a) (b) (c) Õ aë> 3: %7 Û 2X 9±' a A 6. 6 Ér Binary Space Partitioning Tree (BSPT) 'aô»ç ëνh]jsff. Õ aë> 4_ffi <Êà display bspt back to front() fflh rff&h _ffi 0A uff viewer[3] ÅÒ#Q& ` M:, +' "f ú Ü Ð(back-to-front) μξ"f bspt_ffi y + A[ t` Õ χ9åò fflh <Êà sff. (a) (A) [ t#q ú C ï fflh Á %ÁΨ 9±ffi? (b) (B), (C), (D), (E) [ t#q ú C ï fflh Á %ÁΨ 9±ffi? (c) #Q "Ξ BSPT n>h_ffi y + AÜ Ð $íω sff &#Q e ` ffiâωä, sff BSPT_ffi Zρ sff(height) fflh j è O±Ξ "f j@/ O±Ξ ffi tff 0pxô»Ç? Big-Olff ñ ± 6 xfl # lff Õütfl Λ. (d) los() <Êà fflh start tff&h e fflh ± ÃÐsff end tff&h _ffi ± ÃÐ` ^ffi à e fflhtff ffiμ±&ñωkν ÅÒ fflh <Êà Ð"f, ^ffi à e Ü μξ 1 ú `, Õ off ^ffi à OflÜ μξ 0 ú ` off Ξ Kνïfir. # lff "f ëνhð o <Êà AAA() fflh #Q "Ξ ffiâωä #Q "Ξ ú ` off ΞKνÅÒ fflh <Êà 9±ffi? (e) sff <Êà "f (F)ü< (G) [ t#q ú C ï fflh Á %ÁΨ 9±ffi? (f) sff <Êà "f ú 3lw )a ÂÒìfir` tff&hλfl 5gΛ. - 2003 ffiξ 6 Z4 17 9± Êê 7:00 -
"f"f"fy y y @/@/@/ <Æ <Æ <Æ /BN/BN/BNõΦõΦõΦ@/@/@/ <Æ <Æ <Æ ( ( ( ÉÓÉÓÉÓ' ' ' <Æ <Æ <ÆõΦõΦõΦ 43-170 lfflfflff í í í ( ( ( ÉÓÉÓÉÓ' ' ' Õ Õ Õ AνAνAνi Λi Λi ΛÛ Û Û lfflfflff ú ú ú ± ± ± (4/4) typedef struct bspt { // data structure for bspt Polygon *poly; struct bspt *fchild; // for the front side struct bspt *bchild; // for the back side BSPT; void display bspt back to front(bspt *bspt, float *viewer) { int viewer side; if ( (A) ) return; viewer side = check side(viewer, bspt->poly); if (viewer side == BSPT FRONT) { display bspt back to front( (B), viewer); draw bspt poly(bspt->poly); display bspt back to front( (C), viewer); else { display bspt back to front( (D), viewer); draw bspt poly(bspt->poly); display bspt back to front( (E), viewer); int los(bspt *bspt, float *start, float *end) { int cs, ce, side0, side1; if (!bspt) return 1; cs = check side(start, bspt->poly); ce = check side(end, bspt->poly); if ((cs == BSPT FRONT) && (ce == BSPT FRONT)) { return los(bspt->fchild, start, end); else if ((cs == BSPT BACK) && (ce == BSPT BACK)) { return los(bspt->bchild, start, end); else { if (AAA(bspt->poly, start, end) return 0; side0 = los( (F), start, end); side1 = los( (G), start, end); return side0 side1; Õ aë> 4: BSPT 'a μξ <ÊÃ - 2003 ffiξ 6 Z4 17 9± Êê 7:00 -
"f"f"fy y y @/@/@/ <Æ <Æ <Æ /BN/BN/BNõΦõΦõΦ@/@/@/ <Æ <Æ <Æ ( ( ( ÉÓÉÓÉÓ' ' ' <Æ <Æ <ÆõΦõΦõΦ 43-170 lfflfflff í í í ( ( ( ÉÓÉÓÉÓ' ' ' Õ Õ Õ AνAνAνi Λi Λi ΛÛ Û Û lfflfflff ú ú ú ± ± ± (1/4) lff í ( ÉÓ' Õ Aνi ΛÛ lff ú ± (43-170) ì Íì Íì Í: <Æ <Æ <ÆõΦõΦõΦ: <Æ <Æ <Æ Ξ Ξ Ξ: sffsffsff2 2 2 : 1. 6 ëνh]j ú fl Λ. (a) OpenGL fi sffáôλ ffξ "f glenable (GL CULL FACE); ëνh sff [O±&ñΩfl fflh >ρíss sff z ]j Ð Ã ' sff & fflh a >ρ fflh? 1.0 0.5 A E B ( ú ) (b) OpenGL fi sffáôλ ffξ "f ; x_ffi "îω 4Sq >ρíss sffã ' & fflh a >ρ fflh? ( ú ) (c) >ρ8 x&hλ 4Sqa A lffzoφ` sff6 xfl # Óüt^ Õ wn= M: V,οsff Ä Ξ ÃÐÒ o` fl fflh ffi Ψsff ffi8 òö± &hλsff "Λ fflh ÅÒ sff ú fflhtff d 2;tff ú fl, Õ sffä [O±"îΩfl Λ. ( ú ) (d) OpenGL fi sffáôλ ffξ "f_ffi i Λ!sq X<sff', 7 áôaνõ ΞàÔ í <Êfl fflh W1 tff &ñω Ð fflh Á %ÁΨ ffξ? ( ú ) a. b. c. d. (e) %7 Û 2X è(minification) S!ν "f jφ»h 9±' Ð sff Ξ+ A 9±' a%~ Ér ffiμ±õφ ú fflh fl fflhx<, è_ffi &ñω d Kν4R õφ ρξ Õ χq +Éffi? ú ` ú fl Õ sffä [O± "îωfl Λ. D lffõütfl Λ. 0.25 C 1.0 Õ aë> 1: sff Ξ+ A ÐçSS void too bad(double f, double g, double h) f g ( ú ) int i; for (i = 0; i < 3; i++) f g A[i] = B[i] + f/g; C[i] = D[i] + f*h/g; a. b. 3. Õ aë> 1 "f A, B, C, D y &h _ffi Ò o ú sff y y (1, 0, 0), (0, 1, 0), (0, 0, 1), (1, 1, 1)sffΛ fl Φ. sff X<sff' sff6 xfl # E&h "f_ffi Ò o ú ` sff Ξ+ A ÐçSS ` : xfl # fl Λ. (>ρíss õφ&ñω"îωlff +Éffi Ψ.) ( ú ) ( ú ) 2. 6 ï @/fl # áô ÐÕ AνψQ 9Φ "f j &hλ o fl χ9 ô»ç. +É Ã e fflh ~ ÓZOΦ tff - 2002 ffiξ 6 Z4 14 9± Êê 4:00 -
"f"f"fy y y @/@/@/ <Æ <Æ <Æ /BN/BN/BNõΦõΦõΦ@/@/@/ <Æ <Æ <Æ ( ( ( ÉÓÉÓÉÓ' ' ' <Æ <Æ <ÆõΦõΦõΦ 43-170 lfflfflff í í í ( ( ( ÉÓÉÓÉÓ' ' ' Õ Õ Õ AνAνAνi Λi Λi ΛÛ Û Û lfflfflff ú ú ú ± ± ± (2/4) 4. ëss # χqìfirsff OpenGL` ± 6 xfl # 3Ψ "é >ß e Φ'p ffξ` ]j ô»ç +É M:, sff èáôàôj?#q fflh à OΦ rffçss [O±"îΩô»Ç Π ü< ú sff Application YU 6, Geometry YU6, Pixel YU6 1px [j YU6 Ð $íω +É Ã e. 6 õφ ú Ér ρξíss ` Òqty fl Φ. (1) U sff!q( a A, (2) Πæ[ρt ffi ±, (3) %7 Û 2X BνiçΩ, (4) ÈÒ%òΩ μξ 8, (5) BSPT sff6 xô»ç ÂÓ ^ffi @/ô»ç Óüt ^ ]jfi, (6) Ò o ú ^ E$ `çω, (7) ; x_ffi "îω 4Sq_ffi &hλ6 x, (8)"é Φ»H Ðüw!lr (a) Application YU6 >ρíss õφ ρξ 'asff e fflh ρξíss _ffi Ξ ñ P±fl Λ. ( ú ) (b) Geometry YU6 >ρíss õφ ρξ 'asff e fflh ρξíss _ffi Ξ ñ P±fl Λ. ( ú ) (c) Pixel YU6 >ρíss õφ ρξ 'asff e fflh ρξ íss _ffi Ξ ñ P±fl Λ. ( ú ) 5. _ffi sffpfftff Aü< B_ffi +Ë$íΩ @/fl # Òqty fl Φ. (c A ff A )ü< (c B ff B ) sffpfftff_ffi @/ 6 x & fflh o è_ffi pffoff Y Lô»Ç Ò o ú (pre-multiplied color)sffλ fl Φ. F A ü< F B y y Aü< B_ffi o è "f_ffi ff A ü< ff B _ffi qffö± Ð >rfνfl fflh pffwnφφ [ t Πæ ffiμ±õφ sffpfftff O ú z fflh pffwnφφ _ffi qff Ö± sffλ fl μξ, +Ë$íΩ_ffi ffiμ±õφ Òqt$íΩ & fflh pffoff Y Lô»Ç Ò o ú Ér 6 õφ ú. ψ! c O ff O = F A ψ! ψ c A + F B ff A! c B ff B (a) ëss F A =1 ff B sff F B = ff A 9± ffiâωä #Q* ô»ç ~ Ód ΛÜ Ð sffpfftff +Ë$íΩsff & fflh tff [O±"îΩfl Λ. (sffä [O±"îΩ +Éffi Ψ.) ( ú ) (b) A over B + AIν_ffi +Ë$íΩ_ffi ffiâωä F A ü< F B fflh y y O±Ξ ffξ? ( ú ) (c) [j _ffi sffpfftff A, B, C_ffi [j >h_ffi ± y + A_ffi z ]j Ò o ú (pffoff Y Lô»Ç Ò o ú sff _ )õφ ú fi ú sff y y (1:0; 0:5; 0:0; 0:25), (0:25; 0:5; 1:0; 0:5), (0:5; 0:5; 0:5; 1:0)sffΛ fl Φ. sffm: +' "f ú Ü Ð(back-to-front) íνh"f Ð over ρξíss ` ± 6 xfl # Ò o ú ` +Ë $íω +É ffiâωä (A ú Aá sff, C +'Aá e ) Ðsff fflh Ò o ú Ér Á %ÁΨsff cffi? ì Í rff>ρíss õφ&ñω` 1SS n=ffi Ψ. +'+'+' μξ μξ μξ ± ± ± 6 x6 x6 x ( ú ) (d) Õ aë> 3 Ér 0A_ffi ëνh]j @/fl # ú "f +' Ð (front-to-back) íνh"f Ð Ò o ú ` +Ë$íΩKν ÅÒ fflh OpenGL <Êà sff. ú 3lw )a ÂÒìfir` 5gΛ. ( ú ) (e) Õ aë> 3_ffi ï +' "f ú Ü Ð (backto-front) íνh"f Ð +Ë$íΩfl fflh ï Ð Π Ë #Q 0A_ffi [j ± y + A` +Ë$íΩfl χ9 +É, Ò o ú!q ( (color buffer) RGB GνV,±ü@ ú fi!q( ì Í rff e #Q» +Éffi? ú ` ú fl ì Í rffõ sffä [O±"îΩfl Λ. ( ú ) 6. 6 Ér Aν_ffi ; x_ffi "îω 4Sq 'aô»ç ëνh]jsff. X m 1 I = I a k a + f att (d i ) I li fk d (N L i ) i=0 +k s (N H i ) n g # lff"f± 6 x & fflh μξã I a, k a, d i, I li, k d, N, L i, k s, H i, n @/fl # ú fl Λ. (a) ΏBjΛ "f Π Λ Ð fflh ~ Ó Ó %òω Ó` ~ÃÎ fflh μξã P±fl Λ. ( ú ) - 2002 ffiξ 6 Z4 14 9± Êê 4:00 -
"f"f"fy y y @/@/@/ <Æ <Æ <Æ /BN/BN/BNõΦõΦõΦ@/@/@/ <Æ <Æ <Æ ( ( ( ÉÓÉÓÉÓ' ' ' <Æ <Æ <ÆõΦõΦõΦ 43-170 lfflfflff í í í ( ( ( ÉÓÉÓÉÓ' ' ' Õ Õ Õ AνAνAνi Λi Λi ΛÛ Û Û lfflfflff ú ú ú ± ± ± (3/4) ( ú ) 8. 6 Ér Binary Space Partitioning Tree (BSPT) 'aô»ç ëνh]jsff. Õ aë> 4_ffi display bspt front to back() Ér rff&h _ffi 0Auff viewer[3] ÅÒ#Q& ` M:, ú "f +' (front-to-back) íνh"f Ð μξ"f BSPT bspt_ffi y + A` E$ ffi8a AKνÅÒ fflh <Êà sff. Õ aë> 2: x9φë s V (b) Ffig"é _ffi 0Auff_ffi μξ o %òω Ó` ~ÃÎ fflh μξã P±fl Λ. ( ú ) (c) Óüt^ _ffi 0Auffü< ~ Ó Ósff Π 7fl%3 ` M: %òω Ó ` ~ÃÎ fflh μξã P±fl Λ. ( ú ) (d) H i fflh #Q "Ξ S!ν "f : yff òö± &hλü Ð ± 6 xsff & fflh? tff ΨΞ` "îωrfffl Λ. ( ú ) a. b. 7. 6 Ér x9φbνiçω 'aô»ç ëνh]jsff. (a) Õ aë> 2 fflh è S!ν "f GL NEAREST MIPMAP NEAREST 9±' ± 6 xfl # %7 Û 2X BνiçΩ` ô»ç sffpfftffsff. sffõ aë> "f fflh W1>h_ffi "f Ð Ér YU6 _ffi %7 Û 2X ± 6 xfl e fflhx<, #QÖ ÂÒìfirsff Zρ Ér YU6 _ffi %7 Û 2X ± 6 xfl fflhtff ú fl, Õ sffä lffõütfl Λ. (a) ëνhð o int check side (float *pt, Polygon *poly) <Êà fflh #Q "Ξ 9±` KνÅÒ fflh <Êà ffξ? ( ú ) (b) (A) [ t#q ú ï fflh Á %ÁΨ 9±ffi? ( ú ) (c) (B), (C), (D), (E) [ t#q ú ï fflh Á %ÁΨ 9±ffi? ( ú ) (B) (C) (D) (E) (d) #Q "Ξ BSPT n>h_ffi y + AÜ Ð $íωsff &#Q e ` ffiâωä, sff BSPT_ffi Zρ sff(height) fflh j è O±Ξ "f j@/ O±Ξ ffi tff 0pxô»Ç? Big-O lff ñ ± 6 xfl # lff Õütfl Λ. ( ú ) @/ ffξ GL LINEAR MIPMAP LINEAR 9±' ± 6 x +ÉffiâΩÄ sff sffpfftff #Q "Ξ μξ o `ffi ffi? (b) ëss GL NEAREST MIPMAP NEAREST - 2002 ffiξ 6 Z4 14 9± Êê 4:00 -