DirectX11 Deferred Rendering

호야·2024년 4월 27일
post-thumbnail

Deferred Rendering


기존 포워드 렌더링 방식에서 디퍼드 + 포워드를 같이 사용하는 방식으로 변경했다.

조명이 A 개가 있고 물체가 B 개있다면

포워드 렌더링 방식에서는 물체 한개당 셰이더에서 조명 개수만큼 계산하므로 총 B x A 번 계산 해야 된다.

디퍼드 렌더링 방식에서는 디퍼드 셰이딩에서 물체의 정보를 저장하고 포워드 셰이더에서 색상값을 저장해서 픽셀단위로 저장한 물체의 정보를 나중에 한번에 조명연산을 해주면 되므로 2B + A 번만 계산하면 된다.

디퍼드 렌더링만으로는 물체의 투명도를 적용하기가 어렵다.


투명도를 적용하고 물체를 두 번 그리는 드로우콜을 한번으로 줄이기 위해서 한 셰이더 안에서 디퍼드와 포워드 정보를 동시에 저장할 수 있게 구현해보았다.


모든 물체를 세개의 렌더타겟을 세팅하고 렌더링을 한다.


셰이더 매크로로 디퍼드 렌더링이면 추가 정보를 저장하고 포워드 렌더링이면 0 값으로 저장한다.


후처리 셰이더에서 저장한 추가정보의 w 값으로 디퍼드 방식인지 포워드 방식인지 구분하고 디퍼드이면 추가 라이트 연산을 해준다. ( 조명 , 그림자 등 )



UI 로 Position , Normal 출력



이렇게 하면 물체의 투명도도 적용이 되고 ( 투명을 적용할 물체는 맨 뒤에서 렌더링 해주었다. )

드로우 콜도 물체당 한번으로 줄일 수 있다.


단점

한 셰이더에 들어가는 모든 렌더타겟 , 후처리 , swapchain 의 포맷을 맞춰주어야 한다.
-> resolve 를 해야 한다면 렌더타겟 수만큼 추가로 resolve 연산이 늘어남

하나라도 다르면 다른 렌더타겟의 화면이 검은화면으로 나옴

ex) f16 , MSAA 동일시켜줘야 한다

0개의 댓글