Blinn-Phong Shading
카테고리: OpenGL
태그: Graphics
Main Reference
- Learn OpenGL
- Rinthel Kwon - OpenGL Lecture
Phong Shading
vec3 viewDir = normalize(viewPos - position);
vec3 reflectDir = reflect(-lightDir, pixelNorm);
float spec = pow(max(dot(viewDir, reflectDir), 0.0), specularShininess);
vec3 specular = specularStrength * spec * lightColor;
앞선 포스팅에서 Phong Shading 모델로 lighting을 계산하는 방법에 대해 알아봤었다. 이때 시점의 방향과 반사광의 방향이 90도가 넘어가면 dot product가 음수가 되기 때문에 specular 텀을 0으로 cutoff 한다. 결과적으로 위 그림과 같이 highlighting(반사 영역)이 잘려나간 것처럼 보이게 된다.
Blinn-Phong Shading
vec3 viewDir = normalize(viewPos - position);
vec3 halfDir = normalize(lightDir + viewDir);
spec = pow(max(dot(halfDir, pixelNorm), 0.0), material.shininess);
Blinn-Phong Shading 모델은 기존 Phong 모델의 확장으로, 시점 방향 벡터와, 반사광 벡터의 중간 벡터를 활용하게 된다. 이 벡터가 normal과 이루는 각도를 가지고 specular 텀을 결정하게 되는데, Phong 모델과 달리 두 벡터가 90도를 넘어갈 수 없다. 결과적으로 모든 방향에 대해 부드럽게 감소하는 specular 텀을 갖게 된다.
Result
Phong Model | Blinn-Phong Model |
---|---|
댓글 남기기