다음을 통해 공유


그림자 깊이 맵을 향상시키기 위한 일반적인 기술

1978년에 처음 도입된 섀도 맵은 게임에 그림자를 추가하는 일반적인 기술입니다. 3년 후 하드웨어 및 소프트웨어의 발전에도 불구하고 반짝이는 가장자리, 원근감 별칭 및 기타 정밀도 문제 등 아티팩트를 섀도링합니다.

이 기술 문서에서는 몇 가지 일반적인 그림자 깊이 맵 알고리즘 및 일반적인 아티팩트를 간략하게 설명하고, 표준 섀도 맵의 품질을 높이는 데 사용할 수 있는 몇 가지 기술(기본에서 중간까지의 난이도에 이르기까지)을 설명합니다. 일반적으로 제목에 기본 그림자 맵을 추가하는 것은 간단하지만 그림자 아티팩트 뉘앙스를 이해하는 것은 어려울 수 있습니다. 이 기술 문서는 그림자를 구현한 중간 그래픽 개발자를 위해 작성되었지만 특정 아티팩트가 나타나는 이유를 완전히 이해하지 못하며 문제를 해결하는 방법을 잘 모르고 있습니다.

특정 아티팩트 완화를 위해 올바른 기술을 선택하는 것은 매우 중요합니다. 섀도 맵 단점이 해결되면 품질 차이가 인상적일 수 있습니다(그림 1). 이러한 기술을 올바르게 구현하면 표준 그림자가 크게 향상됩니다. 이 문서에서 설명하는 기술은 DirectX SDK의 CascadedShadowMaps11 샘플에서 구현됩니다.

그림 1 심각한 아티팩트가 있는 그림자(왼쪽) 및 이 문서에 설명된 기술을 구현한 후 그림자(오른쪽)

심각한 아티팩트가 있는 그림자(왼쪽) 및 이 문서에 설명된 기술을 구현한 후 그림자(오른쪽)

그림자 깊이 맵 검토

그림자 깊이 맵 알고리즘은 2단계 알고리즘입니다. 첫 번째 패스는 조명 공간에서 깊이 맵을 생성합니다. 두 번째 패스에서 이 맵은 각 픽셀의 광원 깊이와 광원 공간 깊이 맵의 해당 깊이를 비교하는 데 사용됩니다.

그림 2. 그림자 장면의 주요 부분

그림자 장면의 주요 부분

패스 1

이 장면은 그림 2에 나와 있습니다. 첫 번째 패스(그림 3)에서 기하 도형은 조명의 관점에서 깊이 버퍼로 렌더링됩니다. 특히 꼭짓점 셰이더는 기하 도형을 조명 보기 공간으로 변환합니다.

이 첫 번째 패스의 최종 결과는 조명의 관점에서 장면의 깊이 정보를 포함하는 깊이 버퍼입니다. 이제 패스 2에서 이를 사용하여 조명에서 폐색되는 픽셀을 확인할 수 있습니다.

그림 3. 기본 섀도 매핑의 첫 번째 패스

기본 섀도 매핑의 첫 번째 패스

패스 2

두 번째 패스(그림 4)에서 꼭짓점 셰이더는 각 꼭짓점을 두 번 변환합니다. 각 꼭짓점은 카메라의 보기 공간으로 변환되고 픽셀 셰이더에 위치로 전달됩니다. 또한 각 꼭짓점은 조명의 뷰-프로젝션-텍스처 매트릭스에 의해 변환되고 픽셀 셰이더에 텍스처 좌표로 전달됩니다. 뷰 프로젝션-텍스처 행렬은 한 번의 추가 변환으로 패스 1의 장면을 렌더링하는 데 사용되는 것과 동일한 행렬입니다. 보기 공간(X 및 Y의 경우 –1에서 1)에서 텍스처 공간(X에서는 0에서 1, Y에서는 1에서 0으로)으로 점의 크기를 조정하고 변환하는 변환입니다.

