Blinn-Phong Shading

Date:     Updated:

카테고리:

태그:

Main Reference
- Learn OpenGL
- Rinthel Kwon - OpenGL Lecture


Phong Shading

13_phong_side_effect_reason

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;

advanced_lighting_phong_limit

앞선 포스팅에서 Phong Shading 모델로 lighting을 계산하는 방법에 대해 알아봤었다. 이때 시점의 방향과 반사광의 방향이 90도가 넘어가면 dot product가 음수가 되기 때문에 specular 텀을 0으로 cutoff 한다. 결과적으로 위 그림과 같이 highlighting(반사 영역)이 잘려나간 것처럼 보이게 된다.


Blinn-Phong Shading

13_blinn_phong_idea

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
145750 145803



맨 위로 이동하기

OpenGL 카테고리 내 다른 글 보러가기

댓글 남기기