본문 바로가기
DirectX/[팀플] Death's Door 모작

Deferred Rendering

by GameStudy 2022. 12. 19.

1. Forward Rendering

1.1 Forward Rendering이란,

  - 한 마디로, 기존의 Rendering 방식. 

    개체 A가 Render Target에 그려지려면 Vertex Shader와 Pixel Shader의 연산이 이뤄지는데,

    기존에는 Pixel Shader에서 빛 연산을 진행함.

 

1.2 Forward Rendering의 문제점

  - 개체 X1, X2, ..., Xn이 모두 Pixel Shader에서 빛 연산을 진행함.

    어떤 개체는 이미 가려져서 빛 연산을 진행할 필요가 없는데도

    개체의 개수만큼 빛 연산을 진행하는 비효율이 발생함.     

 

2. Deferred Rendering

2.1 Deferred Rendering 구조

  - Render Target을 여러 개 만듦.

    Light를 구현하는데 필요한 개체의 Color, Position, Normal이 그려진 Render Target

    위에서 그려진 Render Target을 입력 받아서, Light를 그리는 Render Target 

  - 두 Render Target을 merge해서, 결국 개체가 많아져도 빛 연산은 한 번만 이뤄짐.

    쉽게 말해, 빛 연산 하는 시기를 연기(deferred)해서 한 번만 이뤄지게끔 함.

 

2.2 Deferred Rendering 적용

  - 엔진에서 제공된 DeferredHeader.fx 파일을 include 하고,

    Pixel Shader의 반환자료형을 DeferredOuput으로 지정하면

    자동으로 Deferred Rendering이 되게끔 구현되어 있음.

 

2.3 컨텐츠 단에서 필요한 추가 기능

  - 다만 빛을 켜고 끄는 것은 지원 되지 않기에 해당 기능을 추가 하면될듯.

    고민해보았는데, Diffuse와 Specular의 경우에 Normal과의 내적이 필수적임.

  - 그래서 빛을 켜면 정상적인 Normal값이 들어가게끔 하는데,

    빛을 끄면 Normal 벡터를 영벡터로 바꿈.

    그럼 Diffuse와 Specular의 결과는 0이지만, Ambient는 Normal과의 내적이

    필요 없기에 그대로 상수값이 적용됨. -> 이 방법이 올바른 방법인지는 모름.

 

3. 문제 상황

  - Normal Rendertarget이 그려지지 않음. 엔진 팀장님과 그래픽 디버깅 진행.

  - 내일 다시 상황 재현 해보기로 함.

 

 

'DirectX > [팀플] Death's Door 모작' 카테고리의 다른 글

Post Process Effects  (0) 2022.11.24
프로젝트 내의 셰이더 구조 고찰  (0) 2022.11.21
나름대로 큰? 규모의 소스코드에서의 shared_ptr 고찰  (0) 2022.11.11
22-11-04  (0) 2022.11.04
22-11-02  (0) 2022.11.02

댓글