하프 램버트



램버트 라이트는 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


반응형

+ Recent posts