Billboarding & AlphaBlendTextures

Billboarding & AlphaBlendTextures

lab16-BillboardingTextureShadedQuad

 

yaw
Look

// 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)
noblending

Draw background only

backgroundonly

Add blending

addblending

Alpha blending

alphablending

Brighten the scene

additiveblending

Modulate blending

modulateblending

Darken the scene

darken

Invert all the colors

invert

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 라이브러리)를 사용하여 배경음악과 이벤트 사운드를 추가한다.
-위의 코드로 하나의 완성된 장면을 구성하는 프로그램을 작성하고, 실행 화면과 코드를 첨부하시오.

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)