렌더링 방식 2가지 (디퍼드, 포워드)
디퍼드 렌더링 방식 -
디퍼드 렌더링은 고급 에플리케이션에서 더욱 안정적이고 더 향상된 퍼포먼스를 보여준다.
디퍼드방식의 약점(안티에얼라이싱), 안티에얼라이싱은 포워드렌더링이 더 낫다.
디퍼드는 Temporal Anti- Aliasing의 약자인 TAA(템포럴AA) 만을 제공
(TAA 때문에 프레임에서 약간의 고스트현상이 발생,
언리얼엔진뿐 아니라 대부분의 실시간 렌더러에 일반적인문제.)
포워드 렌더링 방식-
모바일게임,VR게임 보통은 이렇다.
하드웨어 제약이 있는경우에서 앱을 실행하는 경우에 포워드 렌더링방식을 사용한다.
(안티에얼라이싱 MSAA)
-----------------------------------------------------------------------------------------------------------------------------------------------------------
디퍼드
디퍼드 셰이딩은 mesh를 그릴 때 가지고 있는 여러 정보들을 G-buffer에 두고 필요한 정보를 새겨놓고,
이를 기반으로 모든 각각의 라이팅에 대해 mesh가 가진 정보를 활용해 픽셀들의 색을 결정하는 방식이다.
포워드
보다 직관적으로 mesh에 영향을 주는 모든 라이트를 계산, 한 번에 그려내는 것을 의미하는데,
Surface Attribute에 유연하고 하드웨어 MSAA를 사용할 수 있다는 장점이 있으나
동적 라이트 추가 시 성능 부하가 크다는 단점을 가지고 있다.
추가: 환상정원님 블로그에 디퍼드 포워드렌더링
https://blog.naver.com/blue9954/220296252565
보강설명.
https://blog.naver.com/denver0718/221180259572
언리얼 엔진 4는 모바일 플랫폼에서는 포워드 셰이딩만 사용이 가능하며,
이 기능은 모바일 씬 렌더러가 담당하고 있다.
모바일에서 디퍼드 셰이딩을 지원하지 않는 이유는
G-buffer 사용시 많은 대역폭을 요구하며,
현 세대의 디바이스에서 게임을 플레이할 수 있는 정도의 성능을 낼 수 없기 때문
GBuffer -
보통 포워드 렌더링 방식은 사용하지 않는다.
각프레임의 이미지 세트를 말한다.
이 이미지에 저장되는 모든 정보가 이후에 렌더링 프로세스에 쓰이며,
이때 하는 작업이 실시간 합성. 화면을 다양한 버전으로 렌더링 출력한뒤에
그룹화 하여 GBuffer에 두고 GBuffer에 있는 여러 버전을 활용하여
렌더링 프로세스에서 다른 작업을 할 때 사용할 수 있다.
쉐이더.
렌더링 도중에는 보통 아주 단순한 계산을 몇번이고 계속 반복해서 해야한다.
그래서 그런작업만을 담당하는 하드웨어와 소프트웨어를 만들었는데. 그것이 쉐이더 이다.
다양한 종류의 쉐이더는 GPU 하드웨어의 전담부분에서 작은 계산을 수없이 반복한다.
실시간 렌더링에서 쉐이더는 매우 중요하고 렌더링 성능에도 크게 영향을 미친다.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
언리얼엔진 실시간 렌더링 (리얼타임렌더링[RTR])
심화과정
올바른 개념잡기
리얼 타임 렌더링이란 아무것도 없을때 효율이 가장 좋다. 그렇게 생각하면된다.
최고의 퍼포먼스는 프로젝트에 아무것도 없을때(공백) 뭐가있으면 당연히 계산을 해야하기때문.
리얼 타임 렌더링이란 그손실을 관리하는 프로세스
퍼포먼스를 얼마나 잃을 것인가는 작업자에게 달려있다.
그에따라 비주얼 퀄리티를 얼마나 얻는지도
여기에서 퍼포먼스는 프레임레이트를 의미, 최적화. 좋은 작업이라도 실행이 되지 않는다면 의미없다.
무언가 비용이 발생 할때마다 최대한을 얻어낼 수 있도록 해야한다.
RTR 은 완벽하지 않다. 퀄리티, 퍼포먼스, 퓨처 세가지의 요소를 모두 잡기 어렵다.
3가지의 균형을 마추어야함 그것을 목표로하고 그안에서 완벽을 기해야함
명심할것은 무언가는 포기해야한다.
디퍼드 포워드 추가설명
포워드는 시작 퍼포먼스가 매우 좋다 하지만 무언가를 노을때마다 퍼포먼스가 계속 떨어진다.
디퍼드는 시작 퍼포먼스가 매우 낮다 무언가를 노을때마다 낮은 퍼포먼스를 유지, 안정성이 높다.
언리얼엔진에서의 렌더링 프로세스
렌더링이 진행 되기전 CPU 에서는 계산을 한다.
크게 3가지
디스턴스 컬링 - [거리 계산] 후 보일지 안보일지 설정
프로스텀 컬링 - 카메라가 비추어 지곳에만 오브젝트들이 나오고 비추어 지지않는 곳은 오브젝트가 사라진다.
(기본적으로 적용이 되어있다. )
오클루전 프로세스- 모든 모델의 가시성 상태를 검사(매우 정확하다)
오클루전 프로세스가 무겁기 때문에 제일 마지막에 함.
계산하기 쉬운것을 먼저해서 퍼포먼스 부담을 줄이기 위해
이래 계산을 하고 랜더링이 진행 됨. 실제론 더 복잡 하다고 한다.
영상 내용에서 예제 파일을보면 벽따로 기둥따로 모듈화하여 배치한 씬을 예로
모듈화를 해서 씬을 구성하였는지와 모듈화를 왜 하여야 하는지에 대해 짧게 나마 나오는데.
내용은 이렇다.
-------------------------------------------------------------------------------------------------------
모듈화를 하는 이유는 많다고 알고있다.
렌더링 에서의 모듈
모듈화를 하면 오브젝트 개수가 많아 지기 때문에 오클루전 프로세스를 많이 잡아 먹는다.
(시작할때 오브젝트가 늘어난 수만큼 계산을한다.)
(위에 3가지 프로세스는 씬이 켜지는 순간 CPU에서 씬에있는 모든것을 계산을 시작한다. 여기에서
프로세스 들에 의해 보여줄것 안보여줄 것을 계산하고 렌더링이된다.
----------------------------------------------------------------------------------------------------
예제
모듈을 하지 않고 통짜로 건물 하나를 가져온 예
오클루전 프로세스는 하나로 (CPU계산은 내려감) 계산 하지만
카메라에 아주 작은 부분이라도 이 통 오브젝트가 잡히게 되면 프로세스 계산으로 인해서
오브젝트를 통으로 렌더링 하게된다. (GPU계산이 올라감)
(반대로 모듈로 나누어져 있다면 오클루전 프로세스가 계산할게 많아 지게(CPU 계산이 올라감) 되지만
화면에 잡히는, 나누어져 있는 오브젝트 들만 렌더링 되고 불 필요한 오브젝트들은 가려지게 된다.(GPU 계산은 내려감)
프로세스 계산(CPU)은 길어 지지만 오브젝트들이 세분화 되어 있어서 화면에 안보이는 불필요한
오브젝트 들을 잘 걸러내서 렌더링(GPU)계산을 효율적으로 한다.
-----------------------------------------------------------------------------------------------------
추가 설명에서는 렌더링에서의 2가지 방식은 완벽 하지 못하다
그렇기 때문에 위에서 본 균형을 고려하여 작업 하여야 한다.