섀도 매핑
소개
섀도 매핑은 3D 씬에 실시간 그림자를 제공하기 위한 일반적인 기법입니다. 이는 광원의 관점에서 뎁스 맵 텍스처를 렌더링하는 방식으로 작동합니다. 그런 다음 3D 모델의 픽셀을 음영 처리할 때 해당 픽셀의 깊이 값을 뎁스 맵과 비교하여 그림자가 있는 경우 더 어둡게, 빛이 비추는 경우 더 밝게 음영 처리합니다.
그림자는 장면의 지각적 사실감을 더하고 오브젝트의 상대적 위치를 더 쉽게 판단할 수 있게 해줍니다.
이미지의 왼쪽 장면에서는 물체가 평면에서 얼마나 멀리 떨어져 있는지 알 수 없지만 오른쪽 장면에서는 그림자를 통해 쉽게 알 수 있습니다.
Qt는 세 가지 조명 유형( DirectionalLight, PointLight, SpotLight) 모두에 대한 그림자 매핑을 지원합니다. 씬에서 그림자를 활성화하려면 먼저 castsShadow 를 true
로 설정하여 그림자를 드리우도록 조명을 설정해야 합니다. 그런 다음 castsShadows 와 receivesShadows 를 true
또는 false
로 설정하여 어떤 모델이 그림자를 드리우고 받을지 제어할 수 있습니다.
디렉셔널 라이트
방향성 조명은 무한히 멀리 떨어진 식별할 수 없는 광원에서 한 방향으로 빛을 방출합니다. 이는 실생활에서 햇빛이 작동하는 방식과 유사합니다. 방향성 조명은 범위가 무한하며 감소하지 않습니다.
계단식 그림자 맵
DirectionalLight 의 한 가지 문제점은 전체 장면을 빛의 관점에서 렌더링한다는 것입니다. 섀도맵의 크기가 적절하지 않으면 그림자가 뭉개져 보일 수 있습니다. 더 나은 렌더링 품질을 얻기 위한 한 가지 옵션은 캐스케이딩 섀도맵(CSM)을 사용하는 것입니다. Qt는 패럴렐 분할 섀도 맵(PSSM)이라는 CSM 버전을 지원합니다. PSSM은 뷰 프러스텀을 여러 부분으로 분할하고 각 부분에 대한 섀도맵을 렌더링하는 방식으로 작동합니다.
이 그림은 PSSM 분할이 적용된 뷰 프러스텀의 추상적인 이미지를 보여줍니다. 두 개의 분할이 세 개의 캐스케이드로 끝납니다.
이렇게 하면 화질이 더 눈에 띄는 카메라에 가까울수록 섀도맵 해상도를 높이고 화질이 덜 눈에 띄는 카메라에서 멀어질수록 해상도를 낮출 수 있습니다.
위 그림은 분할이 없는 섀도맵(왼쪽)과 분할이 3개 있는 섀도맵(오른쪽)을 보여줍니다.
csmNumSplits 프로퍼티로 캐스케이드 분할 수를 제어하고 csmSplit1, csmSplit2, csmSplit3 프로퍼티로 분할 위치를 제어할 수 있습니다. 분할 사이의 전환을 멋지게 보이게 하려면 csmBlendRatio 속성을 사용하여 분할 사이에 일정량의 블렌딩을 지정할 수 있습니다.
위 그림은 블렌딩이 활성화되지 않은 캐스케이드 심을 확대한 보기를 보여줍니다.
분할을 추가할 때마다 애플리케이션이 다른 섀도맵을 렌더링해야 하므로 성능에 부정적인 영향을 미친다는 점에 유의하세요. 블렌드 영역의 크기는 성능에 영향을 미치므로 가능한 한 작게 유지하세요.
포인트 라이트
PointLight 은 구체로 설명할 수 있으며, 빛의 중심에서 지정된 반경까지 모든 방향으로 동일한 강도로 빛을 방출합니다. 이는 전구가 빛을 발산하는 방식과 유사합니다.
PointLight 에서는 섀도맵을 큐브맵으로 렌더링하므로 6번의 렌더링 패스를 거치게 됩니다. 이는 계산 비용이 상당히 많이 들 수 있습니다.
스포트 라이트
SpotLight 는 coneAngle 속성으로 정의된 원뿔 모양으로 한 방향을 향해 빛을 방출합니다. coneAngle 에 접근하면 빛의 강도가 감소합니다. 빛의 강도가 감소하기 시작하는 각도는 innerConeAngle 에 의해 정의됩니다. 이는 손전등이나 스포트라이트가 빛을 발산하는 방식과 유사합니다.
PointLight 과 달리 SpotLight 은 섀도맵을 단일 뎁스 맵으로 렌더링합니다.
성능 및 장면 조정
Qt는 섀도 매핑과 관련된 속성에 대해 합리적인 기본값을 제공하려고 노력하지만 일반적으로 특정 장면에 맞게 조정해야 할 필요가 있습니다. 특히 예상보다 훨씬 작거나 큰 씬이 있는 경우 더욱 그렇습니다. 다음 섹션에서는 가능한 한 좋은 성능을 유지하면서 섀도 맵을 멋지게 보이도록 값을 조정하는 방법에 대해 자세히 설명합니다.
섀도 바이어스
Shadow bias 는 일반적으로 특정 패턴으로 나타나는 잘못된 그림자인 이른바 그림자 여드름을 제거하는 방법입니다. 섀도 바이어스는 섀도 맵 깊이 텍스처를 상쇄하여 그림자가 섀도잉 오브젝트에서 더 멀리 나타나도록 하여 섀도 여드름을 수정하는 경우가 많습니다. 단점은 섀도 바이어스가 너무 많으면 그림자가 섀도잉 오브젝트에서 너무 멀리 떨어져 있는 피터 패닝이라는 효과가 발생할 수 있다는 것입니다. 섀도맵 해상도를 높여서 섀도 여드름을 줄일 수도 있습니다.
위 이미지는 섀도 바이어스가 0인 장면(왼쪽)과 섀도 바이어스가 10인 장면(오른쪽)을 보여줍니다. 왼쪽 장면은 원뿔과 원통의 상단에 잘못된 그림자가 있습니다.
섀도맵 해상도
섀도맵의 해상도/품질은 shadowMapQuality 속성으로 제어됩니다. 섀도맵 품질이 높을수록 그림자의 뭉개짐은 감소하지만 렌더링 비용이 더 많이 들기 때문에 필요한 시각적 품질을 유지하면서 가능한 한 낮게 설정합니다.
위 이미지는 섀도맵 해상도가 낮은 씬과 높은 섀도맵 해상도를 가진 씬을 보여줍니다.
소프트 섀도 품질
소프트 섀도우는 그림자가 가장자리에서 더 단단해졌다가 부드러워지는 실제 그림자 모양에 근접하는 방법입니다. 소프트 섀도우 품질은 softShadowQuality 속성으로 제어됩니다. 이 속성은 부드러움이 없는 하드 섀도우와 다양한 품질의 퍼센트 근접 필터링(PCF) 소프트 섀도우를 지원합니다. 하드 섀도우는 렌더링 비용이 가장 저렴하며 PCF는 품질이 높을수록 점점 더 비싸지게 됩니다. 소프트 섀도우의 반경을 제어하려면 pcfFactor 속성을 사용합니다. pcfFactor 값은 렌더링 속도에 영향을 미치지 않지만, 이 값이 높을수록 소프트 섀도우 품질이 높아져야 보기 좋게 보입니다.
위 이미지는 왼쪽에 softShadowQuality Light.Hard
섀도가 있는 장면과 오른쪽에 softShadowQuality Light.PCF32
및 pcfRadius 10
가 있는 장면을 보여줍니다.
원거리 섀도맵
shadowMapFar 속성을 사용하여 섀도맵의 최대 거리를 제어할 수 있습니다. 이 속성은 PointLight 및 SpotLight 과 DirectionalLight 에 대해 약간 다르게 작동합니다.
PointLight/SpotLight 의 경우 렌더링된 그림자의 바운딩 박스의 크기를 결정하지만 DirectionalLight 의 경우 장면의 카메라로부터 섀도 맵이 장면에서 얼마나 멀리 커버해야 하는지를 정의합니다.
위 이미지는 동일한 씬에 동일한 방향광을 사용하지만 shadowMapFar 에 대해 두 가지 다른 값을 보여줍니다.
이미지 기반 조명 및 라이트맵과 전역 조명사용도참조하십시오 .
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.