2020 이전/Unity

2018.12.25 유니티 쉐이더 스타트업 공부

이상해C++ 2018. 12. 25. 21:46

파트8


버텍스 컬러를 이용한 텍스쳐 블렌딩, 스펙큘라 효과 적용



void surf(Input IN, inout SurfaceOutputStandard o){
    ...
    o.Albedo = lerp(c.rgb, d.rgb, IN.color.r);
    o.Albedo = lerp(o.Albedo.rgb,e.rgb, IN.color.g);    
    o.Albedo = lerp(o.Albedo.rgb,f.rgb, IN.color.b);
}

물체는 전부다 반짝거리는 정반사(Specular)를 가지고 있다. 서피스 쉐이더에서는 o.Smoothness로 조절한다(1에 가까울수록 정반사이며 반짝거림 0은 난반사 Diffuse). 버텍스 컬러영역을 이용하여 특정부분만 반짝거리도록 이용할 수 있다.




파트11 Lambert lighting


현재 3D그래픽의 조명은 버텍스가 가지고있는 노멀벡터와 빛을 연산하여 만들어지고 버텍스 사이의 밝기값은 보간을 이용하여 구현한다. 


램버트 라이팅은 노멀벡터(법선벡터)와 빛의 방향을 내적한 값으로 -1~1사이의 값을 가진다. 색상은 0~1사이의 값을 가져야하므로 saturate또는 max를 통하여 0 밑의 부분을 잘라내거나 half lambert(*0.5+0.5)를 사용한다.



half lambert (내적값 3제곱)


노멀벡터와 빛의 방향벡터를 내적한 값에 텍스쳐의 albedo, 내장변수로 제공되는 빛의 색상과 강도 , 그리고 빛의 감쇠 현상을 표현하는 변수를 곱셈연산하여 램버트 라이팅을 완성한다.


<빛의 감쇠현상 attenuation>


 

[좌: att 없음 / 우: att 있음]


빛의 감쇠를 연산하지 않으면 빛의 거리에 따른 빛의 감쇠현상이 일어나지 않는다(어두워지지가 않는다)

추가로 다른물체가 이 얼굴에 그림자를 드리우지도 못하면서 자신의 그림자에 자기가 영향받지 않는다(목밑에 생기는 그림자는 자신의 영향을 받아야 = att이 있어야 생긴다)