음영 볼륨

Shadow volume
Doom 3에서 Carmack의 스텐실 그림자의 예

그림자 볼륨은 렌더링된 장면에 그림자를 추가하기 위해 3D 컴퓨터 그래픽에서 사용되는 기술입니다.그것들은 1977년[1] Frank Crow에 의해 광원에서 가려진 지역의 3D 형태를 설명하는 기하학으로 처음 제안되었습니다.섀도 볼륨은 가상 세계를 음영 영역과 비음영 영역으로 나눕니다.

섀도 볼륨의 스텐실 버퍼 구현은 일반적으로 최신 3D 그래픽[citation needed] 하드웨어에서 사용되는 가장 실용적인 범용 실시간 섀도잉 기술 중 하나로 간주됩니다.그것은 비디오 게임 Doom 3에 의해 대중화되었고, 이 게임에 사용된 기술의 특정한 변형은 Carmack's Reverse로 알려지게 되었다.

섀도 볼륨은 보다 오래된 섀도 매핑과 함께 실시간 섀도잉에 널리 사용되는 도구가 되었습니다.섀도 볼륨의 주요 장점은 픽셀에 대해 정확하다는 것입니다(많은 구현에서는 실루엣 가장자리를 따라 작은 셀프 섀도 문제가 발생하지만 아래 구성 참조). 섀도 맵의 정확도는 섀도 맵에 할당된 텍스처 메모리와 섀도 캐스트 각도(일부 각도, AC)에 따라 달라집니다.불가피하게 그림자 지도의 큐레이스가 저하된다.)단, 이 기술에서는 섀도 지오메트리를 작성해야 합니다.이러한 지오메트리는 구현에 따라 CPU 부하가 높을 수 있습니다.섀도 매핑의 장점은 섀도 볼륨 폴리곤이 화면 공간에서 매우 크고 많은 채우기 시간(특히 볼록한 개체의 경우)이 필요하기 때문에 종종 더 빠르다는 것입니다. 반면 섀도 맵에는 이러한 제한이 없습니다.

건설

그림자 볼륨을 구성하려면 광원으로부터의 광선을 그림자 캐스팅 개체의 각 정점을 통해 특정 점(일반적으로 무한대)에 투영합니다.이 돌기들은 함께 하나의 볼륨을 형성합니다.그 볼륨 안에 있는 모든 점이 그림자에 가려져 있고 바깥의 모든 것이 빛에 비춰집니다.

다각형 모델의 경우 볼륨은 일반적으로 모델 내의 각 면을 광원을 향해 있거나 광원에서 떨어진 쪽을 향해 있는 것으로 분류하여 형성됩니다.광원에 대한 실루엣은 면과 외면을 연결하는 모든 가장자리의 세트입니다.실루엣을 형성하는 가장자리는 빛으로부터 돌출되어 그림자 볼륨의 면을 구성합니다.이 볼륨은 전체 가시 장면의 범위로 확장되어야 합니다. 종종 이를 위해 그림자 볼륨의 치수가 무한대로 확장됩니다(아래 최적화 참조).닫힌 볼륨을 형성하려면 이 돌출부의 전면과 후면 끝을 덮어야 합니다.이러한 덮개를 "캡"이라고 합니다.섀도 볼륨에 사용되는 방법에 따라 전면부가 객체 자체에 의해 가려질 수 있으며 후면부가 생략될 수 있습니다(아래 깊이 경로 참조).

또한 실루엣 가장자리를 따라 면이 상대적으로 얕은 그림자도 문제가 있습니다.이 경우 물체가 스스로 드리우는 그림자는 선명하고 다각형 면은 드러납니다.반면 일반적인 조명 모델은 면을 따라 조명이 서서히 변화합니다.이로 인해 실루엣 가장자리 근처에 거친 그림자 아티팩트가 남아 수정이 어렵습니다.폴리곤 밀도를 높이면 문제가 최소화되지만 제거되지는 않습니다.섀도우 볼륨의 전면이 상한인 경우 전체 섀도우 볼륨을 빛으로부터 약간 떨어져 오프셋하여 실루엣 가장자리의 오프셋 거리 내에 있는 섀도우 셀프 교차점을 제거할 수 있습니다(이 솔루션은 섀도우 매핑에서 더 일반적으로 사용됩니다).

