Deferred Decal
     이민웅
  Shader Study
Decal
• Decal 이란?
  – 벽에 총알 자국을 표시 할때
  – 반복적인 기하구조에 변화는 줄때
• Deferred Decal?
  – 뷰포트 공간에서 적용하는 방식
  – 조명과 잘 통합됨
  – 애니메이션 되는 캐릭터에서 적용가능
Crysis 2 & CryENGINE 3
문제
• Decal은 조명과 잘 통합되어야 함
  – Deferred Render이면 문제 없음
• Decal은 모든 표면(정적이든 동적이든)에서 납득할 수
  있는 결과를 내야 함
  – Gbuffer에 8비트 채널하나를 데칼을 위해 사용해야함
• Decal은 기하구조의 경계에 맞게 잘려야 함
  – 데칼이 물체의 적용되는 표면을 따라야함
• Decal 시스템은 충돌 검출에 쓰이는 것과는 아주 다를
  수 있는 기하구조에 대해서도 잘 작동해야 함
  – 복잡한 메시들은 충돌검출을 위해 덜 세밀한 메시를 사용한
    다는 문제
  – 반직선 투사 알고리즘이 돌려준 교점이 데칼을 실제로 랜더
    링할 지점과 상당히 다를 수 있다는 것
구현
• 데칼의 경계 입체에 적용되는 셰이더 이용
• 필요한 정보는 위치와 방향, 크기, 텍스쳐
  정보(랜더링되는 뷰포트의 깊이 값)
• 데칼 공간에서 작업
 – 셰이더에서 데칼의 변환행렬의 역행렬을 넘김
기하구조 랜더링
• 데칼이 적절한 깊이에 랜더
  링을 하기 위해서는 경계
  입방체를 그려서 어떤 방향
  에서도 볼 수 있게 만듬
• 작은 데칼에게 잘 됨
기하구조 랜더링 문제
• 후면선별(BackFace Culling)을 활성화 하고 깊이 판정
  을 less로 둔 상태에서 입방체를 랜더링하면 카메라가
  그 입방체에 진입하는 순간 데칼이 사라짐
• 해결책
  – 전면 선별(frontface culling)을 활성화하고 greater으로 랜더
    링
  – 데칼이 카메라에 가까운 기하구조에 가려지는 경우 불필요
    하게 많은 단편들이 랜더링 된다는 단점
• 입방체 꼭짓점들 중 카메라에 가장 가까운것을 찾아서
  그 깊이에서 정렬된, 그리고 입방체 전체를 덮을 만큼
  커다란 사각형을 하나 랜더링 하는 것
  – 단, 가장 가까운 꼭짓점이 가까은 절단 평면보다 앞에 있다
    면, 가까운 절단 평면의 깊이에서 화면 전체를 덮는 사각형
    을 랜더링
기하구조 랜더링
• 한 장면에 데칼들이 많이 적용되는 경우
 – 하드웨어 인스턴싱으로 랜더링
  • 성능 최적화에 도움
 – 인스턴싱으로 최적화하는 경우
  • 입방체의 위치, 크기를 미리 설정
  • 단위 입방체를 사용하고 위치와 크기를 정점셰이더
    안에서 적절히 변환
기하구조 랜더링
페이드 아웃
• 데칼을 x,y평면에 단순하게 투영하면 데칼
  의 z축방향으로 번지는 결함이 생김
• 페이드 아웃이용해서 데칼 색상을 사라지
  게함
모서리 감싸기
• 데칼이 모서리에 감싸게 하고 복잡한 표면
  들의 곡면을 따르게 하는 것
• 표면의 법선을 데칼 공간으로 회전하면 x,y
  성분은 표면의 기울기에 해당
 – 데칼 평면을 기준
• 기울기와 단편과 데칼 평면사이의 거리를
  텍스쳐 좌표로 수정
 – 상대적 기울기가 없는 영역에서는 텍스쳐 좌
   표가 변하지 않음
 – 기울기가 큰 영역들(모퉁이)에서는 텍스쳐 좌
   표가 데칼 평면과의 거리에 따라 바깥으로 이
   동
• 핏자국등 액체가 튄 흔적을 표현할때 유용
• 투영과 감싸기 기능을 활용하면 어떤 종류
  의 표면 사용 가능
표면절단
• 표면 절단의 이유
  – 데칼을 전혀 잘라내지 못함
     • 하나의 상자에 붙힌 데칼은 그 상자가 놓인 지면에도 투영
