[GGP] 14. Shadow Mapping

Cherish·2023년 6월 11일

Game Graphic Programming

목록 보기
13/14
post-thumbnail

☁️ Shadow

  • realistic scene을 위해서는 필수적이다.
  • 그림자가 없으면 위화감을 느낀다.
  • 왜 계산하기 쉽지 않은가
    정점들을 죽 놓고 동시에 processing을 하는게 GPU
    그림자를 계산하려면 나한테 오는 빛을 누가 막았지?에 대한 정보가 필요해짐
    GPU 입장에서는 병렬처리 중이라 다른 데이터를 제공할수 없어.. 하기 때문에 특수한 방법으로 정보를 얻어햐함.
    그리고 그림자는 계속해서 움직인다. 물체의 움직임에 따라 계속 움직여야함. 미리 만들어줄 수도 없고 속도도 필요하니 어려움.. cost가 꽤먹어요



☁️ Shadow Mapping

  • two pass algorithm
    pass : pipeline 전 과정 수행
    CPU와 GPU 사이에 사이클을 계속 도는 것 : two-pass
    cpu-gpu-cpu-gpu-...
    gpu를 두번 왔다갔다 하는 것이 씬을 만듦

🔎 pass1

= 그림자를 만들기 위한 정보(빛을 받는 곳인지 구분할 수 있는 정보)를 수집하는 것
shadow map에 depth를 저장

  • shadow map
    기존의 카메라의 near plane
    texel로 구성되어있는 texture이다. texel에는 z값(depth)이 저장되어있다.

핵심 : view point , depth

뭐뭐가 : view frustum

🔎 pass2

  • 화면에 영상을 만들어내는 실제 렌더링 진행
  • camera position에서 렌더링
  • q1에 그림자가 만들어지는가? = vertex에 빛이 도달하는가 (sphere 정보를 받아올 수 없는데 어케해?)
  1. d1d_1 계산
  2. shadow map에서 u,v coordinate를 찾아 depth 정보(z1z_1)를 얻어내서 비교
  3. d1d_1 > z1z_1 -> 어떤 물체가 가로박고 있구나! = shadow구나
  • q2의 경우 d2=z2이므로 빛을 직접 받고 있다고 판단 = No shadow

🔎 First-pass Implementation

  • 이미 만들어진 카메라 구조체를 이용. 잘 갖다 쓸 수록 빠르게 사용할 수 있다.
  • 카메라 위치에다가 light source를 위치 시킨다(eye, at up을 이용)
  • camera space 대신 light space를 사용한다.

interpolation : 중간에 정보들을 채워주기 위해서
지금은 대부분 interpolation 정보들은 필요 없음! 그냥 거리를 알고싶어. depth말이야
pixel shader는 거의 다 비워 놓는다. color도 필요없. screeen space coordinate는 필요함


🔎 Acne artifact

= 불필요한 곳 까지 shadow가 생긴다.

Problem

  • Nearest point sampling
    = 모든 점을 조밀하게 sampling할 수 없기 때문 (해상도가 정해져있음)
    = 젤 가까운 texel 점으로 대충했더니 문제가 발생
  • bias(임의의 수)를 더해서 어느정도 해결이 가능하다.
  • bias가 너무 클 경우 필요하지 않은 곳 까지 밝게 표시될 수 있기 때문에 잘 설정해야 한다.



☁️ Shadow Map Filtering

🔎 Blocky shadow artifact

  • 빨간점 : pass1에서 sampling 됐던거
  • 파란점 : 실제 rendering에 사용
  • magnification case
    multiple pixel을 사용. interpolation을 했던 것 처럼 사용.

🔎 Solution to a blocky shadow artifact

  • bilinear interpolation
    = 문제가 해결되지 않는다.
  • percentage closer filtering (PCF)
    = visibility를 구해서 interpolate

shadow map을 interpolation 한다는 것은 얘가 빛을 비추고있는지에 대해 부드럽게 하는 거지.. 흰색이냐 검은색이냐를 부드럽게 하는 것이 아님..? 뭐라노



☁️ Render to Texture

depth map을 texture의 형태로 얻어야함. 특수한 처리가 필요하다
일반적으로 렌더링할 때는 return color하면 자동으로 화면에 보였음.
depth map은 화면에 바로 송출되는 것이 아니에용

-> render texture라는 형태로 가져옴

코드를 분석하며노
점 두개를 비교.
projecttexcoord : shadow map에서 data가져오는 것

depth value : texture
depth map vslue :



☁️ Hard Shadow vs. Soft Shadow

  • hard shadow : 완전히 어둡거나 밝게

  • soft shadow : 0~1 사이의 값으로
    에너지 보존법칙까지 생각하세됨
    최적화 문제 : 총 E를 한정하고

0개의 댓글