픽셀 셰이더는 보간된 위치와 보간된 텍스처 좌표를 받습니다. 깊이 테스트를 수행하는 데 필요한 모든 것이 이제 이 텍스처 좌표에 있습니다. 이제 X 및 Y 텍스처 좌표를 사용하여 첫 번째 패스의 깊이 버퍼를 인덱싱하고 결과 깊이 값을 Z 텍스처 좌표와 비교하여 깊이 테스트를 수행할 수 있습니다.

그림 4. 기본 섀도 매핑의 두 번째 패스

기본 섀도 매핑의 두 번째 패스

섀도 맵 아티팩트

그림자 깊이 맵 알고리즘은 가장 널리 사용되는 실시간 섀도 알고리즘이지만 여전히 완화가 필요한 여러 아티팩트가 생성됩니다. 발생할 수 있는 아티팩트 유형은 다음에 요약됩니다.

큐브 뷰 별칭

일반적인 아티팩트인 큐브 뷰 별칭은 그림 5에 나와 있습니다. 보기 공간의 픽셀을 섀도 맵의 텍셀에 매핑하는 것이 일대일 비율이 아닌 경우에 발생합니다. 가까운 평면에 가까운 픽셀이 서로 더 가깝고 더 높은 섀도 맵 해상도가 필요하기 때문입니다.

그림 6은 그림자 맵과 보기 frustum을 보여줍니다. 눈 가까이에서 픽셀은 더 가깝고 많은 픽셀이 동일한 그림자 텍셀에 매핑됩니다. 원거리 평면의 픽셀이 분산되어 원근감 별칭이 줄어듭니다.

그림 5. 높은 원근 별칭(왼쪽) 및 낮은 원근 별칭(오른쪽)

높은 원근 별칭(왼쪽) 및 낮은 원근 별칭(오른쪽)

왼쪽 이미지의 경우 원근 별칭이 더 높습니다. 눈 공간 픽셀이 너무 많아 동일한 그림자 지도 텍셀에 매핑됩니다. 오른쪽 이미지에서는 눈 공간 픽셀과 그림자 지도 텍셀 사이에 1:1 매핑이 있기 때문에 원근감 별칭이 낮습니다.

그림 6. 그림자 맵을 사용하여 frustum 보기

그림자 맵이 있는 frustum 보기

원거리 평면의 밝은 픽셀은 낮은 원근 별칭을 나타내고, 가까운 평면의 어두운 픽셀은 높은 원근 별칭을 나타냅니다.

그림자 맵 해상도도 너무 높을 수 있습니다. 높은 해상도는 눈에 띄지 않지만, 그럼에도 불구하고 그림자를 드리우지 않고 전화선과 같은 작은 물체가 발생할 수 있습니다. 또한 해상도가 너무 높으면 텍스처 액세스 패턴으로 인해 심각한 성능 문제가 발생할 수 있습니다.

PSM(큐브 뷰 섀도 맵) 및 LSPSM(광원 공간 원근감 그림자 맵)은 필요한 눈 근처에 더 많은 텍셀을 배치하기 위해 조명의 프로젝션 매트릭스를 왜곡하여 원근감 별칭을 해결하려고 합니다. 아쉽게도 두 기술 모두 원근 별칭을 해결할 수 없습니다. 눈 공간 픽셀을 그림자 맵의 텍셀에 매핑하는 데 필요한 변환의 매개 변수화는 선형 기울이기에 의해 바인딩될 수 없습니다. 로그 매개 변수화가 필요합니다. PSM은 눈 근처에 너무 많은 세부 사항을 넣어 먼 그림자가 낮은 품질의 또는 심지어 사라지게합니다. LSPSM은 눈 근처에서 해상도를 높이고 멀리 떨어진 물체에 충분한 세부 정보를 남기는 것 사이에서 중간 지점을 찾는 더 나은 작업을 수행합니다. 두 기술 모두 일부 장면 구성에서 직교 그림자로 퇴화됩니다. 이 변형은 비용이 많이 들지만 보기 frustum의 각 면에 대해 별도의 그림자 맵을 렌더링하여 상쇄할 수 있습니다. 로그 원근감 그림자 맵(LogPSMs)도 뷰 frustum의 얼굴당 별도의 맵을 렌더링합니다. 이 기술은 비선형 래스터화를 사용하여 눈 근처에 더 많은 텍셀을 배치합니다. D3D10 및 D3D11 클래스 하드웨어는 비선형 래스터화를 지원하지 않습니다. 이러한 기술 및 알고리즘에 대한 자세한 내용은 참조 섹션을 참조하세요.

