SlideShare a Scribd company logo
1 of 77
그림자 이야기




   박형준
일상 생활에서의 그림자 정의
그림자는 빛의 경로상에서 불투명한 물체가
있을 때, 빛의 직진성으로 인해 빛이 통과하지
못하는 부분이 생기는데, 이를
그림자라한다.
일상 생활에서의 그림자 정의

A: 태양   D: 반 그림자 E: 본 그림자
B: 지구
C: 달
일상 생활에서의 그림자 정의

간단히 말해서,
빛을 반사시키지 못하고 흡수할 수 있는


물체들은
모두 그림자를 만들 수 있다고 보면 됩니다.
게임에서의 그림자 사례
게임에서의 그림자 사례
게임에서의 그림자 사례

그림자의 품질에 따라서도
시각적으로 비교했을 때
현실성을 떨어뜨리는 효과를
낳게 됩니다.
게임에서의 그림자 사례
아예 그림자가 존재하지 않을 경우에는 캐릭터가 땅 위에 붕
떠 있어 보이는데 현상까지 낳게 됩니다.
게임에서의 그림자 중요성




정말 그림자는 중요할까?
게임에서의 그림자 중요성
대부분의 고사양 게임들은 고급설정을 제공하여 유저들에게 커스터
마이즈를 할 기회를 제공해주는 데,
대부분의 유저들이 가장 먼저 시도하는 최적화가
그림자 옵션 OFF일 것이다!
게임에서의 그림자 중요성

  보라!
  그림자가 없어도 게임하는 맛은 나지 않는가?
게임에서의 그림자 중요성

하지만,
FPS장르의 경우에서는
그림자를 활용해서 상대를
공격하는 경우도 있기 때문에

현실성 높은 그림자를 만드는
목표로 만드는 건 사실성을 높
이는 거 뿐만 아니라
게임내적인 요소에서도 재미를
부과할 수가 있을 것입니다.
게임에서의 그림자 다루는것!
게임에서의 그림자 다루는것!


그렇습니다.

우리는 차폐물에 의해 생성되는 그림자
만들어야 합니다...
게임에서의 그림자 다루는것!

물론 좀 더 이후의 세대에서는
레이트레이싱을 이용하면 더 이상 지금과 같은 꼼수를
사용할 필요가 없을지도 모릅니다...
그림자 기법 종류

원형 그림자
평면 투영 그림자
스텐실 그림자
투영 텍스처 그림자
우선 순위 버퍼 그림자
깊이 버퍼 그림자
그림자 기법 원형그림자
그림자 기법 원형그림자



  3D게임에 그림자가 등장하면서 많이 사용된 방식.

  현재까지도 사라지지 않고 사용되어지고 있습니다.
그림자 기법 원형그림자

그 이유는...

부하가 적고 하드웨어사양와도 크게 상관이
없기 때문에
빛이 있는 곳에 어둠을 표시하기 위한 최소한의
장치로서 활약하고 있습니다.
그림자 기법 원형그림자

하지만 치명적인 약점이 존재하는 데...

빛에 영향을 받는 게 아니라 그림자가 될 텍스처를
사용해 찍기 때문에 비현실적이고, 모양이 언제나
같으며, 평면이 아닌 지형에서도 사용은 할 수 있으
나 여러가지면에서 예쁘지 못합니다!
그림자 기법 원형그림자
           다음과 같은 원형그림자 텍스처를 만들어 둡니다.




그림자의 위치를 지정해주기 위해
높이가 Y좌표일 때 [X,Z]좌표를 사용하여
위치를 지정하고,
해당 모델보다 약간 아래로 그림자를 찍으
면 됩니다.

너무 간단하기 때문에 설명은 여기까지.
그림자 기법 평면투영그림자



 평면만을 위해서 태어난 그림자 기법.

 말 그대로 평면에서만 사용할 수 있는 그림자 방식입니다.
그림자 기법 평면투영그림자

앞에 원형그림자에 비해서 텍스처를 이용하지 않고
모델을 한번 더 그리기 때문에,

원본 모델을 그림자로 사용하고자 할 경우
한번 더 그려야 됩니다.( 물론 텍스처를 입히지 않은 상태 )

그렇기 때문에 폴리곤이 많은 모델일 경우,
그림자용 모델을 따로 제작해야 되는 번거로움이 존재합니다.
그림자 기법 평면투영그림자

물론 원형그림자에 비해서 그림자가 모델 모양에 가깝게 나오기 때
문에 평면에서만 사용한다는 가정하에 현실성을 높여줄 수 있습니다.

지형이 평면에서밖에 안 사용되어진다면
평면투영 그림자기법은 다른 어떤 그림자기법보다
가장 먼저 꺼내서 사용하시면 되겠습니다.
그림자 기법 평면투영그림자

광원(태양)으로부터 정점을 통과하는 직선을 연장해서,
평면과 교차하는 위치에 새로운 정점을 만들어
그림자 영역을 그리는 방식입니다.
그림자 기법 평면투영그림자



위의 행렬식이 바로 평면에 그림자를 투영시켜 줍니다.
단 해당 식은 오른손 좌표계 기준이므로 왼손 좌표계에서 사용할려면
전치시켜주면 됩니다.
그림자 기법 평면투영그림자




하지만 DirectX를 사용하신다면,
D3DX 라이브러리에서 제공해주는 D3DXMatrixShadow()를
사용하는 게 일반적입니다.
참고로 D3DX가 사라진 DX11에도 이를 제공해주고는 있겠죠?
그림자 기법 평면그림자



    지금까지 살펴본 것들은 부하가 적으며,
    셰이더도 전혀 사용하지 않았습니다.



무엇보다 평면 그림자에 맞춰져 있었습니다!
그림자 기법 우리들도..
그림자 기법 투영 텍스처 그림자


 텍스처를 실시간으로 생성하여 지면에 텍스처를 입히는 방식.




그러므로 이전의 방식들과는 달리 지형이
울퉁불퉁하여도
예쁜 모양의 그림자를 만들어 낼 수 있습니다.
그림자 기법 투영 텍스처 그림자


다음과 같은 화면이 있습니다.
                   광원




                   카메라
그림자 기법 투영 텍스처 그림자


카메라의 위치를 광원이 있는 위치   카메라
로 옮깁니다.              광원

왜냐하면 그림자는 광원의 영향을
받아서 만들어지므로,

광원의 위치를 가지고 텍스처에 해
당 장면을 그려주어야 하기 때문입
니다.
그림자 기법 투영 텍스처 그림자


그러면 다음과 같은 텍스처를 얻으   광원
실 수 있습니다.

그리고 옮겼던 카메라 위치는 다시
원래의 자리로 돌립니다.




                     카메라
그림자 기법 투영 텍스처 그림자




광원에서의 투영공간과 텍스처공간은 중심위치가 다르므로
U = +0.5X + 0.5
V = -0.5Y + 0.5

