2023. 2. 20. 18:14ㆍUnity/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 을 적용한 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 |