섀도 매핑

Shadow mapping
섀도 매핑이 있는 장면
그림자가 없는 장면

섀도 매핑 또는 섀도잉 투영그림자를 3D 컴퓨터 그래픽에 추가하는 과정이다.이 개념은 1978년 랜스 윌리엄스에 의해 "곡선 표면에 곡선 그림자 주물"이라는 제목의 논문에서 소개되었다.[1]이후 많은 콘솔과 PC 게임에서 사전 렌더링된 장면과 실시간 장면에 모두 사용됐다.

그림자는 화소를 광원에서 볼 수 있는지 테스트하여 화소를 질감 형태로 저장된 광원 [2] z-버퍼 또는 깊이 영상에 비교함으로써 생성된다.

그림자 및 그림자 지도의 원리

만약 당신이 빛의 원천에서 밖을 내다본다면, 당신이 볼 수 있는 모든 물체가 빛으로 나타날 것이다.그러나 그 물체 뒤에 있는 것은 모두 그림자에 가려져 있을 것이다.이것은 그림자 지도를 만들 때 사용하는 기본 원칙이다.빛의 시야는 렌더링되어 보이는 모든 표면의 깊이(그림자 지도)를 저장한다.다음으로, 정규 장면은 이 깊이 지도에 그려진 모든 점의 깊이(눈이 아닌 빛에 의해 보여지는 것처럼)를 비교한다.

이 기법은 섀도 볼륨에 비해 정확도가 떨어지지만 특정 애플리케이션의 어느 기법에나 어느 정도의 채우기 시간이 필요한지에 따라 섀도 맵이 더 빠른 대안이 될 수 있어 실시간 어플리케이션에 더 적합할 수 있다.또한 섀도 맵은 추가 스텐실 버퍼의 사용이 필요 없으며 부드러운 가장자리로 섀도를 생성하도록 수정할 수 있다.그러나 섀도 볼륨과 달리 섀도 맵의 정확도는 해상도에 의해 제한된다.

알고리즘 개요

그림자 장면을 렌더링하는 데는 두 가지 주요 그리기 단계가 포함된다.첫 번째는 섀도맵 자체를 제작하고, 두 번째는 현장에 적용한다.구현(및 조명 수)에 따라 2회 이상의 도면 패스가 필요할 수 있다.

섀도 맵 만들기

라이트 뷰에서 렌더링된 장면.
라이트 뷰의 씬(scene), 깊이 지도.

첫걸음이 빛의 관점에서 그 장면을 렌더링한다.점 광원의 경우, 관점은 원하는 효과 각도만큼 넓은 원근 투영이어야 한다(그것은 일종의 사각 스포트라이트가 될 것이다).방향 조명(: 태양으로부터의 조명)의 경우 직교 투영을 사용해야 한다.

이 렌더링에서 깊이 버퍼를 추출하여 저장한다.깊이 정보만 관련되기 때문에 그리기 시간을 절약하기 위해 컬러 버퍼 업데이트를 피하고 이 렌더링에 대한 모든 조명 및 텍스처 계산을 비활성화하는 것이 일반적이다.깊이 맵은 종종 그래픽 메모리에 텍스처로 저장된다.

이 깊이 지도는 조명 또는 장면 내 물체에 대한 변경이 있을 때마다 업데이트해야 하지만 보기 카메라만 이동하는 경우와 같은 다른 상황에서는 재사용할 수 있다.(여러 개의 조명이 있는 경우, 각 조명에 대해 별도의 깊이 지도를 사용해야 한다.)

많은 구현에서 지도를 다시 그리는 데 걸리는 시간을 절약하기 위해 장면에 있는 객체의 부분 집합만 섀도 맵에 렌더링하는 것이 실용적이다.또한 다음 단계에서 깊이 맵 값이 그리려는 표면 깊이(즉, 그림자 주물 표면)에 가까운 스티치 문제를 해결하기 위해 조명에서 물체를 이동시키는 깊이 오프셋을 섀도 맵 렌더링에 적용할 수 있다.또는 앞면을 도려내고 물체의 뒷면만 섀도 맵으로 렌더링하는 경우도 있다.

장면 음영 처리

두 번째 단계는 섀도 맵을 적용하면서 일반적인 카메라 시각에서 장면을 그리는 것이다.이 과정에는 세 가지 주요 구성요소가 있는데, 첫째는 빛에서 보이는 물체의 좌표를 찾는 것이고, 둘째는 그 좌표를 깊이 지도와 비교하는 시험이며, 마지막으로 달성한 후에는 물체를 그림자 또는 빛으로 그려야 한다.

광공간 좌표

씬(scene)에 투사된 깊이 맵의 시각화

