컴퓨터 그래픽스/그래픽 알고리즘 및 표현

Phong shading 을 이용한 물체의 표현

YoonJongSeok 2023. 2. 5. 01:49
Phong shading이란 물체를 표현할 때 재질에 따라 다르게 표현되는데 해당 재질을 3가지 color 속성으로 정의했던 방법이다.

 

ambient color

물체가 갖고 있는 스스로 빛을 내는 색이다. 물체가 갖고 있는 색이라고 볼 수 있다.

diffuse color

물체의 울퉁불퉁한 정도를 나타내는 색이다. 울퉁불퉁한 정도가 클수록 빛은 이곳저곳 반사된다. 

specular color

물체의 매끈한 정도를 나타내는 색이다. 물체가 매끈할수록 물체가 하나의 방향으로 반사된다.

 

ambient color 는 RGB값의 조절로 나타낼 수 있어서 알고리즘이랄것이 없다.

 

diffuse color 구하는 과정

 

diffuse color 표현

빛의 각도에 따라 빛을 받는 양이 달라진다. 빛의 각도가 커질수록 빛의 양이 줄어들고 빛의 각도가 작아질수록 빛의 양이 커진다. 해당 성질은 cos의 성질과 같다.

여기서 n은 normal vector로 빛의 충돌지점에서의 수직 벡터이고 l은 빛의 벡터이다. n과 l은 normalize된 vector들이다.

그래서 빛을 여기서 cos으로 나타낼 수 있는데 n벡터와 l벡터의 사이 각인 cosΘ 는 n과 l의 내적으로 구할 수 있다.

여기서 n과 l의 크기는 normalize된 것이기 때문에 1이므로 cosΘ = n ● l 이다. cosΘ가 0이 나왔을 때 빛이 없는 것이다. 그리고 cosΘ는 음수가 나와서는 안되게 조절해주어야 한다.

glm 라이브러리 max함수를 이용해 0.0 보다 작은 수가 올 경우엔 0.0으로 해주는 함수를 이용한다.

glm::max(glm::dot(normal, light),0.0f);

 

specular color 구하는 과정

specular color는 매끈한 정도인데 우리 눈으로 봤을 때 물체에서 가장 반사가 잘 되는 부분으로 볼 수 있다.

그래서 빛이 물체에서 반사했을 때 나오는 반사 벡터와 우리가 눈으로 반사되는 빛을 봤을 때 기울여서 보면 약하게 보이고 수직에서 봤을 때는 강하게 보이는 것을 표현하는 것이다. 

 

반사벡터와 view vector 간의 각도가 클수록 보이는 빛의 양이 작고 각도가 작을수록 빛의 양이 커진다 -> cos성질

 

그러나 빛이 퍼지는 듯한 느낌이 들게 된다. 이 문제를 해결하기 위해서 cos ^ n 을 하게 되는데 여기서 n은 shininess 라는 변수라고 불린다. shininess를 설정하고 다시 해보면

제대로 나오는 것을 볼 수 있다.

 

 


	//diffuse
    const vec3 dirToLight = -glm::normalize(hit.point - light.pos)
    const float diff = glm::max(glm::dot(hit.normal, dirToLight), 0.0f);

	// Specular
	const vec3 reflectDir = 2.0f * hit.normal * glm::dot(hit.normal, dirToLight) - dirToLight;
	const float specular = pow(glm::max(glm::dot(-ray.dir, reflectDir), 0.0f), shininess);