참치김밥은 최고의 한식이다

[유니티] 쉐이더 기초 : 램버트 라이팅 (Lambert Lighting) 본문

Unity

[유니티] 쉐이더 기초 : 램버트 라이팅 (Lambert Lighting)

l__j__h 2024. 2. 20. 16:45

(유니티 외에 쉐이더가 필요한 곳에서 범용적으로 쓰이는 기법임)

Lambert Lighting?

  • 월드 노말과 메인 라이트 방향의 반대를 내적(dot)하여 빛을 연산한 것 = ndotl

Half Lambert Lighting

  • 내적 연산은 cos으로, 빛을 받는 부분과 못 받는 부분의 차이가 너무 극심해서 어색함
  • 따라서, 위에서 구한 램버트 라이팅 값에 *0.5 + 0.5(Magic Number) 를 해주어 차이를 부드럽게 만듬
  • 물리적으로 올바른 표현 방법은 아니지만, 보기에 좋아서 많이 씀
  • 그런데 하프 램버트만 해주면, 원래 빛을 못 받았을 부분이 실제보다 많이 밝아짐
  • → 따라서 보통은 하프 램버트 값을 제곱(pow)하여 사용함. 2-3번하면 자연스러워짐

Magic Number는 *2 - 1 도 있음

이렇게 만든 램버트 라이팅에

  1. 텍스처 (곱셈)
  2. 노말맵 (ndotl의 월드 노말을 노말맵(탄젠트공간→월드공간 변환 노드 필요)으로 대체해주면 됨)
  3. 앰비언트(환경광) (덧셈)
  4. 앰비언트 오클루젼(AO) (앰비언트에 곱셈)
  5. 스페큘러
  6. Shadow casting / attenuation (그림자 드리우기/받기)

를 추가해주면 됨

728x90