본문 바로가기
공부/Graphics

[Graphics] 그림자 매핑(Shadow Mapping) & 애트라크션(Acne)

by MY블로그 2023. 6. 26.

그림자 매핑(Shadow Mapping)

그림자 매핑은 실시간 그래픽스에서 그림자를 생성하기위한 기술 입니다.

조명이 존재하는 3D 화면에서 빛을 가리는 물체의 그림자를 시뮬레이션 하는데 사용 됩니다.


그림자 매핑의 구현 방식

그림자 매핑은 크게 3단계의 방식으로 구현이 됩니다.

1. 그림자 맵(Shadow Map) 생성

빛의 위치에서 바라보는 시점의 가상 카메라를 설정 합니다.

카메라는 빛이 비추는 장면을 관찰하며, 각 픽셀의 "깊이(Depth)값"을 저장하는 텍스처인 "그림자 맵(Shadow Map)"을 생성합니다.

그림자맵은 "깊이버퍼(Depth Buffer)"이고, 깊이 값은 시점에서 가상 카메라까지의 거리를 나타냅니다.

출처 : https://learnopengl.com/Advanced-Lighting/Shadows/Shadow-Mapping

2. 그림자 검사

장면을 그리기 전에 우선 "그림자 맵"을 사용하여 그림자 검사를 수행 하게 됩니다.

각 픽셀의 위치를 빛의 시점에서 보는 깊이값과 그림자 맵의 깊이 값을 비교합니다.

만일 픽셀의 깊이값이  그림자 맵에 저장된 깊이값보다 크다면 해당 픽셀은 빛에 가려져 그림자에 해당하는 영역으로 판단되며 저장 합니다.

출처 : https://learnopengl.com/Advanced-Lighting/Shadows/Shadow-Mapping

3. 그림자 적용

그림자에 해당하는 픽셀은 그림자를 시뮬레이션하기 위하여 다른 색상 혹은 셰이더를 적용 시킬 수 있습니다.

일반적으로 그림자는 흑색 또는 어두우면서도 투명한 효과가 적용된 느낌으로 나타냅니다.

아래의 사진을 참고합니다.

그림자를 사용한다면 오브젝트의 위치는 좀더 상세하게 표현이 가능합니다.

그림자가 없는 왼쪽의 사진 대략적으로 모든 오브젝트가 맵의 표면에 닿아 있는 것 처럼 보일 수 있습니다.

하지만 그림자를 적용한 오른쪽의 사진은 각각의 오브젝트의 위치 및 각도 높이 까지 조금더 상세하게 파악할 수 있게 되었습니다.

출처 : https://learnopengl.com/Advanced-Lighting/Shadows/Shadow-Mapping


결론

그림자 매핑은 그림자를 생성하기 위하여 가상의 시점을 사용하는 기술입니다.

정확한 그림자 효과를 얻기 위해서는 다양한 요소들을 고려해야할 필요가 있으며, 그림자 맵의 해상도, 빛의 강도와 유형, 그림자의 부드러움 등이 이에 포함이 됩니다.

또한, 그림자 매핑은 일부 그림자가 정확하게 표현되지 않을 수 있는 "애트라크션" 문제가 있을 수 있습니다.

애트라크션 문제를 완전히 해결 완화 하기 위해서는 다른 그림자 기술을 사용해야 할 수도 있습니다.

애트라크션 문제와 문제를 완화 하기 위한 방법 등은 아래를 참고해 주세요.

 


그림자 매핑 애트라크션(Shadow Map Acne)

그림자 매핑 기술에서 발생하는 일종의 아티팩트 또는 문제를 의미합니다.

이 문제는 그림자 맵의 해상도와 픽셀 사이의 관계로 인하여 발생할 수 있습니다.

 

애트라크션은 그림자 맵의 해상도가 제한되어 있기 때문에, 빛과 가까운 객체 또는 표면에 대해서는 그림자 맵의 해상도가 충분하지 않은 이유로 발생합니다.

그림자 맵에서 특정 필셀의 값을 결정할 때 깊이 값의 정밀도가  충분하지 않아 생기게 됩니다.

 

애트라크션은 주로 그림자 맵의 해상도에 따라 필셀들 사이에서 규칙적인 패턴으로 나타납니다.

이 패턴은 주로 작은 분산된 블록 형태의 노이즈 또는 빛깔 등으로 관찰됩니다.

이러한 아티팩트는 그림자의 부드러움과 정확도를 저하시키며, 그림자의 시각적인 품질도 저하시킵니다.

 

그림자 맵 애트라크션 문제를 완화 하기 위하여 몇가지 기술적인 접근 방식이 있습니다.

 

1. 그림자 바이어스(Shadow Bias)

그림자 맵 계산시 깊이 값을 조정하여 애트라크션을 완화 하는 방법 입니다.

깊이 값에 작은 값을 추가하여 그림자 맵과 실제 깊이 값 간의 간격을 조정해 줄 수 있습니다.

하지만 너무 큰 바이어스 값을 사용한다면 그림자의 정확성이 저하됩니다.

출처 : https://ndotl.wordpress.com/2014/12/19/notes-on-shadow-bias/

2. PCF(Percentage Closer Filtering)

그림자 맵에서 픽셀의 그림자 값을 결정할 때에 다수의 샘플을 사용하여 부드럽게 블렌딩하는 방법 입니다.

주변 픽셀의 그림자 값을 고려하여 보간(Lerp)하여 애트라크션을 완화시킬 수 있습니다.

하지만 이 방법은 계산 비용이 높아지는 단점이 있습니다.

출처 : https://stackoverflow.com/questions/17123735/how-to-enable-hardware-percentage-closer-filtering

3. VSM(Variance Shadow Mapping)

그림자 맵의 분산 값을 활용하여 애트라크션을 완화하는 방법 입니다.

분산 값은 그림자의 부드러움을 나타내고 이를 사용하여 그림자 값을 조정하여 애트라크션을 완화합니다.

출처 : https://www.researchgate.net/figure/Comparison-of-variance-shadow-mapping-without-mipmapping-left-and-with-mipmapping_fig1_220792112

4. CSM(Cascaded Shadow Mapping)

그림자 맵을 여러 개의 캐스케이드로 나누어 그림자 맵의 해상도를 향상시키는 방법입니다.

빛의 거리에 따라 여러 개의 그림자 맵을 생성하며 객체를 그릴 때 해당하는 캐스케이드의 그림자 맵을 사용하여 애트라크션을 완화합니다.

출처 : https://blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=pencube1214&logNo=221849084039

 

위의 기술들은 그림자 맵 애트라크션문제를 완벽히 해결하지는 않습니다.

하지만 보다 뛰어난 품질과 정확성을 향상 시켜 줄 수 있습니다.

 

 

댓글