모두들 수고하셨습니다. 기말고사 정답입니다.
Final Exam
기말고사 Take-Home Exam
2017년 12월 13일 (수) 15:30까지 e-learning 제출
범위: 중간고사문제 포함 – 중간고사 이후 끝까지 (수업블로그와 예제 중심으로)
2016년 기말고사 답안지 cg16-2-final-answer
Billboarding & AlphaBlendTextures
Billboarding & AlphaBlendTextures
lab16-BillboardingTextureShadedQuad
// create a axis-aligned billboard matrix
void buildAxisAlignedBillboardMatrix(glm::mat4& m, glm::vec3& axis)
{
// calculate “-yaw” angle from View matrix (Look.x, Look.z)
float theta = -atan2f(m[0][2], m[2][2]);
float ct = cosf(theta);
float st = sinf(theta);
// normalize
axis = glm::normalize(axis);
// clear out the view matrix passed in
m = glm::mat4(1.0f);
//———————————————
// R = uu’ + cos(theta)*(I-uu’) + sin(theta)*S
//
// S = 0 -z y u’ = (x, y, z)
// z 0 -x
// -y x 0
//———————————————
// calculate “Rotation” matrix using “axis” & “theta”
m[0][0] = axis[0] * axis[0] + ct*(1 – axis[0] * axis[0]) ;
m[0][1] = axis[0] * axis[1] + ct*(0 – axis[0] * axis[1]) + st*(-axis[2]);
m[0][2] = axis[0] * axis[2] + ct*(0 – axis[0] * axis[2]) + st*axis[1];
m[1][0] = axis[1] * axis[0] + ct*(0 – axis[1] * axis[0]) + st*axis[2];
m[1][1] = axis[1] * axis[1] + ct*(1 – axis[1] * axis[1]) ;
m[1][2] = axis[1] * axis[2] + ct*(0 – axis[1] * axis[2]) + st*(-axis[0]);
m[2][0] = axis[2] * axis[0] + ct*(0 – axis[2] * axis[0]) + st*(-axis[1]);
m[2][1] = axis[2] * axis[1] + ct*(0 – axis[2] * axis[1]) + st*axis[0];
m[2][2] = axis[2] * axis[2] + ct*(1 – axis[2] * axis[2]) ;
}
Billboard가 활성화가 되지 않은 상태 (카메라의 시점이 회전된 상태에 따라 알파텍스쳐 나무가 원래 위치한대로 그대로 유지함)
Billboard가 활성화된 상태 (카메라의 시점이 회전된 상태라 해도 알파텍스쳐 나무가 내 시점을 향하여 바라보는 상태를 유지함)
Blending Filter
Blending filter
lab16-BlendFilterTextureShadedQuad
glEnable(GL_BLEND);
if (g_filter == 0) // Default (no blending) = Cs*1
glBlendFunc(GL_ONE, GL_ZERO);
else if (g_filter == 1) // Draw background only = Cd*1
glBlendFunc(GL_ZERO, GL_ONE);
else if (g_filter == 2) // Cs*1 + Cd*1
glBlendFunc(GL_ONE, GL_ONE);
else if (g_filter == 3) // Alpha blending (back-to-front) = Cs*As + Cd*(1-As)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
else if (g_filter == 4) // brighten the scene = Cs*As + Cd*1
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
else if (g_filter == 5) // Modulate blending = Cd*Cs
glBlendFunc(GL_ZERO, GL_SRC_COLOR);
else if (g_filter == 6) // darken the scene = Cd*As
glBlendFunc(GL_ZERO, GL_SRC_ALPHA);
else if (g_filter == 7) // Invert all the colors = Cs*(1-Cd)
glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO);
Default (no blending)
Draw background only
Add blending
Alpha blending
Brighten the scene
Modulate blending
Darken the scene
Invert all the colors
Alpha Blending
lecture18
lecture18-ch7
lecture17
lecture17-ch8
HW8
여러 개의 3차원 객체 (3D objects) 모델을 전체 장면 World에 배치시키고 움직임을 넣어본다.
–moglclass17 (반드시 OpenAL 설치 요망 http://dis.dankook.ac.kr/lectures/cg17/2017/11/20/openal-getting-started/)를 사용한다.
-본인이 제작한 계층적 변환 구조(Hierarchical transformation)를 가진 3차원 객체(e.g. your name)에 텍스쳐를 넣어준다.
-전체 장면을 꾸며주기 위하여, 주변에 2개 이상의 3차원 모델을 추가로 그려준다.
-animated texture (i.e., flipbook animation)을 추가로 그려준다.
-사운드 클래스 (OpenAL 라이브러리)를 사용하여 배경음악과 이벤트 사운드를 추가한다.
-위의 코드로 하나의 완성된 장면을 구성하는 프로그램을 작성하고, 실행 화면과 코드를 첨부하시오.
Multi-texturing
Single-Pass Multi-texturing (using multitexQuad defining texCoord0 & texCoord1 & )
lab15-SinglepassMultiTexturing
Multi-Pass Multi-texturing (draw Quad twice using add/modulate blending filter)
Add Blending (덧셈 블렌딩)
Modulate Blending (곱셈 블렌딩)
HW7
Hierachical transformation 3D geometry (eg. your name)를 3가지 방식으로 만들고 구현방식 차이점을 분석한다.
SimpleCube3d를 참고한다.
-geometryPositionColor (lab10-GeometryPositionColorOrientationCamera)
-geometryPositionNormal & Lighting & Material (lab11-GeometryPositionNormalMultipleLights3 )
-geometryPositionNormalTexture & Lighting & Material & TextureMapping (lab13-TextureShadedGeometry & moglclass17(updated))
//////////MPerPixelShadingTexture.vs
// Input vertex data, different for all executions of this shader.
layout(location = 0) in vec3 vPosition; // vertex position (in model space)
layout(location = 1) in vec2 vTexCoord; // texture coordinate (in model space)
layout(location = 2) in vec3 vNormal; // vertex normal (in model space)