CSM(계단식 섀도 맵)은 원근 별칭을 처리하는 데 가장 인기 있는 기술입니다. CSM을 PSM 및 LSPSM과 결합할 수 있지만 불필요합니다. CSM을 사용하여 큐브 뷰 별칭 오류를 수정하는 방법은 컴패니언 문서인 Cascaded Shadow Maps에서 해결됩니다.

프로젝티브 별칭

투사 별칭은 큐브 뷰 별칭보다 표시하기 어렵습니다. 그림 7에서 강조 표시된 의도하지 않은 그림자는 투영 별칭 오류를 보여 줍니다. 투사 별칭은 카메라 공간의 텍셀과 조명 공간의 텍셀 간의 매핑이 일 대 일 비율이 아닌 경우에 발생합니다. 이는 조명 카메라와 관련하여 기하 도형의 방향 때문입니다. 투영 별칭은 기하 도형의 탄젠트 평면이 광선과 평행하게 되면 발생합니다.

그림 7. 높은 프로젝션 별칭과 낮은 프로젝션 별칭

높은 프로젝션 별칭과 낮은 프로젝션 별칭 비교

큐브 뷰 별칭 오류를 완화하는 데 사용되는 기술도 투영 별칭을 완화합니다. 표면 보통이 광원에 직교할 때 투영 별칭이 발생합니다. 이러한 표면은 확산 조명 방정식에 따라 조명을 적게 받아야 합니다.

그림자 여드름과 잘못된 자기 그림자

잘못된 자기 그림자와 동의어인 그림자 여드름(그림 8)은 그림자 맵이 전체 텍셀의 깊이를 정량화할 때 발생합니다. 셰이더가 실제 깊이를 이 값과 비교할 때는 음영이 없는 것처럼 자체 그림자로 표시될 수 있습니다.

그림자 여드름의 또 다른 이유는 조명 공간의 텍셀이 깊이 맵의 해당 텍셀 깊이에 너무 가깝기 때문에 정밀도 오류로 인해 깊이 테스트가 잘못 실패하기 때문입니다. 이러한 정밀도 차이의 한 가지 이유는 깊이 맵이 고정 함수 래스터화 하드웨어에 의해 계산된 반면 비교되는 깊이는 셰이더에 의해 계산되었기 때문입니다. 또한 투영 별칭은 그림자 여드름을 일으킬 수 있습니다.

그림 8. 그림자 여드름 아티팩트

그림자 여드름 아티팩트

왼쪽 이미지에 표시된 것처럼 일부 픽셀은 깊이 테스트에 실패하고 반점이 있는 아티팩트와 모이레 패턴을 만들었습니다. 잘못된 자기 그림자를 줄이려면 가까운 평면의 경계와 광역 뷰 frustum의 원거리 평면을 가능한 한 단단히 계산해야 합니다. 기울기 눈금 기반 깊이 바이어스 및 다른 유형의 바이어스는 그림자 여드름을 완화하는 데 사용되는 다른 솔루션입니다.

피터 패닝