위의 식을 사용하여 투영공간의 좌표를 텍스처공간의 좌표로
변환해줄 수 있습니다.
그림자 기법 투영 텍스처 그림자

이를 행렬로 표현하면 다음과 같습니다.




 근데 왜 갑자기 투영 공간의 좌표를
 텍스처 공간으로 옮기는 작업을 하고 있나요?
그림자 기법 투영 텍스처 그림자


우선 우리가 만든 텍스처는 광원
위치에서 찍은 투영공간상에 찍은
것입니다.

그리고
흰색과 검은색으로 단 2개의 색으
로 이루어져 있다는 것을 확인할
수 있습니다.
그림자 기법 투영 텍스처 그림자


            즉, 카메라 위치에서 모델을 그리면, 정점은
            투영공간으로 변환됩니다.


그림자를 그릴 때 위의 텍스처로 만든 투영 텍스처를 그림자로
사용하기 위해서 찍은 것이므로,
투영공간 => 텍스처공간 변환
이후에 해당 위치의 텍셀을 참조하여 그림자인지 아닌지를 판
단하게 됩니다.
그림자 기법 투영 텍스처 그림자




FinalColor = DestColor * SrcTexel
흰색은 1.0f이므로 DestColor가 그대로 나오겠지만,
검은색은 0.0f이므로 0.0f 즉 검은색으로 나오게 되어 그림자가
생성되어지게 될 것입니다.
그림자 기법 투영 텍스처 그림자


즉 방금 살펴본 과정을 다시 여기
에서 설명하면

DestColor의 대상이 되는 곳이 바
로 이 지면일 것입니다.

1. 광원위치에서 그림자 텍스처 생
성
2. 그림자 텍스처를 지면과 혼합시
켜서 그림자 출력.
그림자 기법 투영 텍스처 그림자



주의사항으로는 텍스처 어드레싱 모드를
DirectX기준으로
D3DTADDRESS_CLAMP
으로 해주어 [0,1]범위 이외의 텍셀은 투명하도록 해줍니다.

안 그러면 위와 같이 나오지 말아야 할 그림자가 나오는 현상이
발생하게 됩니다.
그림자 기법 투영 텍스처 그림자



   보셨듯이 텍스처에 그림자를 남기는 방식이기 때문에
   텍스처에 최대한 많은 그림자를 생성하면 한번의
   패스로 많은 그림자들을 한번에 그릴 수 있습니다.

단, 큰 해상도의 텍스처가 필요할 것이기 때문에
그만큼 메모리를 많이 소비할 수밖에 없습니다.
또 작게 만들면 그만큼 그림자 품질도 떨어지겠죠?
그림자 기법 투영 텍스처 그림자

그 외에도 그림자를 출력할 대상이 될 지면 오브젝트를 정하는 것과
광원과 그림자 사이에 장애물 오브젝트가 존재할 경우 이상한 곳에
그림자가 나올 수 있다는 것을 주의해야 합니다.
그림자 기법 투영 텍스처 그림자




그냥 문제될만한 이런 제약사항이 없을 때
이 기법을 이용합시다!
그림자 기법 스텐실 그림자

스텐실 그림자는 2004년 존카막의 둠3에 의해
세상에 공개되어졌습니다...
그림자 기법 스텐실 그림자

스텐실 그림자의 최대 장점은 바로 앞에 기법들이 해내지 못한
셀프그림자를 지원하다는 것입니다.
그림자 기법 스텐실 그림자




스텐실 그림자는 다음과 같이 그림자 볼륨이라는 것을 생성하게 됩니다.
이게 무엇이냐면 광원의 방향으로부터 빛을 받은 정점들은 뒤쪽으로 잡
아서 늘여 뜨리게 됩니다.
그림자 기법 스텐실 그림자




실제 화면을 보면 다음과 같은 그림자 볼륨을 생성하게 됩니다.
화면에 보이는 건 단순한 모델이지만 그림자 볼륨까지 봤을 때
정점수가 상당히 많아 보입니다.
그림자 기법 스텐실 그림자




그렇습니다...
렌더링 부하가 장난아니게 큽니다.
픽셀셰이더에는 부하가 없으나 정점셰이더에는
이들이 모두 들어가기 때문이니까요.
그림자 기법 스텐실 그림자


어쨌든 지금은 스텐실 그림자를
다루고 있으니 계속 진행하겠습
니다.
그림자 기법 스텐실 그림자

            원리는 간단합니다.

            우선 그림자 볼륨의 앞면을
            스텐실 버퍼에 +1이라고 기록을
            하도록 합니다.

            만약 광원이 여러 개라면 중첩
            으로 인해 +1이상의 값이 나올
            수도 있겠죠.
그림자 기법 스텐실 그림자

            이번에는 그림자 볼륨의 뒷면입
            니다.

            앞면과는 반대로 -1을 기록하도
            록 합니다.

            이제는 어느 정도 감이 올 수 있
            겠죠?
그림자 기법 스텐실 그림자

              그렇습니다.

              앞면과 뒷면은 사실 그림자가
              될 수 없는 운명이었습니다.
              이들은 합쳐져 최종적으로 0이
              되었기에 볼륨은 사실상 최종적
              인 화면에서 제외됩니다.

              하지만 실제로 그림자가 출력되
              어져야 할 부분은 뒷면이 존재
              하지 않기에 +1만 남아

그림자가 되었습니다.
그림자 기법 스텐실 그림자


            형, 쉬운 남자야!
          존나 어려울줄 알았지?
           이론적으론 간단해!
그림자 기법 스텐실 그림자




하지만 그림자 볼륨으로 인한 정점 증가는 그래픽 디자이너에게
그림자 볼륨을 줄이기 위한 외형을 단순화를 어느 정도 제약할 수
밖에 없습니다.
그림자 기법 스텐실 그림자
지오메트리 셰이더가 등장하면서 다시 이 기법은 재평가(?)가
이루어지고 있습니다.
하지만 DX9세대까지는 사용하기 부담스럽습니다.
쉬어가는 코너
• http://www.youtube.com/watch?v=JZsqCX
  U9ki4&feature=youtu.be
• http://www.youtube.com/watch?v=vWkhyI
  eEfjY
• http://www.youtube.com/watch?v=OuB0j9
  2CSCs
그림자 기법 우선순위 버퍼 그림자




우선순위 버퍼 그림자 역시 앞서 보았던 그림자 기법들처럼,
광원의 위치에서 오브젝트들을 렌더링합니다.
다만 그림자가 될 오브젝트뿐만 아니라 화면안에 그려져야 할
모든 대상의 오브젝트들을 그린다는 차이점이 있습니다.
그림자 기법 우선순위 버퍼 그림자




우선순위 버퍼그림자는 각각의 오브젝트들을 자기 입맛대로
색깔을 지정해주어 텍스처에 기록할 수 있습니다.
즉 이 입혀진 색깔은 오브젝트의 성격임과 동시에 서로 다를 경우 그림자
가 나타날 수 있습니다.
그림자 기법 우선순위 버퍼 그림자