깊이 맵에 대해 점을 테스트하기 위해 장면 좌표에서 점의 위치를 빛이 보는 것과 동등한 위치로 변환해야 한다.이것은 행렬의 곱셈에 의해 이루어진다.화면에서 객체의 위치는 통상적인 좌표 변환에 의해 결정되지만, 두 번째 좌표 세트를 생성하여 광공간에서 객체를 찾아야 한다.

세계 좌표를 빛의 시야 좌표로 변환하는 데 사용되는 매트릭스는 첫 번째 단계에서 그림자 지도를 렌더링할 때 사용한 매트릭스와 동일하다(OpenGL에서 이것은 모델 뷰와 투영 매트릭스의 제품이다).이를 통해 원근분할(3D 투영 참조)이 필요한 균일한 좌표 세트를 생성해 장치 좌표를 표준화하는데, 이 경우 각 구성 요소(x, y 또는 z)가 -1과 1(조명 뷰에서 보이는 경우) 사이에 해당된다.많은 구현(OpenGL, Direct3D 등)에는 깊이 맵(혼합 맵) 조회를 위해 더 일반적인 좌표인 -1 ~ 1 값을 0 ~ 1로 매핑하기 위해 추가 스케일 바이어스 매트릭스 곱셈이 필요하다.이러한 스케일링은 투시 분할 전에 수행될 수 있으며, 이 매트릭스에 다음 항목을 곱하여 이전의 변환 계산으로 쉽게 접을 수 있다.

셰이더 또는 기타 그래픽 하드웨어 확장을 사용한 경우, 이 변환은 보통 정점 레벨에서 적용되며 생성된 값은 다른 정점 사이에 보간되어 단편 레벨로 전달된다.

깊이 지도 시험

깊이 맵 테스트 실패.

일단 광공간 좌표가 발견되면, x와 y 값은 보통 깊이 지도 질감의 위치에 해당하며, z 값은 관련 깊이와 일치하며, 이제 깊이 지도에 대해 시험할 수 있다.

z 값이 적절한 (x,y) 위치에서 깊이 맵에 저장된 값보다 큰 경우, 객체는 외부 물체 뒤에 있는 것으로 간주되며, 도면 프로세스에 의해 그림자에 그려질 수 있는 실패로 표시되어야 한다.그렇지 않으면 불을 붙여야 한다.

(x,y) 위치가 깊이 지도 밖에 있는 경우 프로그래머는 표면이 기본적으로 켜지거나 그림자처럼 켜져야 한다고 결정해야 한다(일반적으로 켜짐).

셰이더 구현에서 이 테스트는 단편적인 수준에서 수행될 것이다.또한 하드웨어에서 사용할 텍스처 맵 저장 유형을 선택할 때 주의해야 한다: 보간 작업을 수행할 수 없는 경우 섀도우의 가장자리가 날카롭고 들쭉날쭉한 것처럼 보일 것이다(섀도 맵 해상도를 높이면 줄일 수 있는 효과).

단순히 통과하거나 실패하는 것이 아니라 값의 범위(그림자 가장자리의 근접도를 바탕으로)를 이용하여 부드러운 가장자리로 그림자를 생성하도록 깊이 지도 시험을 수정할 수 있다.

섀도 매핑 기법도 수정해 조명 부위에 텍스처를 그려 프로젝터의 효과를 시뮬레이션할 수 있다.자막 위에 '현장에 투사된 깊이 지도 시각화'라는 그림이 그런 과정을 보여주는 사례다.

장면 그리기

주변 그림자와 함께 렌더링되는 마지막 장면.

그림자로 장면을 그리는 것은 몇 가지 다른 방법으로 할 수 있다.프로그램 가능한 셰이더를 사용할 수 있는 경우, 결과에 따라 단순히 물체를 그림자로 그리거나 조명으로 그리는 파편 셰이더에 의해 깊이 맵 테스트를 수행할 수 있으며, 단일 패스(섀도 맵 생성을 위한 초기 통과 후)로 장면을 그릴 수 있다.

쉐이더를 사용할 수 없는 경우, 깊이 맵 테스트 수행은 일반적으로 일부 하드웨어 확장(예: GL_ARB_shadow)에 의해 수행되어야 하며, 일반적으로 두 가지 조명 모델(라이트 및 섀도우) 중에서 선택할 수 없으며, 더 많은 렌더링 패스가 필요하다.

  1. 전체 장면을 그림자로 렌더링하십시오.가장 일반적인 조명 모델(Phong reflection model 참조)의 경우, 이것은 기술적으로 빛의 주변 요소만을 사용하여 수행되어야 하지만, 일반적으로 곡면 표면이 그림자에서 평평하게 나타나지 않도록 조광 확산 조명을 포함하도록 조정된다.
  2. 깊이 맵 테스트를 활성화하고 씬(scene)을 켜십시오.깊이 맵 테스트가 실패한 영역은 덮어쓰지 않고 그림자로 남아 있게 된다.
  3. 추가 조명 각각에 대해 추가 패스를 사용할 수 있으며, 추가 블렌딩을 사용하여 그 효과를 이미 그려진 조명과 결합할 수 있다. (각 패스는 관련 섀도 맵을 생성하기 위해 추가 이전 패스를 필요로 한다.)