피터 패닝(Peter Panning)이라는 용어는 그림자가 분리되고 비행할 수 있는 어린이 책 캐릭터에서 유래되었습니다. 이 아티팩트에서는 누락된 그림자가 있는 개체가 표면 위로 분리된 것처럼 보입니다(그림 9).

그림 9. Peter Panning 아티팩트

피터 이동 아티팩트

왼쪽 이미지에서 그림자는 개체에서 분리되어 부동 효과를 만듭니다.

표면 여드름을 제거하는 한 가지 기술은 조명 공간의 픽셀 위치에 일부 값을 추가하는 것입니다. 이를 깊이 오프셋 추가라고 합니다. 사용된 깊이 오프셋이 너무 크면 Peter Panning이 발생합니다. 이 경우 깊이 오프셋으로 인해 깊이 테스트가 잘못 전달됩니다. 그림자 여드름과 마찬가지로 깊이 버퍼에 정밀도가 부족하면 Peter Panning이 악화됩니다. 비행기와 먼 비행기 근처에서 꽉 계산하는 것은 피터 패닝을 피하는 데 도움이됩니다.

그림자 맵을 개선하는 기술

제목에 그림자를 추가하는 것은 프로세스입니다. 첫 번째 단계는 기본 섀도 맵이 작동하도록 하는 것입니다. 두 번째는 모든 기본 계산이 최적으로 수행되도록 하는 것입니다. frusta는 가능한 한 단단히 맞고, 근거리/먼 평면은 단단히 맞고, 기울기 배율 바이어스가 사용됩니다. 기본 그림자를 사용하도록 설정하고 가능한 한 멋지게 보이면 개발자는 그림자를 충분한 충실도로 만드는 데 필요한 알고리즘을 더 잘 파악할 수 있습니다. 기본 섀도 맵을 가장 잘 살펴보는 데 필요한 기본 팁이 이 섹션에서 제공됩니다.

기울기 눈금 깊이 바이어스

앞서 언급했듯이, 자기 그림자는 그림자 여드름으로 이어질 수 있습니다. 너무 많은 편견을 추가하면 피터 패닝이 발생할 수 있습니다. 또한 가파른 경사면을 가진 다각형(빛에 비해)은 얕은 기울기를 가진 다각형보다 투영 별칭으로 인해 더 많은 고통을 겪습니다(빛을 기준으로). 이 때문에 각 깊이 맵 값은 빛을 기준으로 다각형의 기울기에 따라 다른 오프셋이 필요할 수 있습니다.

Direct3D 10 하드웨어는 뷰 방향과 관련하여 기울기를 기준으로 다각형을 편향하는 기능을 가지고 있습니다. 이는 광원 방향에 가장자리가 표시되는 다각형에 큰 바이어스 적용 효과가 있지만 빛을 직접 마주하는 다각형에 바이어스는 적용하지 않습니다. 그림 10에서는 동일한 편견 없는 기울기를 테스트할 때 인접한 두 픽셀이 그림자와 음영 없는 픽셀을 번갈아 가며 사용할 수 있는 방법을 보여 줍니다.

그림 10. 비편향 깊이에 비해 기울기 크기 조정된 깊이 바이어스

비편향 깊이에 비해 기울기 크기 조정 깊이 바이어스

꽉 프로젝션 계산

광원의 프로젝션을 보기 frustum에 단단히 맞추면 그림자 맵 범위가 증가합니다. 그림 11은 임의 프로젝션을 사용하거나 장면 경계에 프로젝션을 맞추면 더 높은 원근감 별칭을 생성한다는 것을 보여 줍니다.

그림 11. 임의 그림자 frustum 및 그림자 frustum 장면에 적합

임의 그림자 frustum 및 그림자 frustum 장면에 적합

보기는 빛의 관점에서입니다. 사다리꼴은 보기 카메라의 frustum을 나타냅니다. 이미지 위에 그려진 눈금은 그림자 맵을 나타냅니다. 오른쪽 이미지는 동일한 해상도 섀도 맵이 장면에 더 밀접하게 맞을 때 더 많은 텍셀 커버리지를 생성한다는 것을 보여줍니다.

