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

포워드 렌더링(Forward Rendering) vs 디퍼드 렌더링(Deferred Rendering)

sudo 2022. 10. 11. 00:48

포워드 렌더링

물체를 그리고 그 물체에 대한 라이팅을 적용하는 순서로 렌더링. 

N개의 광원과 M개의 물체가 있는 씬에서 NxM번의 드로우 콜이 필요하다. 그래서 물체가 많을 때에는 성능 저하가 심하다

 

디퍼드 렌더링

포워드 렌더링을 사용함으로써 생기는 성능 저하를 방지하게 위해 멀티 렌더 타겟(MRT)를 지원하는 경우 사용할 수 있다.

N개의 광원과 M개의 물체가 있는 씬에서 N+M번의 드로우 콜이 필요

 

과정

1. 모든 물체에 대해 화면 해상도 크기의 렌더 타겟에 물체 고유의 색상(라이트를 적용하기 전 색상을 의미. Material 자체의 Diffuse, Emmisivem, Ambient, Specular 색상), 깊이 값, 노말 벡터 등을 저장

2. 똑같은 크기의 다른 렌더 타겟에 Light를 누적시킨 값들을 저장

3. 1번과 2번에서 저장한 픽셀들을 통해 최종 픽셀의 색상을 결정

 

디퍼드 렌더링의 단점

반투명 물체에 대한 처리를 위해 추가적인 처리가 필요하다. 디퍼드 렌더링으로 처리할 때에는 불투명 물체를 먼저 모두 다 렌더링하고 난 후 포워드 렌더링 방식으로 반투명 물체를 처리해줘야 한다. 이때 포워드 렌더링 방식으로 반투명 물체를 처리할 때는 깊이값을 내림차순으로 정렬하고 포워드 렌더링으로 렌더링해줘야 한다. 그렇지 않으면 겹쳐진 반투명 오브젝트끼리 블렌드 처리가 되지 않고 깊이 반정에 의해 탈락하는 픽셀이 생길 수 있기 때문이다

 

 

------------------------------------------------------------공부하면서 들었던 호기심 ------------------------------------------------------------

Q) 왜 불투명 물체를 먼저 렌더링하고 반투명 물체를 나중에 렌더링해야하나?

A) 반투명한 물체를 먼저 그리면 불투명한 물체가 깊이 판정에 의해 픽셀이 탈락할 수도 있다. 예를 들어 반투명한 물체의 깊이가 0.3이고 불투명한 물체의 깊이가 0.5면 원래대로라면 반투명 물체와 불투명한 물체가 겹치는 부분은 색상이 블렌드 처리 되어야 하는데 그러지 않고 아예 깊이가 0.5인 불투명 물체가 탈락해서 그려지지 않을 것이다.  

 

Q) 왜 RenderState를 추가할 때, D3D11_RENDER_TARGET_BLEND_DESC Desc 구조체에서 SrcBlendAlpha(=픽셀 셰이더의 출력 알파값)은 DestBlendAlpha 멤버(=현재 렌더 타겟의 알파값)를 0으로 하나?

A) 생각해보면 이게 맞는듯하다. 예를 들어 이미 렌더 타겟에 알파가 0.9인 픽셀이 있고 내가 이 픽셀에 알파가 0.1인 색상을 블렌드처리하려면 90%의 색상으로 이미 렌더타겟에 존재하는 색상과 10%의 지금 픽셀 셰이더에서 색상으로 섞으려는 것이므로, 이 픽셀의 알파(=투명도)는 0.1이 되는게 맞아 보인다

 

 

Reference

https://agh2o.tistory.com/13?category=707164 

 

[Eunbi's Farm - DirectX11] 디퍼드 렌더링

* 포워드 라이팅 : 각 Mesh에 대하여 각 광원에 관한 것을 모두 그려야 한다. N개의 광원과 M개의 Mesh가 포함된 씬을 표현하기 위해서는 NxM번의 드로우 콜이 필요하다. 이 호출수가 크기 때문에 FPS

agh2o.tistory.com