Blinn Phong, rim light를 이용한 specular

2023. 2. 20. 18:14Unity/Unity C#

Blinn phong은 라이팅의 한 방법인데

reflection vector와 view vector간의 내적을 이용한 빛 표현이다.

그런데 reflection vector 구하는 방법이 까다롭고 오래걸리기 때문에 H vector과 Normal vector을 내적해서 구하기도 한다 그러면 실제 Blinn phong과 별로 차이가 나지 않은 결과를 얻을 수 있어서 많이 이용한다고 한다.

H vector는 (L+v) / 2로 구할 수 있다.

Unity에서는 Blinn phong 의 구현을 

H = lightvector + viewvector로 구해주고 normalize하여 h vector를 구한다. 

그리고는 normal과 h를 내적한다.

   float3 H = normalize(lightDir + viewDir);
   float spec = saturate(dot(H, s.Normal));
   spec = pow(spec, 100);

그리고는 효과를 더욱 극대화하기 위해 n제곱을 해준다.

blinn phong

이제 여기에 텍스쳐를 입혀서 보면

왼쪽은 이번 Blinn phong 을 적용한 material 이고 오른쪽은 half lambert를 적용한 material이다.

 

Blinn phong을 보면 반사되는 빛이 시점을 따라오는 것을 볼 수 있다.

 

reflection을 계산할 때 카메라 시점 vector이 들어가기 때문에 움직이면서 따라오는 효과가 되는 것이다.

 

Fake specular 만들기

 

specular를 하나 더 만들어볼 것이다.

 

rim 계산은 view벡터와 normal간의 내적이고 거기서 1-rim을 해주면서 테두리 빛을 강조하였었다.

여기서는 rim에 n 제곱을 하여 specular를 하나 더 만들어줄 것이다.

 //SPECULAR
            float3 specColor;
            float3 H = normalize(lightDir + viewDir);
            float spec = saturate(dot(H, s.Normal));
            spec = pow(spec, _SpecPow);
            specColor = spec* _SpecCol.rgb;
//fake spec
            float3 specColor2;
            specColor2 = pow(rim, _RimPower) * _RimColor.rgb * s.Gloss;
 //final
     	final.rgb = specColor.rgb + specColor2.rgb;

            final.a = s.Alpha;
            return final;

반사되는 빛이 두 개가 보이는 것을 알 수 있다.

 

'Unity > Unity C#' 카테고리의 다른 글

CustomLight  (0) 2023.02.13
두 개의 texture 섞기, texture coordinate, 텍스쳐 time 설정하기  (0) 2023.02.04