위에서 보았던 오브젝트들을 가지고
텍스처에 기록해봅시다.

지면은 검은색, 그리고 구는 주황색으로 기록하였습니다.
그림자 기법 우선순위 버퍼 그림자




텍스처의 내용을 그대로 갖다 붙여서 생각해본다면 다음과 같은 모양
이 될 것입니다.
그림자 기법 우선순위 버퍼 그림자

              128




                      32




내용을 쉽게 이해하기 위해 텍스처에 기록할 때,
지면은 132, 구는 32로 기록했다고 합시다.

현재 ID가 입력된 그림자 텍스처인 ID맵은 완성된 상태이므로
실제로 오브젝트에 그림자를 입히는 작업을 하도록 합시다.
그림자 기법 우선순위 버퍼 그림자



                      32




구를 먼저 그립니다.
보시다시피 구만 덩그러니 그려질 것입니다.

왜냐하면 ID맵을 보았듯이 구가 더 뷰에 가까웠기 때문에,
ID맵을 참조하여도 ID가 같으므로 그림자를 만들 건덕지가 없습니다.
그림자 기법 우선순위 버퍼 그림자

  그림자 텍스처와           128
   겹쳐진 부분


                                 32




128의 ID를 가진 지면을 그릴 경우 네모부분이 바로 그림자가 되는
부분인데요. 128인 부분을 그리면서 겹쳐진 부분을 만나게 됩니다.
FinalColor = 지면IDofPixel != ID맵ofPixel ? 0 : DestColor;
식을 보시다시피 ID맵으로부터 참조해서 다를 경우에
그림자가 생기도록 합니다.
그림자 기법 우선순위 버퍼 그림자

  그림자 텍스처와           128
   겹쳐진 부분


                                 32




128의 ID를 가진 지면을 그릴 경우 네모부분이 바로 그림자가 되는
부분인데요. 128인 부분을 그리면서 겹쳐진 부분을 만나게 됩니다.
FinalColor = 지면IDofPixel != ID맵ofPixel ? 0 : DestColor;
식을 보시다시피 ID맵으로부터 참조해서 다를 경우에
그림자가 생기도록 합니다.
그림자 기법 우선순위 버퍼 그림자




투영 텍스처 그림자처럼 셀프그림자를 지원하지 않습니다.
전후 관계를 고려하기 때문에 많은 오브젝트가 있어도 그림자가 정확
하게 출력된다는 장점이 있습니다.
물론 ID가 서로 같을 경우에는 무슨일이 있어도 그림자가 생기지 않으니
이러한 점은 고려되어져야 합니다.
그림자 기법 깊이버퍼 그림자




우선순위버퍼 그림자와의 차이점은 단지 ID로 사용하는 색을 그리는 게
아니라 아예 깊이 버퍼값을 사용한다는 것입니다.

샘플그림은 메탈기어솔리드4로서 지금 설명하는 기법을 사용했기에
한번 넣어봤습니다.
그림자 기법 깊이버퍼 그림자




광원의 위치로부터 깊이 버퍼로 텍스처를 그리게 된다면,
가까이 있는 것은 검게, 멀리 있는 것은 하얗게 표시되는
흑백필름영화 느낌의 텍스처를 얻게 될 것입니다.
그림자 기법 깊이버퍼 그림자




두번째 패스에서 오브젝트를 그립니다.
그려진 오브젝트의 깊이값은 깊이버퍼를 기록한 텍스처와 비교를
해야 하므로
정점좌표 * (월드행렬*광원위치의 뷰행렬*투영행렬)
를 곱해야만 같은 공간에 있게 되므로 올바른 비교가 될 것입니다.
그림자 기법 깊이버퍼 그림자




FinalColor = ZofDepthMap < ZofDestBuffer ?
            0 ? DestColor;
즉 깊이맵이 그려져야 할 곳의 깊이값보다 더 작다면 뷰에 더 가깝다는
것을 의미하고 배경을 덮어 씌우는 것이기 때문에,
그림자가 만들어 질 것입니다.
그림자 기법 깊이버퍼 그림자




하지만 이 공식만 사용해서 구현했을 경우...
예상치 못한 결과가 나옵니다.
그림자 기법 깊이버퍼 그림자




바로 이러한 경우입니다.
그림자 기법 깊이버퍼 그림자




  왜 그럴까요?
그림자 기법 깊이버퍼 그림자




깊이값이 픽셀 단위이기 때문에 생기는 문제
입니다.
미세하게 어긋나서 줄무늬가 생기는데요.
그림자 기법 깊이버퍼 그림자



다음의 공식에서 마법의 숫자를 넣어주어
해결하시면 됩니다.
실제 실행하시면서 찾으시면 됩니다.



  FinalColor = ZofDepthMap < ZofDestBuffer - Magic ?
              0 ? DestColor;
쉬어가는 코너
• http://www.youtube.com/watch?v=UJLelV
  CO0wQ
• http://www.youtube.com/watch?v=KUwWv
  tCy988&feature=related
• http://www.youtube.com/watch?v=gZrklEy
  9ohQ&feature=related
발표를 마치면서...




기본적인 구현원리를 알아야 이런 거 개발할 수 있습니다.
참고자료
• 3D 그래픽스 매니악스
• DirectX9 셰이더 프로그래밍
• 이미지들 대부분은 구글을 통해 가져와버
  림...

More Related Content

What's hot

[1023 박민수] 깊이_버퍼_그림자_1
[1023 박민수] 깊이_버퍼_그림자_1[1023 박민수] 깊이_버퍼_그림자_1
[1023 박민수] 깊이_버퍼_그림자_1MoonLightMS
 
Ndc2010 전형규 마비노기2 캐릭터 렌더링 기술
Ndc2010 전형규   마비노기2 캐릭터 렌더링 기술Ndc2010 전형규   마비노기2 캐릭터 렌더링 기술
Ndc2010 전형규 마비노기2 캐릭터 렌더링 기술henjeon
 
[Ndc12] 누구나 알기쉬운 hdr과 톤맵핑 박민근
[Ndc12] 누구나 알기쉬운 hdr과 톤맵핑 박민근[Ndc12] 누구나 알기쉬운 hdr과 톤맵핑 박민근
[Ndc12] 누구나 알기쉬운 hdr과 톤맵핑 박민근MinGeun Park
 
감마가 어디감마
감마가 어디감마감마가 어디감마
감마가 어디감마JP Jung
 
2009-2016 기본기(손맵)의 중요성
2009-2016 기본기(손맵)의 중요성2009-2016 기본기(손맵)의 중요성
2009-2016 기본기(손맵)의 중요성Gunho Shin
 
[0806 박민근] 림 라이팅(rim lighting)
[0806 박민근] 림 라이팅(rim lighting)[0806 박민근] 림 라이팅(rim lighting)
[0806 박민근] 림 라이팅(rim lighting)MinGeun Park
 
