공부/Graphics, DirectX, 포트폴리오 구조

디퍼드 렌더링(Deferred Rendering)에서 반투명한 물체를 위한 블렌딩처리가 안되는 이유

sudo 2022. 5. 24. 16:12

디퍼드 렌더링은 각 물체별로의 최종 색상(= 고유의 Diffuse Color에 Light를 적용한 색상)을 구하지 않고, 화면에 그려질 픽셀에 대해서만 최종 색상을 구한다. 블렌드는 결국 최종 색상끼리 블렌딩처리를 해야 하는데, 디퍼드 렌더링은 겹쳐지는 물체들의 픽셀에 그려지는 모든 최종 색상을 알 수 있는게 아니라 렌더 타겟에 존재하는 픽셀들의 최종 색상만 아는 것이다(디퍼드 렌더링은 화면 해상도 크기의 버퍼에 픽셀 별 최종 깊이 판정을 모두 거친, 빛을 받기 전 물체 고유한 색깔(=Diffuse Color)을 GBuffer에, Light들을 LightDiffuse, Light 모아둔다.

 

반투명 A 물체와 불투명 B 물체가 겹쳐지는 픽셀이 있는데 블렌딩 처리가 되려면 당연히 A물체의 최종 색상과 B물체의 최종 색상도 어딘가에 존재해야 한다. 그리고 결과적으로 겹쳐지는 부분에는 반투명한 물체 뒤에 불투명한 물체가 흐릿하게 보여야 한다.

 

그런데, 예를 들어, A물체가 깊이 값이 0.3이고 B물체의 깊이 값이 0.5면 겹쳐지는 픽셀에 쓰려는 B 물체의 픽셀은 폐기될 것이다. B는 고유 색상에 Light처리를 해주기도 전에, GBuffer에 쓰여지지도 못해서 RenderGBuffer 다음인 LightAcc 쉐이더에서 GBuffer를 가져와서 봐도 B 물체의 픽셀은 없을 것이다. 그러면 A와 B 픽셀의 블렌딩 처리를 할 수가 없다.