포워드, 디퍼드 렌더링(라이팅, 쉐이딩이라 부르기도함)이란 라이팅을 어떻게 할거냐를 정하는것이다.
URP나 HDRP, 빌트인 같이 파이프라인이랑 다른 개념으로 해당 파이프라인에서 포워드 디퍼드를 선택할 수 있다.
빌트인에서, URP에서 포워드 디퍼드를 세팅하는 방법은 UR Data를 만들어
렌더링 패스를 바꿔주면됨. 그 UR Data는 URP Asset에서 렌더 리스트를
추가할 수 있다. 카메라에 설정하는 Rendering은 무엇을 의미하는지 찾지 못했다.
디퍼드 렌더링은 포워드의 단점을 보완하고자 나옴. 2010년도 본격적으로
많이쓰임. 디바이스의 발전이 필요했기 때문. Forward 거의 안씀
G(Geometry) Buffer 디퓨즈,뎁스, 노멀 등(렌더타겟, 렌더텍스처라 함)
라이트에 필요한 속성들을 저장하는 버퍼. 나중에 라이트를 계산
오브젝트가 그려질때 각 렌더 타겟이 그려지는데 한번에 3개 이상의 렌더타겟
에 그리니 렌더 타겟만큼 대역폭(전달해야할 데이터 양)이 더 필요하다.
HDRP를 쓸때 라이팅이 하나라도 디퍼드가 더 성능에 유리한가? 상황별 다름
포워드의 경우 오버드로우가 발생할 수 밖에 없는데 HDRP가 이미 비싼
쉐이더 일 경우(ex 클리어코트, 스킨메시)가 있어서 그때 오버드로우가 발생시
성능에 문제가 생기므로 디퍼드가 좋은 해결책이 될 수 있다.
G버퍼를 만들고 각 렌더타겟에서 픽셀 정보를 가져와서 빛과 연산함.
뎁스의 경우 저장시 리니어(0~1)하게 저장하는곳도 있고 z/w로 나눠서 저장
하는 엔진도 있음.
보통 디퍼드는 최소 4개 이상의 렌더타겟을 사용. 대역폭 아끼기 위해
채널을 따로써 구겨넣음. 유니티의 G버퍼 구성
위 그림에 보면 뎁스 버퍼는 렌더 타겟에 없는데 요즘엔 하드웨어가 뎁스
버퍼를 읽을수 있게 제공. 예전엔 직접 렌더 타겟으로 만들어야 했다. API로 접근 가능
프레임 디버거로 G버퍼를 확인할 수 있으며 RT0(렌더 타겟0번), Depth 선택해서 표시 가능.
단점은 머티리얼을 다양하게 다루지 못한다. G버퍼는 다양한 데이터를 못
다루지 못하고 정해진 데이터만 넣을수 있기 떄문이다. 예를들어 클리어코트,
스킨 쉐이더의 경우 스케틀링이 효과 필요, 헤어같은 경우는 스펙큘러도
일반 방식과 달라 정포가 더필요. 그래서 포워드에서 다시 그려야하고 특히 반투명도 마찬가지.
이런 다양한 머티리얼을 다룰수 있도록 Light Pre-pass를 도입함.
라이팅을 처리한 Lit 버퍼만 따로 만들어서 임시로 저장하고 있는 상태에서
새로 오브젝트를 버텍스, 프래그먼트 쉐이더를 거치면서 그리는데 그때 다양한
머티리얼을 구현 후 그 결과에 위 Lit 버퍼 결과를 합성을 하면 구현 가능.
다만 드로우콜이 2배.
Inferred Lighing : G버퍼의 사이즈를 줄여서 만든다음 라이팅 처리후
프레임 버퍼에서는 업스케일을 통하여 필터링 통해서 경계도 이쁘게 하여 보여줌
다운사이징의 한계가 있어 실제 게임엔진에 도입되지 않음.
PC와 모바일의 대역폭 차이는 1/10 정도며 PC도 모니터 해상도가 커지면서
PC도 대역폭 문제가 됨