렌더링 프로세스가 시작된 이후에는
CPU가 오브젝트의 위치관련 모든것을 계산
실제 렌더링 할것이 무엇인지 계산을 한후에 실제 렌더링을 시작.
-----------------------------------------------------------------------------------------------
Prepass / Early Z pass(Depth Pass 라고도 한다.)
무엇을 무엇 앞에 그려야 할지 모른다 그렇기 때문에 이과정을 거친다.
각각의 오브젝트 들을 각각 렌더링 하는 것이 아니라.
Prepass 를 거쳐서 필요한 부분만 렌더링을 할 수 있도록 계산하는 과정.
렌더링이 땡하고 시작하면
Early Z pass(Depth Pass 라고도 한다.)깁이값을 계산하고
렌더링 프로세스때 계산된 정보를 가지고
극도로 단순하고 기본적인 방식으로 렌더링을 한다.
깊이에 따라 렌더링의 순서가 정해지고 마스크를 생성
렌더링의 최종 프레임에 렌더링 할것을 결정한다
이모든 과정을 Prepass 라고한다.
@Drawcalls(드로우콜)
Prepass후 오브젝트 단위로 렌더링을한다.
보다 구체적으로 드로우 콜 단위라고함
드로우콜은 하나의 사물을 처리하고 렌더링하는 것을 말한다.
보통 같은 속성을 공유하는 폴리곤 그룹을 뜻한다.(오브젝트)
EX) 하나의 모델링에 10개의 머터리얼을 적용 시킨 경우엔
하나의 드로우 콜이아닌 10개의 드로우 콜
엔진에서 스텟을확인해보면 빈장면에서 드로우콜은 어느정도 일어난다. 내부적으로 돌아가는
숨겨진 작업이 있기때문. 이점을 명심하고 스텟을 확인 하여야 할것
---------------------------------------------------------------------------------------------------------
영상에서 설명하는 드로우콜이 중요한 이유.
드로우콜 2-3천 적당하다. 요즘 게임에는 표준이며 하드웨어가 소화하기도 적당
5천정도도 괜찮을것입니다. 5천개가 넘어가면 약간많고 만개가 넘어가면 아마 문제가 될것입니다.
여기서의 키워드는 "아마" 입니다. 하드웨어에따라, 무엇을하는가에 따라 달라지기때문
모바일이나 VR게임인경우는 천정도이지만 역시 하는 작업에 따라다르다.
드로우콜이 퍼포먼스에 주는 영향은 엄청납니다. 렌더링이 끝날때마다 렌더스레드에서 명령을 받는데
그것도 비용이다. 드로콜은 여러 상황에서 폴리곤수 보다 훨씬 큰 영향을 줍니다.
이전에는 트라이앵글수를 매우 주의깊게 봤었습니다. 사실 요즘은, 그중요성이 떨어졌습니다.
90년대 렌더러에서는 중요했었죠. 너무 단순하고 피쳐 수도 적어서 중요하게 신경쓸것이
폴리곤 수밖에 없었습니다.
하지만 UE4나 대부분의 리얼타임 렌더러의 경우
드로콜과 다른 여러 가지 요소가 폴리곤 수보다 훨씬 큰 영향을 끼친다.
EX) 트라이앵글 8600만개 드로우콜 3000
(트라이앵글을 극단적으로 많이 사용했지만 하나의 머터리얼로 적용) - FPS 33.68
트라이앵글 10만개 드로우콜 4만 4천개
(트라이엥글을 최적화 했지만 메테리얼을 극단적으로 많이 적용시켰다) - FPS 4.60
보통 드로우콜 비용이 폴리곤보다 높다고한다.
방식 상황에 따라 트라이앵글 5만개가 5천만개보다 느릴 수 있다.
드로우콜에는 기본적인 비용이 있기때문에 폴리곤을 최적화 한다고 해도 차이가 거의 없을수 있다.
드로우콜을 줄이려면 다수의 작은 모델보다는 소수의 큰모델이 낫다.
---------------------------------------------------------------------------------------
모듈식으로 작업을 하게되면 큰덩어리들을 나누어서 배치를 하는것이기때문에
그만큼 메테리얼이나 오브젝트들이 나뉘 어지면서 드로우콜이 발생한다.
모듈식으로 작업하게되면 작업시간과 메모리가 절약된다.
라이팅도 향상된다 라이트맵을 많이쓰기때문
오클루전 프로세스, 콜리전, LOD 에도좋다 하지만 드로우콜이 많아짐 그렇기때문에
균형을 잡는것이 중요하다.
영상에서는 모듈로 배치를 끝내고 모듈에서 또모듈이되는것을 합쳐서 또다른 모듈을만듬.
4개의 모듈을 병합(하나로합치면서) 환경에있는모델의 수, 드로우콜을 줄였다.
이상적으로 드로우콜을 줄이기 위해서는 같은메테리얼인 경우,꼭필요한 곳에서만 하는것
병합이 필수는 아니다. 문제가 있을때만 하면된다. FPS잘나오는데 굳이 병합할 필요는없다.
단순하고 가벼운 오브젝트, 같은 머터리얼, 같은공간, 아주 멀리에 있는 오브젝트
--------------------------------------------------------------------------------------------
씬을 작업할때에
렌더링의 개념을 이해하고
어떤식으로 모듈을 진행 해야 할지
트라이엥글 최소화도 물론 중요
드로우콜 도 생각 하면서 균형을 마추는게 중요 할거 같다.
-------------------------------------------------------------------------------------------
언리얼에서 메시는 메모리에서 인스턴싱한다.
하지만 렌더링에는 인스턴싱하지 않는다.
메모리 인스턴싱이란
모델을 임포트한경우 콘텐츠창에 임포트한 오브젝트가들어옴
이 오브젝트를 언리얼 뷰포트 레벨에 배치, 3개 4개를 하게되어도 메모리는 똑같다,
이유는 콘텐츠창에있는
오브젝트를 메모리에서 인스턴싱 하는것이기 때문이다.
EX) 400kb(킬로바이트) 의 오브젝트를 씬에 4개를 배치를해도 메모리는 400kb
레벨에 중복되는 오브젝트를 3개를 배치하면 메모리는 같고 렌더링은 3번한다.
이말뜻은 메모리에서는 인스턴싱 했지만 렌더링에서는 인스턴싱하지 않았다는 뜻이다.
렌더링에서 인스턴스를 하지 않는 이유는
드로우콜은 하나로 줄겠지만 렌더링을 할때마다
타겟이되는 오브젝트와 씬에있는 모든 오브젝트를 비교해 계산 하기 때문이다.
이렇게 계산하는게 더무 겁기 때문에 그냥 계산하는게 빨라서 렌더링에서는 인스턴싱을 하지않는다.
중복되는 오브젝트의 개채수가 많은 경우에는 인스턴싱을 사용하는게 빠르다.
그렇기 때문에 언리얼에서는
비슷한 확률이 높은 오브젝트 들의 목록을 만들어서 프로세스를 빠르게한다.
이기술은 폴리지와 초목에 사용된다.
인스턴스 스태틱메쉬 렌더링 이라고 한다.
동일하고 중복되는 오브젝트가 수백 수십개를 렌더링 해야할때. 사용 하여야 한다.
LOD와 드로우콜
LOD만 사용하면 버텍스는 줄어들지만 드로우콜은 줄지않는다. 당연한 것,
가까이서보든 멀리서 보든 드로우 콜은 같다.
HLOD- 를 이용해 드로우콜을 줄일수있다.
EX)
4개의 몰려있는 오브젝트를 멀리서 LOD가 적용되었을때 HLOD-를 이용해 하나의 오브젝트로 해준다.
이렇게 4개를 1개로 줄였다.
야외 환경에서는 반드시 적용 필수이다.