물리 기반 셰이더의 이해
물리 기반 셰이더의 이해물리 기반 셰이더의 이해
물리 기반 셰이더의 이해tartist
 
Depth from Videos in the Wild: Unsupervised Monocular Depth Learning from Unk...
Depth from Videos in the Wild: Unsupervised Monocular Depth Learning from Unk...Depth from Videos in the Wild: Unsupervised Monocular Depth Learning from Unk...
Depth from Videos in the Wild: Unsupervised Monocular Depth Learning from Unk...Kazuyuki Miyazawa
 
[Kgc2012] deferred forward 이창희
[Kgc2012] deferred forward 이창희[Kgc2012] deferred forward 이창희
[Kgc2012] deferred forward 이창희changehee lee
 
모바일 게임 최적화
모바일 게임 최적화 모바일 게임 최적화
모바일 게임 최적화 tartist
 
언차티드4 테크아트 파트1 톤맵핑&색보정
언차티드4 테크아트 파트1 톤맵핑&색보정언차티드4 테크아트 파트1 톤맵핑&색보정
언차티드4 테크아트 파트1 톤맵핑&색보정Dae Hyek KIM
 
PBR 기초 이론과 사용되는 맵들 Vol.3
PBR 기초 이론과 사용되는 맵들 Vol.3PBR 기초 이론과 사용되는 맵들 Vol.3
PBR 기초 이론과 사용되는 맵들 Vol.3Jooyoung Yi
 
영웅의 군단의 테크니컬 아트 - 황재철, 유나이트 코리아 2014
영웅의 군단의 테크니컬 아트 - 황재철, 유나이트 코리아 2014영웅의 군단의 테크니컬 아트 - 황재철, 유나이트 코리아 2014
영웅의 군단의 테크니컬 아트 - 황재철, 유나이트 코리아 2014NDOORS
 
Shadow mapping 정리
Shadow mapping 정리Shadow mapping 정리
Shadow mapping 정리changehee lee
 
【Unite Tokyo 2018】『崩壊3rd』開発者が語るアニメ風レンダリングの極意
【Unite Tokyo 2018】『崩壊3rd』開発者が語るアニメ風レンダリングの極意【Unite Tokyo 2018】『崩壊3rd』開発者が語るアニメ風レンダリングの極意
【Unite Tokyo 2018】『崩壊3rd』開発者が語るアニメ風レンダリングの極意UnityTechnologiesJapan002
 
[NDC19] 모바일에서 사용가능한 유니티 커스텀 섭스턴스 PBR 셰이더 만들기
[NDC19] 모바일에서 사용가능한 유니티 커스텀 섭스턴스 PBR 셰이더 만들기[NDC19] 모바일에서 사용가능한 유니티 커스텀 섭스턴스 PBR 셰이더 만들기
[NDC19] 모바일에서 사용가능한 유니티 커스텀 섭스턴스 PBR 셰이더 만들기Madumpa Park
 
5강 알파와알파소팅
5강 알파와알파소팅5강 알파와알파소팅
5강 알파와알파소팅JP Jung
 
中級グラフィックス入門~シャドウマッピング総まとめ~
中級グラフィックス入門~シャドウマッピング総まとめ~中級グラフィックス入門~シャドウマッピング総まとめ~
中級グラフィックス入門~シャドウマッピング総まとめ~ProjectAsura
 

What's hot (20)

[1023 박민수] 깊이_버퍼_그림자_1
[1023 박민수] 깊이_버퍼_그림자_1[1023 박민수] 깊이_버퍼_그림자_1
[1023 박민수] 깊이_버퍼_그림자_1
 
Ndc2010 전형규 마비노기2 캐릭터 렌더링 기술
Ndc2010 전형규   마비노기2 캐릭터 렌더링 기술Ndc2010 전형규   마비노기2 캐릭터 렌더링 기술
Ndc2010 전형규 마비노기2 캐릭터 렌더링 기술
 
[Ndc12] 누구나 알기쉬운 hdr과 톤맵핑 박민근
[Ndc12] 누구나 알기쉬운 hdr과 톤맵핑 박민근[Ndc12] 누구나 알기쉬운 hdr과 톤맵핑 박민근
[Ndc12] 누구나 알기쉬운 hdr과 톤맵핑 박민근
 
Motion blur
Motion blurMotion blur
Motion blur
 
감마가 어디감마
감마가 어디감마감마가 어디감마
감마가 어디감마
 
2009-2016 기본기(손맵)의 중요성
2009-2016 기본기(손맵)의 중요성2009-2016 기본기(손맵)의 중요성
2009-2016 기본기(손맵)의 중요성
 
[0806 박민근] 림 라이팅(rim lighting)
[0806 박민근] 림 라이팅(rim lighting)[0806 박민근] 림 라이팅(rim lighting)
[0806 박민근] 림 라이팅(rim lighting)
 
물리 기반 셰이더의 이해
물리 기반 셰이더의 이해물리 기반 셰이더의 이해
물리 기반 셰이더의 이해
 
Depth from Videos in the Wild: Unsupervised Monocular Depth Learning from Unk...
Depth from Videos in the Wild: Unsupervised Monocular Depth Learning from Unk...Depth from Videos in the Wild: Unsupervised Monocular Depth Learning from Unk...
Depth from Videos in the Wild: Unsupervised Monocular Depth Learning from Unk...
 
[Kgc2012] deferred forward 이창희
[Kgc2012] deferred forward 이창희[Kgc2012] deferred forward 이창희
[Kgc2012] deferred forward 이창희
 
모바일 게임 최적화
모바일 게임 최적화 모바일 게임 최적화
모바일 게임 최적화
 
언차티드4 테크아트 파트1 톤맵핑&색보정
언차티드4 테크아트 파트1 톤맵핑&색보정언차티드4 테크아트 파트1 톤맵핑&색보정
언차티드4 테크아트 파트1 톤맵핑&색보정
 
PBR 기초 이론과 사용되는 맵들 Vol.3
PBR 기초 이론과 사용되는 맵들 Vol.3PBR 기초 이론과 사용되는 맵들 Vol.3
PBR 기초 이론과 사용되는 맵들 Vol.3
 
영웅의 군단의 테크니컬 아트 - 황재철, 유나이트 코리아 2014
영웅의 군단의 테크니컬 아트 - 황재철, 유나이트 코리아 2014영웅의 군단의 테크니컬 아트 - 황재철, 유나이트 코리아 2014
영웅의 군단의 테크니컬 아트 - 황재철, 유나이트 코리아 2014
 
Shadow mapping 정리
Shadow mapping 정리Shadow mapping 정리
Shadow mapping 정리
 
【Unite Tokyo 2018】『崩壊3rd』開発者が語るアニメ風レンダリングの極意
【Unite Tokyo 2018】『崩壊3rd』開発者が語るアニメ風レンダリングの極意【Unite Tokyo 2018】『崩壊3rd』開発者が語るアニメ風レンダリングの極意
【Unite Tokyo 2018】『崩壊3rd』開発者が語るアニメ風レンダリングの極意
 