섀도 볼륨을 형성하는 기본 단계는 다음과 같습니다.

  1. 모든 실루엣 가장자리 찾기(전면 면과 후면을 구분하는 가장자리)
  2. 모든 실루엣 가장자리를 광원에서 멀리 떨어진 방향으로 확장합니다.
  3. 표면에 전면 캡 및/또는 후면 캡을 추가하여 닫힌 볼륨을 형성합니다(사용하는 구현에 따라 필요하지 않을 수 있음).
섀도 볼륨의 그림입니다.왼쪽 위의 이미지는 그림자 볼륨을 사용하여 음영 처리된 장면을 보여줍니다.오른쪽에는 섀도 볼륨이 와이어프레임으로 표시됩니다.그림자가 광원(밝은 흰색 점)에서 먼 곳을 가리키는 큰 원추형 영역을 형성하는 방법에 주의하십시오.

스텐실 버퍼 구현

Crow 이후 1991년 Tim Heidmann스텐실 버퍼를 사용하여 섀도 볼륨으로 그림자를 렌더링하여 실시간 애플리케이션에서 사용할 수 있도록 하는 방법을 보여 주었습니다.이 기법에는 깊이 통과, 깊이 실패 및 배타적 또는 세 가지 일반적인 변형이 있지만 모두 동일한 프로세스를 사용합니다.

  1. 마치 완전히 그림자처럼 장면을 렌더링합니다.
  2. 각 광원에 대해:
    1. 해당 씬(scene)의 깊이 정보를 사용하여 볼 수 있는 표면이 그림자에 없는 경우에만 구멍이 있는 마스크를 스텐실 버퍼에 구성합니다.
    2. 스텐실 버퍼를 사용하여 그림자 영역을 마스킹하여 완전히 켜진 것처럼 장면을 다시 렌더링합니다.추가 혼합을 사용하여 이 렌더를 씬(scene)에 추가합니다.

이 세 가지 방법의 차이는 두 번째 단계에서 마스크 생성에서 발생합니다.2개의 패스와 1개의 패스가 필요한 것도 있고, 스텐실 버퍼의 정밀도가 낮은 것도 있습니다.

섀도 볼륨은 가시적인 장면의 대부분을 커버하는 경향이 있으며, 그 결과 3D 그래픽 하드웨어에서 귀중한 래스터라이제이션 시간(필타임)이 소비됩니다.이 문제는 섀도 캐스팅 객체의 복잡성으로 인해 더욱 악화됩니다. 각 객체는 화면에 임의의 크기의 섀도 볼륨을 직접 캐스팅할 수 있기 때문입니다.채우기 시간 문제를 해결하는 데 사용되는 기술에 대한 설명은 아래 최적화를 참조하십시오.

깊이 패스

Heidmann은 그림자의 앞면과 뒷면을 별도의 패스로 렌더링하면 스텐실 버퍼를 사용하여 물체 앞면의 앞면과 뒷면의 수를 셀 수 있다고 제안했다.물체의 표면이 그림자에 있는 경우, 물체와 눈 사이에 후면을 향한 그림자 표면보다 앞면을 향한 그림자 표면이 더 많이 있을 것입니다.그러나 숫자가 같으면 물체의 표면은 그림자가 아닙니다.스텐실 마스크의 생성은 다음과 같이 수행됩니다.

  1. 깊이 및 컬러 버퍼에 대한 쓰기를 비활성화합니다.
  2. 뒷면 도태를 사용하세요.
  3. 깊이 패스에 따라 증가하도록 스텐실 작업을 설정합니다(개체 앞에 있는 그림자만 카운트).
  4. 섀도 볼륨을 렌더링합니다(제거로 인해 전면만 렌더링됨).
  5. 전면 도태를 사용합니다.
  6. 깊이 통과 시 스텐실 작업을 감소로 설정합니다.
  7. 섀도 볼륨을 렌더링합니다(그 뒷면만 렌더링됨).

이 작업이 완료되면 모든 조명이 켜진 표면이 스텐실 버퍼의 0에 해당하며, 여기서 눈과 해당 표면 사이의 모든 그림자 볼륨의 전면 및 후면 표면 수가 동일합니다.

