유니티(Unity)의 조명 처리

유니티의 조명이 어떻게 처리되는지 아는 것은 중요합니다. 일반적인 Forward Rendering Path에선 대략 다음과 같습니다.

  1. 광원의 Lightmapping 값이 RealtimeOnly인 경우: 광원의 조명이 라이트맵과 라이트 프로브에 반영되지 않습니다.
    • 광원의 Render Mode가 Auto인 경우: QualitySettings의 Pixel Light Count 수까지만 픽셀당 조명이 가능합니다. 그외엔 광원이 정점당 조명으로 처리됩니다. 그런데 Diffuse 셰이더에선 가장 영향력이 큰 지향성 광원은 항상 픽셀당 조명으로 처리됩니다.
    • 광원의 Render Mode가 Important인 경우: 광원이 픽셀당 조명으로 처리됩니다. QualitySettings의 Pixel Light Count 수의 영향을 받는지는 조사해 보지 않았습니다.
    • 광원의 Render Mode가 Not Important인 경우: 광원이 정점당 조명으로 처리됩니다. 다른 픽셀당 조명이 없을 때엔 픽셀당 조명으로 처리될 수도 있을 것 같은데, 조사해 보진 않았습니다.
  2. 광원의 Lightmapping 값이 Auto인 경우: 광원의 조명이 라이트맵과 라이트 프로브에 반영되고, 둘 다 적용 안 되는 물체는 RealtimeOnly와 똑같이 처리됩니다.
  3. 광원의 Lightmapping 값이 BakedOnly인 경우: 광원의 조명이 라이트맵과 라이트 프로브에만 반영됩니다.

Diffuse 셰이더에서 정점당 조명은 각 메쉬마다 그 메쉬에 영향력이 가장 큰 4개까지만 적용됩니다.

일반적으로 동적 조명의 부하는 크며, 픽셀당 동적 조명의 부하는 매우 큽니다. 그러므로 되도록이면 라이트맵과 라이트 프로브를 적극적으로 활용하고, 그게 어려운 경우엔 정점당 조명을 활용하는 게 좋습니다. 픽셀당 동적 조명은 최후의 수단으로 사용하는 게 좋습니다.

참고로, 라이트 프로브는 ShadeSH9라는 함수를 이용해 처리하면 되고, 정점당 조명에 사용되는 광원은 Shade4PointLights라는 함수를 이용해 처리하면 됩니다. 실제로 셰이더를 어떻게 구현하면 되는지 알고 싶으면, Unity – Download Archive에서 built-in 셰이더를 내려 받아 Diffuse 셰이더에 #pragma debug를 추가한 다음에 Open compiled shader 버튼을 눌러서 열어 보면 됩니다.

참고: Unity – Forward Rendering Path Detail

Advertisements

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중