Unity의 광원은 게임 오브젝트의 Shadows 를 오브젝트 자체의 다른 부분이나 가까이 있는 다른 게임 오브젝트에 캐스트할 수 있습니다. 섀도우는 평면적으로 보일 수 있는 오브젝트에 부피감과 포지션을 더하여 씬에서 뎁스와 사실감을 살려냅니다.
광원이 하나인 단순한 씬을 생각해 보십시오. 광원에서 광선이 직선으로 나와 결국 씬의 게임 오브젝트에 부딪힐 수 있습니다. 광선이 게임 오브젝트에 부딪힌 후에는 더 멀리 이동하여 다른 것을 비출 수 없습니다. 즉, 광선은 첫 게임 오브젝트에서 “바운스”되어 게임 오브젝트를 통과하지 않습니다. 게임 오브젝트가 캐스트하는 섀도우는 빛이 닿지 않기 때문에 조명이 비춰지지 않는 영역입니다.
광원과 같은 포지션에 있는 카메라를 상상하여 다른 관점에서 생각해 볼 수 있습니다. 씬에서 섀도우 안에 있는 영역은 카메라로 볼 수 없는 영역과 일치합니다.
실제로 Unity에서는 이 방법으로 광원에서 캐스트된 섀도우의 포지션을 결정합니다. 광원에서는 카메라와 동일한 원칙에 따라 카메라의 관점에서 씬을 내부적으로 “렌더링”합니다. 씬 카메라에 사용되는 뎁스 버퍼 시스템은 광원에 가장 가까운 표면을 추적합니다. 광원의 정면에 있는 표면에는 조명이 비춰지지만 나머지 표면은 섀도우 안에 있습니다. 이 경우 뎁스 맵을 __섀도우 맵 __ 이라고 합니다. 섀도우 매핑에 대해서는 위키피디아 페이지에서 자세한 내용을 참고할 수 있습니다.
인스펙터에서 Shadow Type 프로퍼티로 개별 광원의 섀도우를 활성화할 수 있습니다.
프로퍼티: | 기능: |
---|---|
Shadow Type | Hard Shadows 설정을 사용하면 가장자리가 날카로운 섀도우가 생성됩니다. 하드 섀도우는 Soft Shadows 에 비해 특별히 사실적이지 않지만 처리가 적고 다양한 용도에서 사용할 수 있습니다. 또한 소프트 섀도우를 사용하면 섀도우 맵에서“고르지 않은” 앨리어싱 효과가 감소합니다. |
Strength | 이 프로퍼티에 따라 그림자의 어두운 정도가 결정됩니다. 일반적으로 일부 광원은 대기에 의해 흩어지고 다른 게임 오브젝트에 반사되므로 그림자를 최대 강도로 설정하지 않아도 됩니다. |
Resolution | 이 프로퍼티는 위에 언급된 섀도우 맵의 “카메라”에 대한 렌더링 해상도를 설정합니다. 섀도우의 가장자리 노출이 매우 크면 이 값을 증가시킬 수도 있습니다. |
Bias | 이 프로퍼티를 사용하여 그림자의 포지션과 정의를 미세 조정합니다. 자세한 내용은 아래의 섀도우 매핑 및 바이어스 프로퍼티를 참조하십시오. |
Normal Bias | 이 프로퍼티를 사용하여 그림자의 포지션과 정의를 미세 조정합니다. 자세한 내용은 아래의 섀도우 매핑 및 바이어스 프로퍼티를 참조하십시오. |
Shadow Near Plane | 이 프로퍼티를 사용하면 그림자를 렌더링할 때 가까운 평면에 대한 값을 선택할 수 있습니다. 이 거리보다 광원에 가까운 게임 오브젝트는 그림자를 캐스트하지 않습니다. |
씬에서 각 메시 렌더러에는 적절하게 활성화해야 하는 Cast Shadows 및 Receive Shadows 프로퍼티가 있습니다.
드롭다운 메뉴에서 On 을 선택하여 Cast Shadows 를 활성화하면 메시에 대한 새도우 캐스팅을 활성화하거나 비활성화할 수 있습니다. 또는, Two Sided 를 선택하여 섀도우가 표면의 각 면에 의해 캐스트될 수 있도록 합니다(따라서 후면 컬링은 고려대상이 아님). 보이지 않는 게임 오브젝트에서 섀도우를 캐스트할 수 있도록 하려면 Shadows Only 를 선택합니다.
지정된 광원에 대한 섀도우는 최종 씬 렌더링 중에 결정됩니다. 씬이 메인 카메라 뷰로 렌더링될 때, 뷰에서의 각 픽셀 포지션은 광원의 좌표 시스템으로 변환됩니다. 광원으로부터 픽셀의 거리는 섀도우 맵의 해당 픽셀과 비교됩니다. 픽셀이 섀도우 맵 픽셀보다 더 멀리 떨어진 경우 다른 게임 오브젝트에 의한 광원으로 그럴듯하게 가려지며 조명을 받지 않습니다.
광원이 직접 비춘 표면은 종종 섀도우에 부분적으로 표시될 수 있습니다. 섀도우 맵에서 지정된 거리에 정확하게 존재해야 하는 픽셀이 종종 멀리 있는 것으로 간주되기 때문입니다(섀도우 맵에 저해상도 이미지나 섀도우 필터링을 사용한 결과입니다). 그 결과 실제로 비춰질 때 섀도우에서 임의 패턴의 픽셀들이 나타나며 “섀도우 애크니”로 알려진 시각적 효과가 발생합니다.
섀도우 애크니를 방지하기 위해 섀도우 맵에 Bias 값을 거리에 추가하여 경계선의 픽셀이 통과해야 하는 비교를 명확하게 하거나 섀도우 맵에 렌더링할 때 노멀을 따라 게임 오브젝트를 일부 삽입하도록 할 수 있습니다. 이 값들은 섀도우가 활성화될 때 광원 인스펙터 창의 Bias 및 Normal Bias 프로퍼티에 의해 설정됩니다.
경우에 따라 섀도우를 캐스트하는 게임 오브젝트 근처에 섀도우 주변 영역이 잘못 비춰지므로 Bias 값을 너무 높게 설정하지 말아야 합니다. 이렇게 하면 섀도우가 분리되어 게임 오브젝트가 지면 위를 나는 것처럼 보이게 됩니다.
이와 유사하게, Normal Bias 값이 너무 높게 설정되면 게임 오브젝트의 섀도우가 매우 좁게 표시됩니다.
경우에 따라 Normal Bias 로 인해 근처 지오메트리의 광원이 섀도우가 캐스트되어야 하는 영역으로 번지는 “광원 번짐”이라 불리는 효과가 발생할 수 있습니다. 잠재적인 해결 방법은 게임 오브젝트의 메시 렌더러를 열고 Cast Shadows 프로퍼티를 Two Sided 로 변경합니다. 이 방법은 도움이 될 수도 있지만 더 많은 리소스가 필요하고, 씬을 렌더링할 때 성능 오버헤드가 증가할 수 있습니다.
원하지 않는 효과가 발생하지 않도록 하려면 광원용 바이어스 값을 미세 조정해야 합니다. 일반적으로 계산하기 보다 눈대중으로 적절한 값을 찾는 편이 더 수월합니다.
섀도우 애크니를 더 확실하게 방지하기 위해 Shadow pancaking이라고 하는 기법이 사용됩니다(방향 광원 새도우: 섀도우 팬케이킹 참조). 이 기능은 일반적으로 잘 작동하지만 매우 큰 삼각형에서는 시각적 결함이 발생할 수 있습니다.
이 문제를 해결하려면 Shadow Near Plane Offset 프로퍼티를 미세 조정해야 합니다. 이 값을 너무 높게 설정하면 섀도우 애크니가 발생합니다.