이 접근법은 눈 자체가 그림자 볼륨 안에 있을 때(예를 들어, 광원이 물체 뒤에서 움직이는 경우) 문제가 있습니다.이 시점에서 눈은 이 섀도 볼륨의 뒷면을 먼저 보고 전체 스텐실 버퍼에 -1의 바이어스를 가하여 효과적으로 섀도를 반전시킵니다.문제는 전면 클리핑 평면과 같이 눈을 향한 섀도우 볼륨의 전면에 "캡" 표면을 추가하여 해결할 수 있습니다.카메라 뒤에 있는 물체의 음영에 눈이 가려지는 상황이 또 있는데, 이 역시 비슷한 문제를 막기 위해 어떻게든 덮개를 씌워야 한다.대부분의 일반적인 구현에서는 깊이 패스의 적절한 캡핑은 달성하기 어려울 수 있기 때문에 깊이 실패 방법(아래 참조)은 이러한 특수한 상황에서 라이선스를 받을 수 있습니다.또는 카메라가 내부에 있는 모든 섀도 볼륨마다 스텐실 버퍼에 +1 바이어스를 부여할 수 있습니다.단, 검출이 늦어질 수 있습니다.

스텐실 버퍼에 눈과 물체 표면 사이에 보이는 그림자의 수를 수용할 수 있는 충분한 비트가 없는 경우, 또 다른 문제가 발생합니다. 왜냐하면 이 버퍼는 포화 산술적 오버플로우를 사용하기 때문입니다(대신 산술적 오버플로우를 사용했다면 문제가 크지 않을 것입니다).

깊이 통과 테스트는 깊이 버퍼를 종종 z 버퍼라고 하기 때문에 z-pass 테스트라고도 합니다.

깊이 실패

2000년경, 몇몇 사람들은 Heidmann의 방법이 깊이를 반대로 함으로써 모든 카메라 위치에 효과가 있다는 것을 발견했다.물체 표면 앞에 있는 그림자 표면을 세는 대신, 물체 표면 뒤에 있는 표면도 쉽게 세어 동일한 최종 결과를 얻을 수 있습니다.이렇게 하면 눈과 물체 사이의 그림자 볼륨이 계산되지 않기 때문에 눈이 그림자에 있는 문제가 해결되지만, 그림자 볼륨의 후단을 제한해야 하는 상태가 됩니다. 그렇지 않으면 볼륨이 무한대로 뒤로 향하는 곳에서 그림자가 사라집니다.

  1. 깊이 및 컬러 버퍼에 대한 쓰기를 비활성화합니다.
  2. 전면 도태를 사용합니다.
  3. 깊이 실패 시 증가하도록 스텐실 작업을 설정합니다(개체 뒤의 그림자만 카운트).
  4. 섀도 볼륨을 렌더링합니다.
  5. 뒷면 도태를 사용하세요.
  6. 깊이 실패 시 스텐실 작업을 감소로 설정합니다.
  7. 섀도 볼륨을 렌더링합니다.

깊이 실패 방법은 깊이 통과 방법과 마찬가지로 스텐실 버퍼의 정밀도에 대해 고려합니다.또한 깊이 통과와 마찬가지로 z-fail 방법이라고도 합니다.

William Bilodeau와 Michael Songy는 1998년 10월 이 기술을 발견했으며 1999년 [2]Creative Labs 개발자 컨퍼런스인 Creativity에서 이 기술을 발표했다.Sim Dietrich는 1999년 3월 GDC와 1999년 말 [3][4]Creativity에서 이 기술을 발표했습니다.몇 달 후, 윌리엄 빌로도와 마이클 송이는 같은 해에 "섀도 볼륨과 스텐실 [5]버퍼를 사용하여 그림자를 렌더링하는 방법"이라는 제목의 이 기술에 대한 미국 특허를 출원했다.id Software의 John CarmackDoom 3 개발 [6]2000년에 이 알고리즘을 독립적으로 발견했습니다.

배타적 또는

위의 유형 중 하나는 교차하는 섀도 볼륨을 제대로 처리하지 않고 렌더링 패스를 1개(채우는 시간이 아닌 경우) 저장하며 1비트 스텐실 버퍼만 필요로 하는 배타적 또는 변형을 사용하여 근사할 수 있습니다.다음 단계는 깊이 통과 버전용입니다.

  1. 깊이 및 컬러 버퍼에 대한 쓰기를 비활성화합니다.
  2. 깊이 패스에서 스텐실 작업을 XOR로 설정합니다(그림자 표면에서 플립).
  3. 섀도 볼륨을 렌더링합니다.

