하프 램버트
램버트 라이트는 cos그래프 연산의 특성상 밝다가 너무 갑자기 검게 음영이 떨어지는 단점이 있다.
이 단점을 해결하고자 만든것이 하프 램버트이다.
공식
Dot(L,N) *0.5 + 0.5
램버트에 0.5를 곱해 평준화 시킨 다음에 0.5를 더해서 x축으로 들어 올려준다.
즉 -1에서부터 1까지의 숫자를 0에서부터 1까지의 범위로 만듦으로서 좀 더 부드럽게 바꿔준다.
float4 LightingTest(SurfaceOutput s, float3 lightDir, float atten)
{
float4 ndot1 = dot(s.Normal, lightDir) *0.5 + 0.5;
return ndot1;
}
오른쪽 하프램버트 공식을 적용한 모델
부드러워졌지만 이 음영은 너무 부드러워서 물리적으로 전혀 옳지 않다.
명이 너무 넓고 암이 너무 좁다. (음영 콘트라스트가 거의 없음 콘트라스트:~대비)
해결방법
하프 램버트를 몇번 제곱해서 콘트라스트를 올려준다.
float4 LightingTest(SurfaceOutput s, float3 lightDir, float atten)
{
float4 ndot1 = dot(s.Normal, lightDir) *0.5 + 0.5;
return pow(ndot1,4);
}
pow 함수 : pow(X,n) -> X의 n제곱
위 쉐이더는 빛 방향에 따른 밝기만 구현되어있음
이번에는 조명의 색상과 강도, 빛 감쇠, 텍스처까지 적용 해보려한다.
float4 LightingTest(SurfaceOutput s, float3 lightDir, float atten)
{
float4 ndot1 = saturate(dot(s.Normal, lightDir));
float4 final;
final.rgb = ndot1 * s.Albedo * _LightColor0.rgb* atten;
final.a = s.Alpha;
return final;
}
return 값이 final로 바뀌었다.
s.Albedo : 램버트 라이트와 연산되어 Diffuse가 된다.
_LightColor0.rgb : 조명의 색상이나 강도를 가져옴
atten : 빛의 감쇠 현상을 시뮬레이트한다.
final.rgb : 이전에 연산했던 조명과 노멀의 각도인 ndot1연산과 Albedo , _LightColor0.rgb를 곱해 변화를 적용한다.
atten은 자기 자신의 그림자를 만들거나, 다른 물체에 때문에 생기는 그림자, 조명의 감쇠 현상(멀어지면 어두워지는 효과)때문에 어두운 부분 이 있다.
학습참고
1) 유니티쉐이더 스타트업 도서
2) https://www.slideshare.net/tartist/ss-56389186
'유니티' 카테고리의 다른 글
유니티)TCP 채팅 #1 (0) | 2021.06.09 |
---|---|
[유니티] 유니티 PlayerPrefs 저장경로/ Application.dataPath/ (0) | 2021.05.03 |
[유니티] 어드레서블 알아보기 어드레서블 개념과 로드방법 - 1 (0) | 2021.05.01 |
[유니티] Unity IAP 인앱결제 알아보기 (1) | 2021.04.13 |
유니티) 쉐이더코드 변수 접근하기 (머테리얼/쉐이더)Accessing shader code variables (0) | 2019.06.21 |