• 방법1
  – 데칼의 정적 기하구조가 덮고 있는 픽셀들에게만 한정하는 것
  – 정적물체를 랜더링 후 데칼을 적용하고 동적인 물체는 그 후 랜더링
• 방법 2
  – 기하 버퍼의 또 다른 채널을 마련하고, 랜더링되는 각 물체에 대한 “데칼
    ID”를 채널에 저장
  – 기하버퍼 랜더링시 각 물체에 대한 데칼 ID를 분산색, 법선과 함께 버퍼
    에 저장
  – 데칼ID는 상수
     • 셰이더는 ID를 기하 버퍼에서 읽은 ID와 비교
  – 데칼 ID는 픽셀이 어떤 물체에 속한 것인지를 식별하기 위한 픽셀 당 마
    스크 역할
  – 정적기하구조가 아무런 구분없이 랜더링 한다면 동일한 ID값을 공유해도
    됨
  – 동적물체는 다른 고유 ID를 사용
     • 가까이 있는 두물체만 같은 ID를 사용할 가능성만 없게 하면 고유할필요는 없음
결론
• 여러 상황에서 좀 더 진짜 같아 보이도록 2D 투영을 개선한 것
  – 입체적인 데칼을 만들어내는 것은 아님
• 시각적 결함을 방지하기 위해서는 입체적인 데칼을 사용해야
  함
  – 수직 기둥 모서리 같은 것들…
• 핏자국등은 표면 법선들 때문에 왜곡된다해도 핏자국으로 보여
  별 상관없음
• 경제 입체 판정을 통해서 데칼을 미리 랜더링에서 제외하는 것
  이 가능
• GPU의 인스턴싱을 이용 해서 많은 수의 데칼을 일괄적으로 랜
  더링 가능
  – 수많은 데칼들이 겹쳐지는 상황은 피해야 함
  – 동시에 존재 할 수 있는 데칼수를 제한하는게 좋음
  – MaxPayne은 한 지역에 만들 수 있는 데칼 수를 제한하여 이전에
    방문했던 방에 다시 들어가도 핏자국이나 총알자국이 그래도 남아
    있음 (멋있음)
Q&A

감사합니다.

Shader Study