그림 12는 올바르게 맞는 프러스텀을 보여 줍니다. 프로젝션을 계산하기 위해 뷰 frustum을 구성하는 8개의 점이 조명 공간으로 변환됩니다. 다음으로 X 및 Y의 최소값과 최대값을 찾습니다. 이러한 값은 직교 프로젝션의 범위를 구성합니다.

그림 12. 섀도 프로젝션이 frustum을 보기에 적합합니다.

frustum을 보기 위한 그림자 프로젝션 맞춤

또한 더 단단한 경계를 얻기 위해 장면 AABB에 frustum을 클리핑 할 수 있습니다. 이는 조명 카메라 프로젝션의 크기를 프레임에서 프레임으로 변경할 수 있기 때문에 모든 경우에 권장되지 않습니다. 광원 텍셀 크기 증분 이동 섹션에 설명된 것과 같은 많은 기술은 조명 프로젝션의 크기가 모든 프레임에서 일정하게 유지될 때 더 나은 결과를 제공합니다.

근거리 평면 및 원거리 평면 계산

가까운 평면과 원거리 평면은 프로젝션 행렬을 계산하는 데 필요한 마지막 조각입니다. 평면이 더 밀접하게 결합할수록 깊이 버퍼의 값이 더 정확합니다.

깊이 버퍼는 값이 0에서 1 사이인 16비트, 24비트 또는 32비트일 수 있습니다. 일반적으로 깊이 버퍼는 고정 지점이며, 가까운 평면에 가까운 값은 원거리 평면에 가까운 값보다 더 밀접하게 그룹화됩니다. 깊이 버퍼에 사용할 수 있는 정밀도는 가까운 평면과 원거리 평면의 비율에 따라 결정됩니다. 가능한 가장 좁은 근거리/먼 평면을 사용하면 16비트 깊이 버퍼를 사용할 수 있습니다. 16비트 깊이 버퍼는 처리 속도를 높이면서 메모리 사용을 줄일 수 있습니다.

AABB 기반 근거리 평면 및 원거리 평면

근거리 평면과 원거리 평면을 계산하는 쉽고 순진한 방법은 장면의 경계 볼륨을 조명 공간으로 변환하는 것입니다. 가장 작은 Z 좌표 값은 가까운 평면이고 가장 큰 Z 좌표 값은 원거리 평면입니다. 장면 및 조명의 많은 구성에서 이 방법은 충분합니다. 그러나 최악의 시나리오는 깊이 버퍼에서 정밀도가 크게 손실될 수 있습니다. 그림 13은 이러한 시나리오를 보여줍니다. 여기서 먼 평면에 가까운 비행기의 범위는 필요한 것보다 4 배 더 큽다.

그림 13의 보기 frustum은 의도적으로 작게 선택되었습니다. 작은 보기 frustum은 보기 카메라에서 확장 기둥으로 구성된 매우 큰 장면에 표시됩니다. 근거리 및 원거리 평면에 장면 AABB를 사용하는 것은 최적이 아닙니다. Cascaded Shadow Maps 기술 문서에 설명된 CSM 알고리즘은 매우 작은 frustum에 대해 근거리 및 원거리 평면을 계산해야 합니다.

그림 13. 장면 AABB를 기반으로 하는 근거리 및 원거리 평면

장면 aabb를 기반으로 하는 근거리 및 원거리 비행기

Frustum 기반 근거리 평면 및 원거리 평면

근거리 및 원거리 평면을 계산하는 또 다른 기술은 프러스텀을 광공간으로 변환하고 Z의 최소값과 최대값을 각각 근거리 및 원거리 평면으로 사용하는 것입니다. 그림 14에서는 이 방법의 두 가지 문제를 보여 줍니다. 첫째, frustum이 장면의 기하 도형을 넘어 확장되는 경우처럼 계산이 너무 보수적입니다. 둘째, 가까운 평면이 너무 꽉 차서 그림자 캐스터가 잘려질 수 있습니다.

