|
결국 볼륨섀도우 축퇴사각형(degenerate quad) 작성 알고리즘의 문턱에서 포기를 하고 ![]() ... 뭐 섀도우맵의 가장 큰 단점이 앨리어싱이란건 익히 알고 있었으나 과연 ㄷㄷㄷ 그에따라 섀도우맵의 앨리어싱을 극복하고자 수많은 알고리즘들이 개발되었으나 아직 현재진행형이라 할만하다. 섀도우맵에 쓰이는 안티앨리어싱 기법은 크게 두 분류로 나누어 볼 수가 있겠다. 첫번째, 라이트 프러스텀을 조작하여 최대한 효율적인 섀도우맵을 획득하는 방법. 두번째. 섀도우맵으로부터 값을읽어서 그림자를 색칠할때 주변값들과 보정시키는 필터링. 전처리, 후처리라 할만하도다. 먼저 내용 이해가 쉬웠던 후처리부터 들어가자면, ShaderX2 에 소개되어 있는 PCF(Percentage Closer Filtering), nVIDIA 에 공개된 VSM(Variance Shadow Map : 편차 그림자 지도...)이 있겠다. (사실 이거밖에 모름 ㅇ.ㅇ;; ) VSM 문서에는 DSM(Deep Shadow Map)이란놈도 소개되어 있는데, 문서 찾아봤다가 이건뭐.. 그냥 잊어버리는게 정신건강에 좋을것 같다. PCF에 쌍선형(Bilinear)필터를 적용시키면 꽤 좋은 품질의 안티앨리어싱을 걸 수 있는데, VSM문서에서는... 비싸댄다 -_-; 그래서 일단 후처리는 VSM만 믿고 가볼까 한다. VSM은 ![]() 누적분포함수를 응용하여 주변색에 필터링을 거는 방식으로, 더이상의 자세한 설명은 엔비댜 문서를 참고하시고잉, 요걸 최대한 간결하게 후처리용으로 써볼까 한다. 이제 최대의 문제는 전처리. 아무것도 하지않고 그냥 광원시점의 거리값을 그대로 텍스쳐에 보존한게 SSM(Standard Shadow Map)이고 현재 내가 구현한게 요놈. 결과는 뭐 보시는대로 -_- 이 다음부터는 PSSM문서를 보면 차이가 느껴진다. ![]() PSM은 광원시점 절두체(라이트 프러스텀...이라고 하자)를 변형하여 섀도우 맵의 효율을 높이는 방식인데, 이후에 등장한 LiSPSM, TSM역시 기본 이념은 동일하다. 단지 라이트 프러스텀을 어떻게 변형해서 최대의 효율을 이끌어내는지의 차이가 존재한다. 이제 막 SSM을 구현했을뿐이기에, 아직 PSM의 기본개념조차 파악 못한 꼬꼬마라, 더이상의 설명은 불가능하리라 싶다. LiSPSM은 이름처럼, PSM의 개선판이고,(도대체 라이트 공간이 뭐여? -_-;) TSM은 사다리꼴 형태로 프러스텀을 변형시킨다... 정도만 알고있다. TSM은 프러스텀과 상관없을수도 있다.(내가 잘 모르는거지뭐.) 그리고 PSSM... 구간별로 나눠서 처리를 하고... CSM이란것도 있던데. 에휴. 공부해나가면서 알게 되면 기록이나 끄적끄적 남겨야겄다. -----------------------------2008년 7월 8일 추가분------------------------------------------------------- PSM(Perspective Shadow Map)
![]() 여기서, 디렉셔널 라이트의 경우엔 프로젝션변환의 영향을 받지 않는다고 나와있어서 (이 부분은 아직 이해가 덜 됐다. 다를수도 있다) 정육면체화 된 뷰프러스텀을 최대한 포함하는 라이트 프러스텀을 적절하게 계산해서 섀도우 맵을 찍는다. 단점은, 프로젝션 변환 후의 공간엔 문제가 많아서 (시점에 딱 맞게 바꿔주는 건데 공간만 바꾸고 다른 지점에서 바라보니까 당연히..) 라이트가 시점과 비슷한 방향일 경우, 시점보다 앞에 위치한 물체가 뒤쪽에 큼지막하게 자리잡는 경우가 생기거나 각도에 따라서 전혀 혜택을 못 보는경우(앨리어싱이 전혀 나아지지 않는), 먼 곳의 오브젝트에는 너무 적은 픽셀을 할당하기에 멀리있는 오브젝트의 앨리어싱은 가히 살인적이라는점 (어차피 멀리있는 물체는 작으니까 상관없지 않겠냐고 생각하겠지만, 큰 건물이라면 어떻하삼? ) 등등이 있겠다. 여기까지 들으면 더 자세한 내용은 PSM문서만 봐도 거의 이해가 될 것이다. LiSPSM(Light Space Perspective Shadow Map) PSM에 LiS(Light Space)만 붙어서, 난 기본 개념이 똑같은 줄로만 알았다. 근데 전혀 틀리게 시작한다 -_-; 일단 생소한 개념인(물론 얘네들이 새로 만들어서 이름붙인거니 다른곳에선 들어봤을리가..) 라이트 공간이 무엇인지 파악하는게 중요하다. 라이트 공간이란, ![]() 라이트 벡터L(소문자는 굴림체로 알아보기 힘들어서...)을 좌표축 y로 하고, 뷰벡터(ViewPoint - EyePosition 으로 구한다)V와 라이트 벡터L과의 외적을 좌표축 x, 그리고 y와 x의 외적을 좌표축 z로 갖는 좌표계 공간이다. 뷰 프러스텀을 라이트공간으로 투영 시키고, 좌표축에 딱 맞으면서 뷰 프러스텀에 최대한 가까운 크기를 갖는 프러스텀 P를 구하여, 요 프러스텀 P를 y축으로 투영시켜서 섀도우 맵을 뽑는 방식이다. 왜 y축이냐고? y축을 라이트 벡터로 잡았잖여 -_- 결론은, PSM에서 말하는 post-perspective상태랑은 전혀 틀리기 때문에 헷갈리지 말지어다... TSM(Trapezoidal Shadow Maps) TSM하면 사다리꼴. 사다리꼴 밖에 생각 안나는 분들이 많으실걸로 안다. 근데 사다리를 어쩌라고??? 일단 장면(Scene)을 월드-뷰-프로젝션 변환을 시켜놓는다. 아까 PSM의 설명을 열심히 읽었다면, 현재 이 상태가 post-perspective상태라는 것을 기억할 수 있을 것이다. (2008년 7월 19일 추가 : 월드-라이트뷰-라이트프로젝션 변환이다.) 프로젝션. 투영. 말 그대로 3차원을 2차원으로 변형한다는 의미이다. 그런데 PSM에서는 그렇게 왜곡된 상태에서 다시 3차원적 접근을 해버려서 알콩달콩한 문제들이 일어났는데, TSM은 그상태 그대로. 2차원적으로 해결해버린다. ![]() 근데 전혀 티가 안난다;] 공간은 일단 WVP변환을 마친 상태이다. (2008년 7월 19일 추가 : 월드-라이트뷰-라이트프로젝션 변환이므로 WLP 라고 쓰면 될려나?) 그리고 뷰 프러스텀을 구성하는 8개의 정점도 똑같이 변환해 주면 위의 그림같은 상황이 나온다. (2008년 7월 19일 추가 : 정점 찾는 방법. [0] = (-1, -1, 0), [1] = (-1, 1, 0), [2] = (1, 1, 0), [3] = (1, -1, 0), [4] = (-1, -1, 1), [5] = (-1, 1, 1), [6] = (1, 1, 1), [7] = (1, -1, 1), 을 "뷰-프로젝션 의 역행렬"을 곱해준다. 저 좌표는 뷰 프러스텀의 8개 정점이 WVP변환 종료 후 갖게되는 좌표이므로, (VP)^-1 을 해주면 정점들이 월드 좌표상으로 되돌아가게 된다. 그리고 이미 월드 변환은 적용 된 상태이니 남은 LP-라이트뷰, 라이트프로젝션- 변환만 해 주면 라이트-포스트 퍼스펙티브 상의 정점 좌표를 얻을 수 있게 된다.) 그 8개의 정점을 이용해(이미 여기서부터 공간은 2D 상황이다) 사다리꼴을 구성하는 4개의 정점을 뽑아내고 (TSM동영상을 보면서 고딩때까지 배웠던 수학적 지식을 총동원하면 못 구할것 없다) 다시 이 4개의 정점으로 이루어진 사다리꼴을 정사각형으로 변환시키는 행렬 Nt를 찾아내면 그걸로 TSM은 구현 끝이다. 행렬 Nt를 구하는 방법은 매우매우 친절하게 설명된 문서가 돌아다니고 있으므로 언급하지는 않겠다. 한가지, TSM은 저걸 개발한 대학인가 사람이 특허를 가지고 있어서 함부로 쓰면 좋치 않다는 소리가 있다. 실제로, 발매된 최신게임들은 다들 CSM(또는 PSSM) + LiSPSM(또는 SSM, PSM)의 조합을 채택하고 있다는 정보를 어렵지 않게 찾아볼 수 있을 것이다.(왜 조합이 필요한지는 CSM, PSSM 부분에서 설명하겠다) 효율은 LiSPSM보다 TSM쪽이 다소 좋다는 말이 있지만, 어차피 CSM(또는 PSSM)을 쓰게되면 그게 그거기 때문에 안전하게 LiSPSM로 가는거야~~ CSM(Cascade Shadow Mapping), PSSM(Parallel-Split Shadow Maps) 커스케이드. 직역하면 단계별 섀도우맵. 은근히 여기저기서 자주 대두되는 단어이다. Parallel-Split는 네이년 사전에서 검색해 보니 '평행 분할' 정도로 직역할 수 있겠다. 아니 근데, 얘들은 왜 불쌍하게 한데 묶은겨? 사실 그놈이 그놈인기라. 구체적인 구현방법은 공부를 안해서 넘기고; 이 방식들은 한마디로 요걸로 표현할 수가 있다. '밉맵이삼' 단지, 거리에 따라 텍스쳐 크기가 줄진 않는다;; Depth Shadow Map알고리즘의 한계인 앨리어싱을 행렬 알고리즘으로 극복하는데에 한계를 느낀(그리고 텍스쳐 크기에도 한계를...) 님하들. '그럼 많이 만들면 되잖아' 그런 것이다. 뷰프러스텀을 거리별로 일정 영역으로 나누어(3~4단계가량?) 각각 따로 섀도우맵을 뽑아놓는 무식하고도 확실한 방법이다. ![]() 즉, 텍스쳐 갯수를 늘리자는게 CSM, PSSM의 요지이기 때문에, 그 하나하나의 텍스쳐는 결국 SSM, PSM, LiSPSM, TSM중 하나를 택하여 구현하게 된다. 역시나 양에 장사없다고, CSM, PSSM을 쓰면 딱히 SSM으로도 큰 문제는 없다고 한다 -_-;; 아참, 근데 도대체 CSM이랑 PSSM은 뭐가 다른거야? 라는 궁금증을 이제서야 풀어드리자면, 거리에 따라 섀도우맵을 새로 작성하게 되는데, 그 거리를 구하는 방식(알고리즘)이 다르댄다. -_-; 기분상으론 CSM이 기본 이론으로, 거기서 파생된게 PSSM이지 않을까 싶다. 이 부분도 추후 수정이 예상된다;; LOGSM(Logarithmic Shadow Map) 요건 무엇에 쓰는 물건인고? 나도 며칠전에서야 처음 들어봐서 자료조차 본 적이 엄따. 들리는 얘기에 의하면 대수를 이용해서 TSM보다도 효율좋게 섀도우맵을 뽑는 방식이라던데, 현재의 GPU로는 실시간으로 계산할 수가 없댄다. 그냥 그런것도 있구나~ 하면 된다 -_-; 우아.... 적고보니 쎄( = 혀 )가 빠지는구나. 섀도우맵을 막 공부하기 시작하는 분들께 도움이 되었으면 좋을텐데말야. 사람이 와야 말이지. 이곳은 -_-;
|
카테고리
최근 등록된 덧글
답변은 싸이에 남기도록..
by 66v at 08/15 바꾸야 내 추석때 일본가.. by 근육돼지 at 08/14 오랜만에 추가 -_- 이.. by 66v at 07/11 아뫼바군님// 오오~ 방.. by x66vx at 07/10 아. 그리구 제가 알아본 .. by 아뫼바군 at 07/09 제 허접스런 글이 도움이.. by 아뫼바군 at 07/09 Bluhfe님// 안녕하세요~.. by x66vx at 06/03 영어스팸 보면 뭐랄까 좀.. by Bluhfe at 05/31 어예~ 몇개 추가 -_-; .. by 66v at 04/28 된장... 역시 그림은 따.. by x66vx at 04/23 최근 등록된 트랙백
이글루 링크
▒ 제닉스의 사고뭉치 ▒
-_- Plluto's cheerful Geh.. 이런저런 이야기 : Revolu.. EST's nEST 게임회사 이야기 고지라군의 그림이야기 세라복萌 - 리라 하우스.. ■ Weird Tales ■ 뽐뿌 inside 일반인 접근금지! Purgatorium 아까짱 블로그(akacha.. 혜미오빠 2ndG hongshit's private note midikey's 95% 마이너스 원 歌月十五夜 ~~사보텐 아일랜드~~ 스컬로케이의 修羅之道 디굴디굴대마왕의 B급 .. 빈유, 단발, 촉수, .. - another world - cause to be different.. SMH의 S.M.H한 방 Rising sun의 잘은 모.. warmania의 일본통신실 「FUYU」 SeaBlue in Parise 한군의 주절주절 블로그 Eternal Sky, Filling o.. Jinny's Diary, Sea.. 히나코의 망상 Field's Nest GASKA*log 끝 덩키의 일본유학생활 시대를 선도하는 게임전문지 朱瑞英のパパ=TIPI's s.. . 냥이의 잡동사니 Mr . Fe의 철분보급소 Tony Stark's Resear.. 頭痛停工房 미스터 술탄의 鐵鎧究樂.. 서바이벌라이프 www.jidigital.net로 이사 알뜰한 블로그 Heeut R/Y/U/T/O/P/I/A ☆ 2008 yundream의 프로그래.. 이전 블로그
2008년 07월
2008년 06월 2008년 05월 2008년 04월 2008년 01월 2007년 12월 2007년 10월 2007년 09월 2007년 05월 2007년 04월 2007년 03월 2007년 02월 2007년 01월 2006년 11월 2006년 09월 2006년 08월 2006년 06월 2006년 05월 2006년 04월 2006년 03월 2006년 02월 2006년 01월 2005년 12월 2005년 11월 2005년 10월 2005년 09월 2005년 08월 2005년 07월 2005년 06월 2005년 05월 2005년 04월 2005년 03월 2005년 02월 2004년 09월 2004년 07월 이글루 파인더
|