Deferred decal

  • 1.
    Deferred Decal 이민웅 Shader Study
  • 2.
    Decal • Decal 이란? – 벽에 총알 자국을 표시 할때 – 반복적인 기하구조에 변화는 줄때 • Deferred Decal? – 뷰포트 공간에서 적용하는 방식 – 조명과 잘 통합됨 – 애니메이션 되는 캐릭터에서 적용가능
  • 3.
    Crysis 2 &CryENGINE 3
  • 4.
    문제 • Decal은 조명과잘 통합되어야 함 – Deferred Render이면 문제 없음 • Decal은 모든 표면(정적이든 동적이든)에서 납득할 수 있는 결과를 내야 함 – Gbuffer에 8비트 채널하나를 데칼을 위해 사용해야함 • Decal은 기하구조의 경계에 맞게 잘려야 함 – 데칼이 물체의 적용되는 표면을 따라야함 • Decal 시스템은 충돌 검출에 쓰이는 것과는 아주 다를 수 있는 기하구조에 대해서도 잘 작동해야 함 – 복잡한 메시들은 충돌검출을 위해 덜 세밀한 메시를 사용한 다는 문제 – 반직선 투사 알고리즘이 돌려준 교점이 데칼을 실제로 랜더 링할 지점과 상당히 다를 수 있다는 것
  • 5.
    구현 • 데칼의 경계입체에 적용되는 셰이더 이용 • 필요한 정보는 위치와 방향, 크기, 텍스쳐 정보(랜더링되는 뷰포트의 깊이 값) • 데칼 공간에서 작업 – 셰이더에서 데칼의 변환행렬의 역행렬을 넘김
  • 7.
    기하구조 랜더링 • 데칼이적절한 깊이에 랜더 링을 하기 위해서는 경계 입방체를 그려서 어떤 방향 에서도 볼 수 있게 만듬 • 작은 데칼에게 잘 됨
  • 8.
    기하구조 랜더링 문제 •후면선별(BackFace Culling)을 활성화 하고 깊이 판정 을 less로 둔 상태에서 입방체를 랜더링하면 카메라가 그 입방체에 진입하는 순간 데칼이 사라짐 • 해결책 – 전면 선별(frontface culling)을 활성화하고 greater으로 랜더 링 – 데칼이 카메라에 가까운 기하구조에 가려지는 경우 불필요 하게 많은 단편들이 랜더링 된다는 단점 • 입방체 꼭짓점들 중 카메라에 가장 가까운것을 찾아서 그 깊이에서 정렬된, 그리고 입방체 전체를 덮을 만큼 커다란 사각형을 하나 랜더링 하는 것 – 단, 가장 가까운 꼭짓점이 가까은 절단 평면보다 앞에 있다 면, 가까운 절단 평면의 깊이에서 화면 전체를 덮는 사각형 을 랜더링
  • 9.
    기하구조 랜더링 • 한장면에 데칼들이 많이 적용되는 경우 – 하드웨어 인스턴싱으로 랜더링 • 성능 최적화에 도움 – 인스턴싱으로 최적화하는 경우 • 입방체의 위치, 크기를 미리 설정 • 단위 입방체를 사용하고 위치와 크기를 정점셰이더 안에서 적절히 변환
  • 10.
  • 11.
    페이드 아웃 • 데칼을x,y평면에 단순하게 투영하면 데칼 의 z축방향으로 번지는 결함이 생김 • 페이드 아웃이용해서 데칼 색상을 사라지 게함
  • 13.
    모서리 감싸기 • 데칼이모서리에 감싸게 하고 복잡한 표면 들의 곡면을 따르게 하는 것 • 표면의 법선을 데칼 공간으로 회전하면 x,y 성분은 표면의 기울기에 해당 – 데칼 평면을 기준 • 기울기와 단편과 데칼 평면사이의 거리를 텍스쳐 좌표로 수정 – 상대적 기울기가 없는 영역에서는 텍스쳐 좌 표가 변하지 않음 – 기울기가 큰 영역들(모퉁이)에서는 텍스쳐 좌 표가 데칼 평면과의 거리에 따라 바깥으로 이 동 • 핏자국등 액체가 튄 흔적을 표현할때 유용 • 투영과 감싸기 기능을 활용하면 어떤 종류 의 표면 사용 가능
  • 15.
    표면절단 • 표면 절단의이유 – 데칼을 전혀 잘라내지 못함 • 하나의 상자에 붙힌 데칼은 그 상자가 놓인 지면에도 투영 • 방법1 – 데칼의 정적 기하구조가 덮고 있는 픽셀들에게만 한정하는 것 – 정적물체를 랜더링 후 데칼을 적용하고 동적인 물체는 그 후 랜더링 • 방법 2 – 기하 버퍼의 또 다른 채널을 마련하고, 랜더링되는 각 물체에 대한 “데칼 ID”를 채널에 저장 – 기하버퍼 랜더링시 각 물체에 대한 데칼 ID를 분산색, 법선과 함께 버퍼 에 저장 – 데칼ID는 상수 • 셰이더는 ID를 기하 버퍼에서 읽은 ID와 비교 – 데칼 ID는 픽셀이 어떤 물체에 속한 것인지를 식별하기 위한 픽셀 당 마 스크 역할 – 정적기하구조가 아무런 구분없이 랜더링 한다면 동일한 ID값을 공유해도 됨 – 동적물체는 다른 고유 ID를 사용 • 가까이 있는 두물체만 같은 ID를 사용할 가능성만 없게 하면 고유할필요는 없음
  • 16.
    결론 • 여러 상황에서좀 더 진짜 같아 보이도록 2D 투영을 개선한 것 – 입체적인 데칼을 만들어내는 것은 아님 • 시각적 결함을 방지하기 위해서는 입체적인 데칼을 사용해야 함 – 수직 기둥 모서리 같은 것들… • 핏자국등은 표면 법선들 때문에 왜곡된다해도 핏자국으로 보여 별 상관없음 • 경제 입체 판정을 통해서 데칼을 미리 랜더링에서 제외하는 것 이 가능 • GPU의 인스턴싱을 이용 해서 많은 수의 데칼을 일괄적으로 랜 더링 가능 – 수많은 데칼들이 겹쳐지는 상황은 피해야 함 – 동시에 존재 할 수 있는 데칼수를 제한하는게 좋음 – MaxPayne은 한 지역에 만들 수 있는 데칼 수를 제한하여 이전에 방문했던 방에 다시 들어가도 핏자국이나 총알자국이 그래도 남아 있음 (멋있음)
  • 17.