그림 14. 보기 frustum에만 기반한 근거리 및 원거리 평면

보기 frustum에만 기반한 근거리 및 원거리 평면

장면과 교차된 광원과 교차하여 근거리 및 원거리 평면 계산

근사 및 원거리 평면을 계산하는 적절한 방법은 그림 15에 나와 있습니다. 직교 광원 frustum의 평면 중 4개는 광원 공간에서 보기 frustum의 X 및 Y 좌표의 최소값과 최대값을 사용하여 계산되었습니다. 직교 뷰 frustum의 마지막 두 평면은 가까운 먼 평면입니다. 이러한 평면을 찾기 위해 장면의 경계는 알려진 네 개의 밝은 프러스텀 평면에 대해 잘립니다. 새로 잘린 경계에서 가장 작고 가장 큰 Z 값은 각각 가까운 평면과 원거리 평면을 나타냅니다.

이 작업을 수행하는 코드는 CascadedShadowMaps11 샘플에 있습니다. 세계의 AABB를 구성하는 8점은 조명 공간으로 변환됩니다. 점을 광원 공간으로 변환하면 클리핑 테스트가 간소화됩니다. 이제 밝은 프러스텀의 알려진 4개의 평면을 선으로 나타낼 수 있습니다. 광원 공간의 장면 경계 볼륨은 6개의 사분면으로 표현될 수 있습니다. 이러한 6개의 사분면은 삼각형 기반 클리핑을 위해 12개의 삼각형으로 변환할 수 있습니다. 삼각형은 뷰 프러스텀의 알려진 평면에 대해 잘립니다(밝은 공간에서 X 및 Y의 가로 및 세로 선). X와 Y에서 교차점을 발견하면 3D 삼각형이 해당 지점에서 잘립니다. 잘린 모든 삼각형의 최소 및 최대 Z 값은 가까운 평면과 원거리 평면입니다. CascadedShadowMaps11 샘플은 ComputeNearAndFar 함수에서 이 클리핑을 수행하는 방법을 보여 줍니다.

가능한 가장 좁은 근거리 및 원거리 평면을 계산하는 데 사용할 수 있는 두 가지 기술이 더 있습니다. 이러한 기술은 CascadedShadowMaps 샘플에 표시되지 않습니다.

  • 장면의 계층 구조나 장면의 개별 개체를 광원에 대해 교차하여 근거리 및 원거리 평면을 더 단단하게 계산할 수 있습니다. 계산이 더 복잡합니다. CascadedShadowMaps11 샘플에는 표시되지 않았지만 일부 타일에 대해 유효한 기술일 수 있습니다.

  • 최소값을 사용하여 원거리 평면을 계산할 수 있습니다.

    • 광원 공간의 뷰 frustum의 가장 큰 깊이입니다.
    • 뷰 프러스텀과 장면 AABB의 교집합에서 가장 큰 깊이입니다.

이 방법은 뷰 frustum 외부에서 인덱싱할 수 있는 계단식 그림자 맵과 함께 사용할 때 문제가 될 수 있습니다. 이 경우 그림자 맵에 기하 도형이 누락되었을 수 있습니다.

그림 15. 광 프러스텀의 계산된 4개의 평면과 장면의 경계 기하 도형의 교집합을 기반으로 하는 근거리 및 원거리 평면

광 프러스텀의 계산된 4개의 평면과 장면의 경계 기하 도형의 교집합을 기반으로 하는 근거리 및 원거리 평면

텍셀 크기 증분에서 조명 이동