[NDC19] 모바일에서 사용가능한 유니티 커스텀 섭스턴스 PBR 셰이더 만들기
[NDC19] 모바일에서 사용가능한 유니티 커스텀 섭스턴스 PBR 셰이더 만들기[NDC19] 모바일에서 사용가능한 유니티 커스텀 섭스턴스 PBR 셰이더 만들기
[NDC19] 모바일에서 사용가능한 유니티 커스텀 섭스턴스 PBR 셰이더 만들기
 
5강 알파와알파소팅
5강 알파와알파소팅5강 알파와알파소팅
5강 알파와알파소팅
 
中級グラフィックス入門~シャドウマッピング総まとめ~
中級グラフィックス入門~シャドウマッピング総まとめ~中級グラフィックス入門~シャドウマッピング総まとめ~
中級グラフィックス入門~シャドウマッピング総まとめ~
 
D2 Hdr
D2 HdrD2 Hdr
D2 Hdr
 

Similar to 그림자 이야기

Depth buffershadow
Depth buffershadowDepth buffershadow
Depth buffershadowMoonLightMS
 
Unity cookbook 17
Unity cookbook 17Unity cookbook 17
Unity cookbook 17Jihun Soh
 
마른 하늘에 날구름 넣기
 마른 하늘에 날구름 넣기 마른 하늘에 날구름 넣기
마른 하늘에 날구름 넣기ajin kim
 
코덱스 워리어 무기제작가이드 천동재
코덱스 워리어 무기제작가이드 천동재코덱스 워리어 무기제작가이드 천동재
코덱스 워리어 무기제작가이드 천동재Lee Jungpyo
 
6강 light shadow 기초
6강 light shadow 기초6강 light shadow 기초
6강 light shadow 기초JP Jung
 
6강 light shadow 기초
6강 light shadow 기초6강 light shadow 기초
6강 light shadow 기초JP Jung
 
6강 light shadow 기초
6강 light shadow 기초6강 light shadow 기초
6강 light shadow 기초JP Jung
 
언차티드4 테크아트 파트3 MicroShadowBRDF Term
언차티드4 테크아트 파트3 MicroShadowBRDF Term언차티드4 테크아트 파트3 MicroShadowBRDF Term
언차티드4 테크아트 파트3 MicroShadowBRDF TermDae Hyek KIM
 
2018.02.03 이미지 텍스처링
2018.02.03 이미지 텍스처링2018.02.03 이미지 텍스처링
2018.02.03 이미지 텍스처링Sukwoo Lee
 
크게, 아름답게,빠르게, 일관되게 만들기: Just Cause 2 개발에서 배운 교훈들 (GPU Pro)
크게, 아름답게,빠르게, 일관되게 만들기: Just Cause 2 개발에서 배운 교훈들 (GPU Pro)크게, 아름답게,빠르게, 일관되게 만들기: Just Cause 2 개발에서 배운 교훈들 (GPU Pro)
크게, 아름답게,빠르게, 일관되게 만들기: Just Cause 2 개발에서 배운 교훈들 (GPU Pro)민웅 이
 
Cascade Shadow Mapping
Cascade Shadow MappingCascade Shadow Mapping
Cascade Shadow MappingSukwoo Lee
 
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019devCAT Studio, NEXON
 
[0918 박민수] 범프 매핑
[0918 박민수] 범프 매핑[0918 박민수] 범프 매핑
[0918 박민수] 범프 매핑MoonLightMS
 
포인트 셰도우
포인트 셰도우포인트 셰도우
포인트 셰도우Sukwoo Lee
 
Unite2015 probelight(150417)
Unite2015 probelight(150417)Unite2015 probelight(150417)
Unite2015 probelight(150417)SangYun Yi
 
유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019
유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019
유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019devCAT Studio, NEXON
 
딥 다크 던전 그래픽 작업기
딥 다크 던전 그래픽 작업기딥 다크 던전 그래픽 작업기
딥 다크 던전 그래픽 작업기Jungsoo Park
 
Unity cookbook 6
Unity cookbook 6Unity cookbook 6
Unity cookbook 6Jihun Soh
 
니시카와젠지의 3 d게임 팬을 위한「gravity daze」그래픽스 강좌
니시카와젠지의 3 d게임 팬을 위한「gravity daze」그래픽스 강좌니시카와젠지의 3 d게임 팬을 위한「gravity daze」그래픽스 강좌
니시카와젠지의 3 d게임 팬을 위한「gravity daze」그래픽스 강좌민웅 이
 

Similar to 그림자 이야기 (20)

Depth buffershadow
Depth buffershadowDepth buffershadow
Depth buffershadow
 
Unity cookbook 17
Unity cookbook 17Unity cookbook 17
Unity cookbook 17
 
마른 하늘에 날구름 넣기
 마른 하늘에 날구름 넣기 마른 하늘에 날구름 넣기
마른 하늘에 날구름 넣기
 
코덱스 워리어 무기제작가이드 천동재
코덱스 워리어 무기제작가이드 천동재코덱스 워리어 무기제작가이드 천동재
코덱스 워리어 무기제작가이드 천동재
 
6강 light shadow 기초
6강 light shadow 기초6강 light shadow 기초
6강 light shadow 기초
 
6강 light shadow 기초
6강 light shadow 기초6강 light shadow 기초
6강 light shadow 기초
 
6강 light shadow 기초
6강 light shadow 기초6강 light shadow 기초
6강 light shadow 기초
 
언차티드4 테크아트 파트3 MicroShadowBRDF Term
언차티드4 테크아트 파트3 MicroShadowBRDF Term언차티드4 테크아트 파트3 MicroShadowBRDF Term
언차티드4 테크아트 파트3 MicroShadowBRDF Term
 
2018.02.03 이미지 텍스처링
2018.02.03 이미지 텍스처링2018.02.03 이미지 텍스처링
2018.02.03 이미지 텍스처링
 
크게, 아름답게,빠르게, 일관되게 만들기: Just Cause 2 개발에서 배운 교훈들 (GPU Pro)
크게, 아름답게,빠르게, 일관되게 만들기: Just Cause 2 개발에서 배운 교훈들 (GPU Pro)크게, 아름답게,빠르게, 일관되게 만들기: Just Cause 2 개발에서 배운 교훈들 (GPU Pro)
크게, 아름답게,빠르게, 일관되게 만들기: Just Cause 2 개발에서 배운 교훈들 (GPU Pro)
 
Cascade Shadow Mapping
Cascade Shadow MappingCascade Shadow Mapping
Cascade Shadow Mapping
 
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
 
[0918 박민수] 범프 매핑
[0918 박민수] 범프 매핑[0918 박민수] 범프 매핑
[0918 박민수] 범프 매핑
 
포인트 셰도우
포인트 셰도우포인트 셰도우
포인트 셰도우
 
