17
Deferred Decal 이민웅 Shader Study

Deferred decal

  • Upload
    -

  • View
    2.592

  • Download
    2

Embed Size (px)

DESCRIPTION

shader study

Citation preview

Page 1: Deferred decal

Deferred Decal이민웅

Shader Study

Page 2: Deferred decal

Decal

• Decal 이란?

– 벽에 총알 자국을 표시 할때

– 반복적인 기하구조에 변화는 줄때

• Deferred Decal?

– 뷰포트 공간에서 적용하는 방식

– 조명과 잘 통합됨

– 애니메이션 되는 캐릭터에서 적용가능

Page 3: Deferred decal

Crysis 2 & CryENGINE 3

Page 4: Deferred decal

문제

• Decal은 조명과 잘 통합되어야 함– Deferred Render이면 문제 없음

• Decal은 모든 표면(정적이든 동적이든)에서 납득할 수있는 결과를 내야 함– Gbuffer에 8비트 채널하나를 데칼을 위해 사용해야함

• Decal은 기하구조의 경계에 맞게 잘려야 함– 데칼이 물체의 적용되는 표면을 따라야함

• Decal 시스템은 충돌 검출에 쓰이는 것과는 아주 다를수 있는 기하구조에 대해서도 잘 작동해야 함– 복잡한 메시들은 충돌검출을 위해 덜 세밀한 메시를 사용한

다는 문제

– 반직선 투사 알고리즘이 돌려준 교점이 데칼을 실제로 랜더링할 지점과 상당히 다를 수 있다는 것

Page 5: Deferred decal

구현

• 데칼의 경계 입체에 적용되는 셰이더 이용

• 필요한 정보는 위치와 방향, 크기, 텍스쳐

정보(랜더링되는 뷰포트의 깊이 값)

• 데칼 공간에서 작업

– 셰이더에서 데칼의 변환행렬의 역행렬을 넘김

Page 6: Deferred decal
Page 7: Deferred decal

기하구조 랜더링

• 데칼이 적절한 깊이에 랜더

링을 하기 위해서는 경계

입방체를 그려서 어떤 방향

에서도 볼 수 있게 만듬

• 작은 데칼에게 잘 됨

Page 8: Deferred decal

기하구조 랜더링 문제

• 후면선별(BackFace Culling)을 활성화 하고 깊이 판정을 less로 둔 상태에서 입방체를 랜더링하면 카메라가그 입방체에 진입하는 순간 데칼이 사라짐

• 해결책– 전면 선별(frontface culling)을 활성화하고 greater으로 랜더

– 데칼이 카메라에 가까운 기하구조에 가려지는 경우 불필요하게 많은 단편들이 랜더링 된다는 단점

• 입방체 꼭짓점들 중 카메라에 가장 가까운것을 찾아서그 깊이에서 정렬된, 그리고 입방체 전체를 덮을 만큼커다란 사각형을 하나 랜더링 하는 것– 단, 가장 가까운 꼭짓점이 가까은 절단 평면보다 앞에 있다

면, 가까운 절단 평면의 깊이에서 화면 전체를 덮는 사각형을 랜더링

Page 9: Deferred decal

기하구조 랜더링

• 한 장면에 데칼들이 많이 적용되는 경우

– 하드웨어 인스턴싱으로 랜더링

• 성능 최적화에 도움

– 인스턴싱으로 최적화하는 경우

• 입방체의 위치, 크기를 미리 설정

• 단위 입방체를 사용하고 위치와 크기를 정점셰이더

안에서 적절히 변환

Page 10: Deferred decal

기하구조 랜더링

Page 11: Deferred decal

페이드 아웃

• 데칼을 x,y평면에 단순하게 투영하면 데칼

의 z축방향으로 번지는 결함이 생김

• 페이드 아웃이용해서 데칼 색상을 사라지

게 함

Page 12: Deferred decal
Page 13: Deferred decal

모서리 감싸기

• 데칼이 모서리에 감싸게 하고 복잡한 표면들의 곡면을 따르게 하는 것

• 표면의 법선을 데칼 공간으로 회전하면 x,y성분은 표면의 기울기에 해당– 데칼 평면을 기준

• 기울기와 단편과 데칼 평면사이의 거리를텍스쳐 좌표로 수정– 상대적 기울기가 없는 영역에서는 텍스쳐 좌

표가 변하지 않음

– 기울기가 큰 영역들(모퉁이)에서는 텍스쳐 좌표가 데칼 평면과의 거리에 따라 바깥으로 이동

• 핏자국등 액체가 튄 흔적을 표현할때 유용

• 투영과 감싸기 기능을 활용하면 어떤 종류의 표면 사용 가능

Page 14: Deferred decal
Page 15: Deferred decal

표면절단

• 표면 절단의 이유– 데칼을 전혀 잘라내지 못함

• 하나의 상자에 붙힌 데칼은 그 상자가 놓인 지면에도 투영

• 방법1– 데칼의 정적 기하구조가 덮고 있는 픽셀들에게만 한정하는 것

– 정적물체를 랜더링 후 데칼을 적용하고 동적인 물체는 그 후 랜더링

• 방법 2– 기하 버퍼의 또 다른 채널을 마련하고, 랜더링되는 각 물체에 대한 “데칼

ID”를 채널에 저장

– 기하버퍼 랜더링시 각 물체에 대한 데칼 ID를 분산색, 법선과 함께 버퍼에 저장

– 데칼ID는 상수• 셰이더는 ID를 기하 버퍼에서 읽은 ID와 비교

– 데칼 ID는 픽셀이 어떤 물체에 속한 것인지를 식별하기 위한 픽셀 당 마스크 역할

– 정적기하구조가 아무런 구분없이 랜더링 한다면 동일한 ID값을 공유해도됨

– 동적물체는 다른 고유 ID를 사용• 가까이 있는 두물체만 같은 ID를 사용할 가능성만 없게 하면 고유할필요는 없음

Page 16: Deferred decal

결론

• 여러 상황에서 좀 더 진짜 같아 보이도록 2D 투영을 개선한 것– 입체적인 데칼을 만들어내는 것은 아님

• 시각적 결함을 방지하기 위해서는 입체적인 데칼을 사용해야함– 수직 기둥 모서리 같은 것들…

• 핏자국등은 표면 법선들 때문에 왜곡된다해도 핏자국으로 보여별 상관없음

• 경제 입체 판정을 통해서 데칼을 미리 랜더링에서 제외하는 것이 가능

• GPU의 인스턴싱을 이용 해서 많은 수의 데칼을 일괄적으로 랜더링 가능– 수많은 데칼들이 겹쳐지는 상황은 피해야 함

– 동시에 존재 할 수 있는 데칼수를 제한하는게 좋음

– MaxPayne은 한 지역에 만들 수 있는 데칼 수를 제한하여 이전에방문했던 방에 다시 들어가도 핏자국이나 총알자국이 그래도 남아있음 (멋있음)

Page 17: Deferred decal

Q & A

감사합니다.

Shader Study