그림자 맵의 일반적인 아티팩트가 반짝이는 가장자리 효과입니다. 카메라가 움직이면 그림자 가장자리를 따라 픽셀이 밝아지고 어둡게 됩니다. 이것은 스틸 이미지에서 볼 수 없지만 실시간으로 매우 눈에 띄고 산만합니다. 그림 16에서는 이 문제를 강조 표시하고 그림 17은 그림자 가장자리의 모양을 보여 줍니다.

반짝이는 에지 오류는 카메라가 움직일 때마다 조명 프로젝션 매트릭스가 다시 계산되기 때문에 발생합니다. 이렇게 하면 생성된 섀도 맵에 미묘한 차이가 생깁니다. 다음 모든 요소는 장면을 바인딩하기 위해 만든 행렬에 영향을 줄 수 있습니다.

  • 뷰 frustum의 크기
  • 뷰 frustum의 방향
  • 조명의 위치
  • 카메라의 위치

이 행렬이 변경 될 때마다 그림자 가장자리가 변경 될 수 있습니다.

그림 16. 반짝이는 그림자 가장자리

반짝이는 그림자 가장자리

카메라가 왼쪽에서 오른쪽으로 이동하면 그림자 테두리를 따라 픽셀이 그림자로 들어오고 나옵니다.

그림 17. 반짝이는 가장자리가 없는 그림자

반짝이는 가장자리가 없는 그림자

카메라가 왼쪽에서 오른쪽으로 이동하면 그림자 가장자리가 일정하게 유지됩니다.

방향 표시등의 경우 이 문제의 해결 방법은 X 및 Y의 최소/최대값(직교 투영 범위를 구성)을 픽셀 크기 증분으로 반올림하는 것입니다. 이 작업은 나누기 작업, 바닥 작업 및 곱하기로 수행할 수 있습니다.

        vLightCameraOrthographicMin /= vWorldUnitsPerTexel;
        vLightCameraOrthographicMin = XMVectorFloor( vLightCameraOrthographicMin );
        vLightCameraOrthographicMin *= vWorldUnitsPerTexel;
        vLightCameraOrthographicMax /= vWorldUnitsPerTexel;
        vLightCameraOrthographicMax = XMVectorFloor( vLightCameraOrthographicMax );
        vLightCameraOrthographicMax *= vWorldUnitsPerTexel;

vWorldUnitsPerTexel 값은 뷰 frustum의 경계를 사용하고 버퍼 크기로 나누어 계산됩니다.

        FLOAT fWorldUnitsPerTexel = fCascadeBound /
        (float)m_CopyOfCascadeConfig.m_iBufferSize;
        vWorldUnitsPerTexel = XMVectorSet( fWorldUnitsPerTexel, fWorldUnitsPerTexel,                            0.0f, 0.0f );

보기 frustum의 최대 크기를 경계로 지정하면 직교 프로젝션에 더 느슨하게 맞습니다.

이 기술을 사용할 때는 텍스처의 너비와 높이가 1픽셀 더 커야 합니다. 이렇게 하면 그림자 좌표가 섀도 맵 외부의 인덱싱에서 제외됩니다.

백페이스 및 전면

그림자 맵은 표준 백페이스 컬링, 뷰어가 볼 수 없는 개체의 래스터화를 건너뛰고 장면 렌더링 속도를 향상하는 프로세스로 렌더링되어야 합니다. 또 다른 일반적인 옵션은 전면 컬링을 사용하도록 설정된 섀도 맵을 렌더링하는 것입니다. 즉, 뷰어를 향한 개체가 제거됩니다. 이는 개체의 뒷면을 구성하는 기하 도형이 약간 오프셋되므로 자체 그림자를 적용하는 데 도움이 된다는 것입니다. 이 아이디어에는 두 가지 문제가 있습니다.

  • 부적절한 앞면 또는 뒷면 기하 도형이 있는 개체는 그림자 맵에 아티팩트가 발생합니다. 그러나 앞면 또는 후면 기하 도형이 잘못되면 다른 문제가 발생하므로 앞면 및 후면 기하 도형이 올바르게 수행된다고 가정하는 것이 안전할 수 있습니다. 단풍과 같은 스프라이트 기반 기하 도형에 대한 백페이스(back faces)를 만드는 것은 비실용적일 수 있습니다.
  • 그림자 깊이 차이가 너무 작기 때문에 벽과 같은 물체의 밑부분에 있는 피터 이동 및 그림자 간격이 발생할 가능성이 더 높습니다.