Unite2015 probelight(150417)
Unite2015 probelight(150417)Unite2015 probelight(150417)
Unite2015 probelight(150417)
 
유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019
유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019
유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019
 
Uncharted4 part1
Uncharted4 part1Uncharted4 part1
Uncharted4 part1
 
딥 다크 던전 그래픽 작업기
딥 다크 던전 그래픽 작업기딥 다크 던전 그래픽 작업기
딥 다크 던전 그래픽 작업기
 
Unity cookbook 6
Unity cookbook 6Unity cookbook 6
Unity cookbook 6
 
니시카와젠지의 3 d게임 팬을 위한「gravity daze」그래픽스 강좌
니시카와젠지의 3 d게임 팬을 위한「gravity daze」그래픽스 강좌니시카와젠지의 3 d게임 팬을 위한「gravity daze」그래픽스 강좌
니시카와젠지의 3 d게임 팬을 위한「gravity daze」그래픽스 강좌
 

그림자 이야기

  • 2. 일상 생활에서의 그림자 정의 그림자는 빛의 경로상에서 불투명한 물체가 있을 때, 빛의 직진성으로 인해 빛이 통과하지 못하는 부분이 생기는데, 이를 그림자라한다.
  • 3. 일상 생활에서의 그림자 정의 A: 태양 D: 반 그림자 E: 본 그림자 B: 지구 C: 달
  • 4. 일상 생활에서의 그림자 정의 간단히 말해서, 빛을 반사시키지 못하고 흡수할 수 있는 물체들은 모두 그림자를 만들 수 있다고 보면 됩니다.
  • 7. 게임에서의 그림자 사례 그림자의 품질에 따라서도 시각적으로 비교했을 때 현실성을 떨어뜨리는 효과를 낳게 됩니다.
  • 8. 게임에서의 그림자 사례 아예 그림자가 존재하지 않을 경우에는 캐릭터가 땅 위에 붕 떠 있어 보이는데 현상까지 낳게 됩니다.
  • 9. 게임에서의 그림자 중요성 정말 그림자는 중요할까?
  • 10. 게임에서의 그림자 중요성 대부분의 고사양 게임들은 고급설정을 제공하여 유저들에게 커스터 마이즈를 할 기회를 제공해주는 데, 대부분의 유저들이 가장 먼저 시도하는 최적화가 그림자 옵션 OFF일 것이다!
  • 11. 게임에서의 그림자 중요성 보라! 그림자가 없어도 게임하는 맛은 나지 않는가?
  • 12. 게임에서의 그림자 중요성 하지만, FPS장르의 경우에서는 그림자를 활용해서 상대를 공격하는 경우도 있기 때문에 현실성 높은 그림자를 만드는 목표로 만드는 건 사실성을 높 이는 거 뿐만 아니라 게임내적인 요소에서도 재미를 부과할 수가 있을 것입니다.
  • 14. 게임에서의 그림자 다루는것! 그렇습니다. 우리는 차폐물에 의해 생성되는 그림자 만들어야 합니다...
  • 15. 게임에서의 그림자 다루는것! 물론 좀 더 이후의 세대에서는 레이트레이싱을 이용하면 더 이상 지금과 같은 꼼수를 사용할 필요가 없을지도 모릅니다...
  • 16. 그림자 기법 종류 원형 그림자 평면 투영 그림자 스텐실 그림자 투영 텍스처 그림자 우선 순위 버퍼 그림자 깊이 버퍼 그림자
  • 18. 그림자 기법 원형그림자 3D게임에 그림자가 등장하면서 많이 사용된 방식. 현재까지도 사라지지 않고 사용되어지고 있습니다.
  • 19. 그림자 기법 원형그림자 그 이유는... 부하가 적고 하드웨어사양와도 크게 상관이 없기 때문에 빛이 있는 곳에 어둠을 표시하기 위한 최소한의 장치로서 활약하고 있습니다.
  • 20. 그림자 기법 원형그림자 하지만 치명적인 약점이 존재하는 데... 빛에 영향을 받는 게 아니라 그림자가 될 텍스처를 사용해 찍기 때문에 비현실적이고, 모양이 언제나 같으며, 평면이 아닌 지형에서도 사용은 할 수 있으 나 여러가지면에서 예쁘지 못합니다!
  • 21. 그림자 기법 원형그림자 다음과 같은 원형그림자 텍스처를 만들어 둡니다. 그림자의 위치를 지정해주기 위해 높이가 Y좌표일 때 [X,Z]좌표를 사용하여 위치를 지정하고, 해당 모델보다 약간 아래로 그림자를 찍으 면 됩니다. 너무 간단하기 때문에 설명은 여기까지.
  • 22. 그림자 기법 평면투영그림자 평면만을 위해서 태어난 그림자 기법. 말 그대로 평면에서만 사용할 수 있는 그림자 방식입니다.
  • 23. 그림자 기법 평면투영그림자 앞에 원형그림자에 비해서 텍스처를 이용하지 않고 모델을 한번 더 그리기 때문에, 원본 모델을 그림자로 사용하고자 할 경우 한번 더 그려야 됩니다.( 물론 텍스처를 입히지 않은 상태 ) 그렇기 때문에 폴리곤이 많은 모델일 경우, 그림자용 모델을 따로 제작해야 되는 번거로움이 존재합니다.
  • 24. 그림자 기법 평면투영그림자 물론 원형그림자에 비해서 그림자가 모델 모양에 가깝게 나오기 때 문에 평면에서만 사용한다는 가정하에 현실성을 높여줄 수 있습니다. 지형이 평면에서밖에 안 사용되어진다면 평면투영 그림자기법은 다른 어떤 그림자기법보다 가장 먼저 꺼내서 사용하시면 되겠습니다.
  • 25. 그림자 기법 평면투영그림자 광원(태양)으로부터 정점을 통과하는 직선을 연장해서, 평면과 교차하는 위치에 새로운 정점을 만들어 그림자 영역을 그리는 방식입니다.
  • 26. 그림자 기법 평면투영그림자 위의 행렬식이 바로 평면에 그림자를 투영시켜 줍니다. 단 해당 식은 오른손 좌표계 기준이므로 왼손 좌표계에서 사용할려면 전치시켜주면 됩니다.
  • 27. 그림자 기법 평면투영그림자 하지만 DirectX를 사용하신다면, D3DX 라이브러리에서 제공해주는 D3DXMatrixShadow()를 사용하는 게 일반적입니다. 참고로 D3DX가 사라진 DX11에도 이를 제공해주고는 있겠죠?
  • 28. 그림자 기법 평면그림자 지금까지 살펴본 것들은 부하가 적으며, 셰이더도 전혀 사용하지 않았습니다. 무엇보다 평면 그림자에 맞춰져 있었습니다!
  • 30. 그림자 기법 투영 텍스처 그림자 텍스처를 실시간으로 생성하여 지면에 텍스처를 입히는 방식. 그러므로 이전의 방식들과는 달리 지형이 울퉁불퉁하여도 예쁜 모양의 그림자를 만들어 낼 수 있습니다.
  • 31. 그림자 기법 투영 텍스처 그림자 다음과 같은 화면이 있습니다. 광원 카메라
  • 32. 그림자 기법 투영 텍스처 그림자 카메라의 위치를 광원이 있는 위치 카메라 로 옮깁니다. 광원 왜냐하면 그림자는 광원의 영향을 받아서 만들어지므로, 광원의 위치를 가지고 텍스처에 해 당 장면을 그려주어야 하기 때문입 니다.
  • 33. 그림자 기법 투영 텍스처 그림자 그러면 다음과 같은 텍스처를 얻으 광원 실 수 있습니다. 그리고 옮겼던 카메라 위치는 다시 원래의 자리로 돌립니다. 카메라
  • 34. 그림자 기법 투영 텍스처 그림자 광원에서의 투영공간과 텍스처공간은 중심위치가 다르므로 U = +0.5X + 0.5 V = -0.5Y + 0.5 위의 식을 사용하여 투영공간의 좌표를 텍스처공간의 좌표로 변환해줄 수 있습니다.
  • 35. 그림자 기법 투영 텍스처 그림자 이를 행렬로 표현하면 다음과 같습니다. 근데 왜 갑자기 투영 공간의 좌표를 텍스처 공간으로 옮기는 작업을 하고 있나요?
  • 36. 그림자 기법 투영 텍스처 그림자 우선 우리가 만든 텍스처는 광원 위치에서 찍은 투영공간상에 찍은 것입니다. 그리고 흰색과 검은색으로 단 2개의 색으 로 이루어져 있다는 것을 확인할 수 있습니다.
  • 37. 그림자 기법 투영 텍스처 그림자 즉, 카메라 위치에서 모델을 그리면, 정점은 투영공간으로 변환됩니다. 그림자를 그릴 때 위의 텍스처로 만든 투영 텍스처를 그림자로 사용하기 위해서 찍은 것이므로, 투영공간 => 텍스처공간 변환 이후에 해당 위치의 텍셀을 참조하여 그림자인지 아닌지를 판 단하게 됩니다.
  • 38. 그림자 기법 투영 텍스처 그림자 FinalColor = DestColor * SrcTexel 흰색은 1.0f이므로 DestColor가 그대로 나오겠지만, 검은색은 0.0f이므로 0.0f 즉 검은색으로 나오게 되어 그림자가 생성되어지게 될 것입니다.
  • 39. 그림자 기법 투영 텍스처 그림자 즉 방금 살펴본 과정을 다시 여기 에서 설명하면 DestColor의 대상이 되는 곳이 바 로 이 지면일 것입니다. 1. 광원위치에서 그림자 텍스처 생 성 2. 그림자 텍스처를 지면과 혼합시 켜서 그림자 출력.
  • 40. 그림자 기법 투영 텍스처 그림자 주의사항으로는 텍스처 어드레싱 모드를 DirectX기준으로 D3DTADDRESS_CLAMP 으로 해주어 [0,1]범위 이외의 텍셀은 투명하도록 해줍니다. 안 그러면 위와 같이 나오지 말아야 할 그림자가 나오는 현상이 발생하게 됩니다.
  • 41. 그림자 기법 투영 텍스처 그림자 보셨듯이 텍스처에 그림자를 남기는 방식이기 때문에 텍스처에 최대한 많은 그림자를 생성하면 한번의 패스로 많은 그림자들을 한번에 그릴 수 있습니다. 단, 큰 해상도의 텍스처가 필요할 것이기 때문에 그만큼 메모리를 많이 소비할 수밖에 없습니다. 또 작게 만들면 그만큼 그림자 품질도 떨어지겠죠?
  • 42. 그림자 기법 투영 텍스처 그림자 그 외에도 그림자를 출력할 대상이 될 지면 오브젝트를 정하는 것과 광원과 그림자 사이에 장애물 오브젝트가 존재할 경우 이상한 곳에 그림자가 나올 수 있다는 것을 주의해야 합니다.
  • 43. 그림자 기법 투영 텍스처 그림자 그냥 문제될만한 이런 제약사항이 없을 때 이 기법을 이용합시다!
  • 44. 그림자 기법 스텐실 그림자 스텐실 그림자는 2004년 존카막의 둠3에 의해 세상에 공개되어졌습니다...
  • 45. 그림자 기법 스텐실 그림자 스텐실 그림자의 최대 장점은 바로 앞에 기법들이 해내지 못한 셀프그림자를 지원하다는 것입니다.
  • 46. 그림자 기법 스텐실 그림자 스텐실 그림자는 다음과 같이 그림자 볼륨이라는 것을 생성하게 됩니다. 이게 무엇이냐면 광원의 방향으로부터 빛을 받은 정점들은 뒤쪽으로 잡 아서 늘여 뜨리게 됩니다.
  • 47. 그림자 기법 스텐실 그림자 실제 화면을 보면 다음과 같은 그림자 볼륨을 생성하게 됩니다. 화면에 보이는 건 단순한 모델이지만 그림자 볼륨까지 봤을 때 정점수가 상당히 많아 보입니다.
  • 48. 그림자 기법 스텐실 그림자 그렇습니다... 렌더링 부하가 장난아니게 큽니다. 픽셀셰이더에는 부하가 없으나 정점셰이더에는 이들이 모두 들어가기 때문이니까요.
  • 49. 그림자 기법 스텐실 그림자 어쨌든 지금은 스텐실 그림자를 다루고 있으니 계속 진행하겠습 니다.
  • 50. 그림자 기법 스텐실 그림자 원리는 간단합니다. 우선 그림자 볼륨의 앞면을 스텐실 버퍼에 +1이라고 기록을 하도록 합니다. 만약 광원이 여러 개라면 중첩 으로 인해 +1이상의 값이 나올 수도 있겠죠.
  • 51. 그림자 기법 스텐실 그림자 이번에는 그림자 볼륨의 뒷면입 니다. 앞면과는 반대로 -1을 기록하도 록 합니다. 이제는 어느 정도 감이 올 수 있 겠죠?
  • 52. 그림자 기법 스텐실 그림자 그렇습니다. 앞면과 뒷면은 사실 그림자가 될 수 없는 운명이었습니다. 이들은 합쳐져 최종적으로 0이 되었기에 볼륨은 사실상 최종적 인 화면에서 제외됩니다. 하지만 실제로 그림자가 출력되 어져야 할 부분은 뒷면이 존재 하지 않기에 +1만 남아 그림자가 되었습니다.
  • 53. 그림자 기법 스텐실 그림자 형, 쉬운 남자야! 존나 어려울줄 알았지? 이론적으론 간단해!
  • 54. 그림자 기법 스텐실 그림자 하지만 그림자 볼륨으로 인한 정점 증가는 그래픽 디자이너에게 그림자 볼륨을 줄이기 위한 외형을 단순화를 어느 정도 제약할 수 밖에 없습니다.
  • 55. 그림자 기법 스텐실 그림자 지오메트리 셰이더가 등장하면서 다시 이 기법은 재평가(?)가 이루어지고 있습니다. 하지만 DX9세대까지는 사용하기 부담스럽습니다.
  • 56. 쉬어가는 코너 • http://www.youtube.com/watch?v=JZsqCX U9ki4&feature=youtu.be • http://www.youtube.com/watch?v=vWkhyI eEfjY • http://www.youtube.com/watch?v=OuB0j9 2CSCs
  • 57. 그림자 기법 우선순위 버퍼 그림자 우선순위 버퍼 그림자 역시 앞서 보았던 그림자 기법들처럼, 광원의 위치에서 오브젝트들을 렌더링합니다. 다만 그림자가 될 오브젝트뿐만 아니라 화면안에 그려져야 할 모든 대상의 오브젝트들을 그린다는 차이점이 있습니다.
  • 58. 그림자 기법 우선순위 버퍼 그림자 우선순위 버퍼그림자는 각각의 오브젝트들을 자기 입맛대로 색깔을 지정해주어 텍스처에 기록할 수 있습니다. 즉 이 입혀진 색깔은 오브젝트의 성격임과 동시에 서로 다를 경우 그림자 가 나타날 수 있습니다.
  • 59. 그림자 기법 우선순위 버퍼 그림자 위에서 보았던 오브젝트들을 가지고 텍스처에 기록해봅시다. 지면은 검은색, 그리고 구는 주황색으로 기록하였습니다.
  • 60. 그림자 기법 우선순위 버퍼 그림자 텍스처의 내용을 그대로 갖다 붙여서 생각해본다면 다음과 같은 모양 이 될 것입니다.
  • 61. 그림자 기법 우선순위 버퍼 그림자 128 32 내용을 쉽게 이해하기 위해 텍스처에 기록할 때, 지면은 132, 구는 32로 기록했다고 합시다. 현재 ID가 입력된 그림자 텍스처인 ID맵은 완성된 상태이므로 실제로 오브젝트에 그림자를 입히는 작업을 하도록 합시다.
  • 62. 그림자 기법 우선순위 버퍼 그림자 32 구를 먼저 그립니다. 보시다시피 구만 덩그러니 그려질 것입니다. 왜냐하면 ID맵을 보았듯이 구가 더 뷰에 가까웠기 때문에, ID맵을 참조하여도 ID가 같으므로 그림자를 만들 건덕지가 없습니다.
  • 63. 그림자 기법 우선순위 버퍼 그림자 그림자 텍스처와 128 겹쳐진 부분 32 128의 ID를 가진 지면을 그릴 경우 네모부분이 바로 그림자가 되는 부분인데요. 128인 부분을 그리면서 겹쳐진 부분을 만나게 됩니다. FinalColor = 지면IDofPixel != ID맵ofPixel ? 0 : DestColor; 식을 보시다시피 ID맵으로부터 참조해서 다를 경우에 그림자가 생기도록 합니다.
  • 64. 그림자 기법 우선순위 버퍼 그림자 그림자 텍스처와 128 겹쳐진 부분 32 128의 ID를 가진 지면을 그릴 경우 네모부분이 바로 그림자가 되는 부분인데요. 128인 부분을 그리면서 겹쳐진 부분을 만나게 됩니다. FinalColor = 지면IDofPixel != ID맵ofPixel ? 0 : DestColor; 식을 보시다시피 ID맵으로부터 참조해서 다를 경우에 그림자가 생기도록 합니다.
  • 65. 그림자 기법 우선순위 버퍼 그림자 투영 텍스처 그림자처럼 셀프그림자를 지원하지 않습니다. 전후 관계를 고려하기 때문에 많은 오브젝트가 있어도 그림자가 정확 하게 출력된다는 장점이 있습니다. 물론 ID가 서로 같을 경우에는 무슨일이 있어도 그림자가 생기지 않으니 이러한 점은 고려되어져야 합니다.
  • 66. 그림자 기법 깊이버퍼 그림자 우선순위버퍼 그림자와의 차이점은 단지 ID로 사용하는 색을 그리는 게 아니라 아예 깊이 버퍼값을 사용한다는 것입니다. 샘플그림은 메탈기어솔리드4로서 지금 설명하는 기법을 사용했기에 한번 넣어봤습니다.
  • 67. 그림자 기법 깊이버퍼 그림자 광원의 위치로부터 깊이 버퍼로 텍스처를 그리게 된다면, 가까이 있는 것은 검게, 멀리 있는 것은 하얗게 표시되는 흑백필름영화 느낌의 텍스처를 얻게 될 것입니다.
  • 68. 그림자 기법 깊이버퍼 그림자 두번째 패스에서 오브젝트를 그립니다. 그려진 오브젝트의 깊이값은 깊이버퍼를 기록한 텍스처와 비교를 해야 하므로 정점좌표 * (월드행렬*광원위치의 뷰행렬*투영행렬) 를 곱해야만 같은 공간에 있게 되므로 올바른 비교가 될 것입니다.
  • 69. 그림자 기법 깊이버퍼 그림자 FinalColor = ZofDepthMap < ZofDestBuffer ? 0 ? DestColor; 즉 깊이맵이 그려져야 할 곳의 깊이값보다 더 작다면 뷰에 더 가깝다는 것을 의미하고 배경을 덮어 씌우는 것이기 때문에, 그림자가 만들어 질 것입니다.
  • 70. 그림자 기법 깊이버퍼 그림자 하지만 이 공식만 사용해서 구현했을 경우... 예상치 못한 결과가 나옵니다.
  • 71. 그림자 기법 깊이버퍼 그림자 바로 이러한 경우입니다.
  • 72. 그림자 기법 깊이버퍼 그림자 왜 그럴까요?
  • 73. 그림자 기법 깊이버퍼 그림자 깊이값이 픽셀 단위이기 때문에 생기는 문제 입니다. 미세하게 어긋나서 줄무늬가 생기는데요.
  • 74. 그림자 기법 깊이버퍼 그림자 다음의 공식에서 마법의 숫자를 넣어주어 해결하시면 됩니다. 실제 실행하시면서 찾으시면 됩니다. FinalColor = ZofDepthMap < ZofDestBuffer - Magic ? 0 ? DestColor;
  • 75. 쉬어가는 코너 • http://www.youtube.com/watch?v=UJLelV CO0wQ • http://www.youtube.com/watch?v=KUwWv tCy988&feature=related • http://www.youtube.com/watch?v=gZrklEy 9ohQ&feature=related
  • 76. 발표를 마치면서... 기본적인 구현원리를 알아야 이런 거 개발할 수 있습니다.
  • 77. 참고자료 • 3D 그래픽스 매니악스 • DirectX9 셰이더 프로그래밍 • 이미지들 대부분은 구글을 통해 가져와버 림...