최적화

  • 섀도우 볼륨 지오메트리 계산 속도를 높이는 방법 중 하나는 렌더링 파이프라인의 기존 부분을 사용하여 계산의 일부를 수행하는 것입니다.예를 들어 균질 좌표를 사용하여 w좌표를 0으로 설정하여 점을 무한대로 확장할 수 있다.여기에는 특수 투영 매트릭스를 사용하여 이러한 점을 수용하기 위해 무한대까지 확장되는 멀리 자르기 평면을 가진 뷰팅 좌절을 동반해야 합니다.이 기술은 깊이 버퍼의 정밀도를 약간 낮추지만 보통 그 차이는 무시할 수 있습니다.2002년 문서 "하드웨어 가속 렌더링을 위한 실용적이고 견고한 스텐실 섀도 볼륨", C를 참조하십시오.Everitt와 M. Kilgard의 세부 구현입니다.
  • 하드웨어 내 가위 테스트를 사용하여 그림자를 화면상의 특정 직사각형으로 제한함으로써 그림자 볼륨의 래스터라이제이션 시간을 단축할 수 있습니다.
  • NVIDIA는 깊이 제한 테스트라고 불리는 하드웨어 기능을 구현했습니다. 테스트는 가시적인 장면에 영향을 주지 않는 섀도우 볼륨의 일부를 제거하기 위해 설계되었습니다.(는 GeForce FX 5900 모델부터 제공되고 있습니다.)이 기능과 섀도 볼륨에서의 사용에 대한 논의는 2005년 [7]게임 개발자 회의에서 발표되었습니다.
  • 깊이 실패 방법은 눈이 그림자 볼륨 내에 있는 특수한 경우 깊이 통과보다 유리하므로 이 경우를 확인하고 가능한 경우 깊이 통과를 사용하는 것이 좋습니다.이것에 의해, 깊이 실패가 불필요하게 되는 경우에 불필요한 백 캡(및 관련 래스터라이제이션)이나, 깊이[citation needed] 패스의 특수한 경우에 적절한 전면 캡의 문제가 회피됩니다.
  • 최신 GPU 파이프라인에서는 지오메트리 셰이더를 사용하여 섀도 [8][9]볼륨을 생성할 수 있습니다.
  • 지오메트리 셰이더를 지원하지 않는 시스템에서는 정점 셰이더를 사용하여 GPU [10]메모리 내에 이미 존재하는 정점을 선택적으로 돌출하여 섀도 볼륨을 생성할 수도 있습니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ Crow, Franklin C: "컴퓨터 그래픽을 위한 그림자 알고리즘", 컴퓨터 그래픽스(SIGGRAPH '77 Proceedings), vol. 11, no. 2, 242–248.
  2. ^ Yen, Hun (2002-12-03). "The Theory of Stencil Shadow Volumes". GameDev.net. Retrieved 2010-09-12.
  3. ^ "Stencil Shadows Patented!? WTF! - GameDev.net". 2004-07-29. Retrieved 2012-03-28.
  4. ^ "Creative patents Carmack's reverse". The Tech Report. 2004-07-29. Retrieved 2010-09-12.
  5. ^ US 6384822, Bilodeau, William & Songy, Michael, "섀도 볼륨과 스텐실 버퍼를 사용하여 그림자를 렌더링하는 방법", 2002-05-07 발행, Creative Technology Ltd.에 할당되었습니다.
  6. ^ Kilgard, Mark; John Carmack. "John Carmack on shadow volumes..." Practical and Robust Shadow Volumes page of NVIDIA Developer Zone. archive.org: NVIDIA. Archived from the original on January 27, 2009. Retrieved 18 October 2012.
  7. ^ Lengyel, Eric. "Advanced Stencil Shadow and Penumbral Wedge Rendering" (PDF). Game Developers Conference 2005. 2005. Retrieved 18 October 2012.
  8. ^ "Archived copy". developer.nvidia.com. Archived from the original on 16 May 2011. Retrieved 12 January 2022.{{cite web}}: CS1 maint: 제목으로 아카이브된 복사(링크)
  9. ^ Stich, Martin; Carsten Wächter; Alexander Keller (2007). "Chapter 11 "Efficient and Robust Shadow Volumes Using Hierarchical Occlusion Culling and Geometry Shaders"". GPU Gems 3. archive.org: nVidia / Addison-Wesley. Archived from the original on May 16, 2011. Retrieved 18 October 2012.
  10. ^ Brennan, Chris. "Shadow Volume Extrusion using a Vertex Shader" (PDF). AMD. Retrieved 2018-02-14.

외부 링크

딥페일 특허에 대해서