그림자 지도– 친숙한 기하 도형

그림자 맵에서 잘 작동하는 기하 도형을 만들면 Peter Panning 및 섀도 여드름과 같은 아티팩트와 싸우는 경우 더 많은 유연성을 사용할 수 있습니다.

단단한 가장자리는 자기 그림자에 문제가 있습니다. 가장자리 끝 근처의 깊이 차이는 매우 작습니다. 작은 오프셋도 개체의 그림자를 잃을 수 있습니다(그림 18).

그림 18. 날카로운 가장자리는 오프셋과 낮은 깊이 차이에서 비롯되는 아티팩트 발생

날카로운 가장자리는 오프셋과 낮은 깊이 차이에서 비롯되는 아티팩트 발생

벽과 같은 좁은 개체에는 보이지 않더라도 등받이가 있어야 합니다. 이렇게 하면 깊이 차이가 증가합니다.

기하 도형이 향하고 있는 방향이 올바른지 확인하는 것도 중요합니다. 즉, 개체의 바깥쪽은 뒤로 향해야 하며 개체의 내부는 전면에 있어야 합니다. 이는 백페이스 컬링을 사용하도록 설정된 렌더링과 깊이 바이어스의 효과 방지에 중요합니다.

중첩된 섀도 맵

Cascaded 섀도 맵 및 CascadedShadowMaps11 샘플 앱도 참조하세요. 이 샘플에서는 CSM(계단식 섀도 맵) 알고리즘과 그림자 맵을 효율적으로 사용하는 데 사용할 수 있는 몇 가지 기술을 보여 줍니다.

샘플은 DirectX SDK(소프트웨어 개발 키트)에서 찾을 수 있습니다. 또는 웹 검색을 수행하여 GitHub에서 찾을 수 있습니다.

요약

이 문서에서 설명하는 기술을 사용하여 표준 섀도 맵의 품질을 높일 수 있습니다. 다음 단계는 표준 섀도 맵에서 잘 작동할 수 있는 기술을 살펴보는 것입니다. CSM은 관점 별칭을 방지하기 위한 우수한 기술로 권장됩니다. 백분율 더 가까운 필터링 또는 분산 그림자 맵을 사용하여 그림자 가장자리를 부드럽게 할 수 있습니다. 자세한 내용은 Cascaded Shadow Maps 기술 문서를 참조하세요.

도넬리, 더블유, 로리첸, A. 가변성 그림자 지도. 대화형 3D 그래픽 심포지엄, 대화형 3D 그래픽 및 게임에 대한 2006 심포지엄의 절차. 2006, pp. 161-165.

엥겔, 워플강 F. 섹션 4. 계단식 그림자 지도. ShaderX5, Advanced Rendering Techniques, Wolfgang F. Engel, Ed. 찰스 리버 미디어, 보스턴, 매사추세츠. 2006. pp. 197-206.

스태밍거, 마크, 드레다키스, 조지. 원근 그림자 맵. 컴퓨터 그래픽 및 대화형 기술에 대한 국제 회의, 컴퓨터 그래픽 및 대화형 기술에 대한 제29회 연례 회의 절차. 2002, pp 557-562.

Wimmer, M., Scherzer, D., Purgathofer, W. 연한 공간 원근 그림자 맵. 렌더링의 유로그래픽 심포지엄. 2004. 2005년 6월 10일 수정. Technische Universität Wien.