이 글의 예시 사진은 OpenGL 확장자 GL_ARB_shadow_ambient를 사용하여 섀도 맵 프로세스를 두 번의 패스로 달성하였다.

섀도 맵 실시간 구현

실시간 섀도 맵핑의 주요 단점 중 하나는 섀도 맵의 크기와 깊이가 최종 섀도 품질을 결정한다는 점이다.이것은 보통 앨리어싱 또는 섀도 연속성 결함으로 보인다.이러한 한계를 극복하는 간단한 방법은 섀도 맵 크기를 늘리는 것이지만 메모리, 컴퓨터 또는 하드웨어 제약 때문에 항상 가능한 것은 아니다.이러한 한계를 피하기 위해 실시간 섀도 매핑에 일반적으로 사용되는 기법이 개발되었다.여기에는 Cascaded Shadow Maps,[3] Trapezoidal Shadow Maps,[4] Light Space Perspective Shadow Maps [5]또는 Parallel-Split Shadow Maps가 포함된다.[6]

또 눈에 띄는 점은 생성된 그림자가 앨리어싱 프리라도 하드 에지를 가지고 있다는 점인데, 이것이 항상 바람직한 것은 아니다.현실 세계의 부드러운 그림자를 에뮬레이트하기 위해, 그림자 맵에서 여러 번 룩업을 하거나 소프트 에지를 에뮬레이트하기 위한 기하학적 구조를 생성하거나, 비표준 깊이 섀도 맵을 만드는 등 여러 해법이 개발되었다.이러한 예로는 Percent Closure Filtering,[7] Smoothies [8]및 Division Shadow 맵이 있다.[9]

섀도 매핑 기법

심플

  • SSM "단순"

쪼개기

워핑

스무딩

필터링

부드러운 그림자

모둠

잡다한

  • 그림자 깊이 맵(SDM)[10]
  • 투시 섀도 맵(PSM)
  • LSPSM(Light Space Perspective Shadow Maps)
  • 계단식 섀도 맵(CSM)[11]
  • VSM([12]분산 섀도 맵)

참고 항목

추가 읽기

참조

  1. ^ Lance Williams. "Casting curved shadows on curved surfaces" (PDF). Retrieved 2020-12-22. {{cite journal}}:Cite 저널은 필요로 한다. journal=(도움말)
  2. ^ Akenine-Mo ̈ller, Tomas; Haines, Eric; Hoffman, Naty (2018-08-06). Real-Time Rendering, Fourth Edition. CRC Press. ISBN 978-1-351-81615-1.
  3. ^ "Cascaded shadow maps" (PDF). NVidia. Retrieved 2008-02-14{{inconsistent citations}} {{cite journal}}:Cite 저널은 필요로 한다. journal=(도움말)CS1 maint: 포스트스크립트(링크)
  4. ^ Tobias Martin; Tiow-Seng Tan. "Anti-aliasing and Continuity with Trapezoidal Shadow Maps". Retrieved 2008-02-14. {{cite journal}}:Cite 저널은 필요로 한다. journal=(도움말)
  5. ^ Michael Wimmer; Daniel Scherzer; Werner Purgathofer. "Light Space Perspective Shadow Maps". Retrieved 2008-02-14. {{cite journal}}:Cite 저널은 필요로 한다. journal=(도움말)
  6. ^ Fan Zhang; Hanqiu Sun; Oskari Nyman. "Parallel-Split Shadow Maps on Programmable GPUs". GPU Gems 3. Archived from the original on January 17, 2010. Retrieved 2008-02-14.
  7. ^ "Shadow Map Antialiasing". NVidia. Retrieved 2008-02-14.
  8. ^ Eric Chan, Fredo Durand, Marco Corbetta. "Rendering Fake Soft Shadows with Smoothies". Retrieved 2008-02-14. {{cite journal}}:Cite 저널은 필요로 한다. journal=(도움말)CS1 maint: 여러 이름: 작성자 목록(링크)
  9. ^ William Donnelly; Andrew Lauritzen. "Variance Shadow Maps". Retrieved 2008-02-14.
  10. ^ "Common Techniques to Improve Shadow Depth Maps". Msdn.microsoft.com. Retrieved November 7, 2021.
  11. ^ "Cascaded Shadow Maps". Msdn.microsoft.com. Retrieved November 7, 2021.
  12. ^ Donnelly, William; Lauritzen, Andrew (14 March 2006). "Variance shadow maps". Association for Computing Machinery. pp. 161–165. doi:10.1145/1111411.1111440. Retrieved 7 November 2021 – via ACM Digital Library.

외부 링크