1 분 소요

Phong vs Blinn Phong?

Phong Reflection Model

물체의 반사 벡터와 시선 벡터 사이의 각도를 이용하여
Specular(반짝임)을 계산하는 방식

반사 벡터가 ‘픽셀’마다 달라지므로
각 픽셀마다 반사 벡터를 구해야 한다
(비용이 높은 편)

더 작고, 날카로운 Specular 하이라이트를 표현

Bline Phong Model

Phong 모델이 매번 ‘반사 벡터’를 구해야 했기에
70~80 년대 GPU에서 부담이 되었음

그렇기에 반사 벡터 대신
Half Vector를 사용하여 계산을 단순화
(Reflection 대신, 눈과 빛의 방향을 이용)

눈과 빛의 방향은 고정되어 있기에
모든 픽셀에서 동일한 처리가 가능

그래픽스 최적화 모델
(물론 현대의 GPU에선 미미한 차이가 나긴 한다)
(그래도 이쪽이 더 효율적)

하이라이트가 더 넓고 부드럽게 나타난다

비교용 HLSL 코드

float3 BlinnPhong(float3 lightStrength, float3 lightVec, float3 normal,
                   float3 toEye, Material mat)
{
    if (useBlinnPhong)
    {
        float3 halfway = normalize(toEye + lightVec);
        float hdotn = dot(halfway, normal);
        float3 specular = mat.specular * pow(max(hdotn, 0.0f), mat.shininess * 2.0); // Shiness 값을 조금 더 크게 사용
        return mat.ambient + (mat.diffuse + specular) * lightStrength;
    }
    else
    {
        float3 r = -reflect(lightVec, normal);
        float3 specular = mat.specular * pow(max(dot(toEye, r), 0.0f), mat.shininess);
        return mat.ambient + (mat.diffuse + specular) * lightStrength;
    }
}

비교 이미지

비교는 SpotLight 를 사용하였다

비교 이미지 1

  • Phong

Image

중앙 부분에 더 하이라이트가 집중되어 보인다

  • Blinn Phong

Image

전반적으로 더 부드러워 보인다

비교 이미지 2

보는 시점의 각도를 다르게 해봤다

  • Phong

Image

SpotLight의 경계선이 날카롭게 끊어짐
(손전등이 비치지 않는 부분에 대한 날카로운 표현 가능)

  • Blinn Phong

Image

비교적 넓은 범위까지 퍼지는 편이다
(뚝 끊긴다기 보단 좀 더 멀리서 쏜 조명 같은 느낌이 든다)

댓글남기기