본문 바로가기
DirectX 12/Rendering

[DirectX12 - Rendering] Chapter 03. Deferred Rendering

by song.ift 2023. 6. 28.

GitHub : https://github.com/developeSHG/DirectX12-Rendering/commits/03.Deferred_Rendering

 

GitHub - developeSHG/DirectX12-Rendering: DirectX12 - Rendering

DirectX12 - Rendering. Contribute to developeSHG/DirectX12-Rendering development by creating an account on GitHub.

github.com

 

결과물

 

 


 

 

저번 시간에 공부했듯
포워드 렌더링과 디퍼드 렌더링 차이 중 가장 큰 특징이자 단점은
포워드 렌더링이 모든 물체가 그 pointlight와 영향을 주는지 안주는지 모른채 모두다 연산해야된다는 단점이 있었다.

결론적으로 보면
디퍼드 렌더링은 물체를 그릴 때, 빛을 찾아서 연산을 하는 게 아니라
거꾸로 빛을 그릴 때, 빛이 물체를 찾아서 그리게 된다.
말장난 같긴 한데 엄청난 차이가 있다.


빛의 영역안에 들어온 픽셀들만 픽쉘 쉐이더가 실행된다는 점이 있다.
빛의 영역안에 들어온 픽셀들을 또 연산과정에서의 2차 필터링을 할수가 있다.
각 렌더타겟으로 나눠놨었는데, 임의의 픽셀 좌표에 대해서 체크를 했더니
position 렌더타겟에서 그 지점에 실제 체크를 했더니 "진짜 있었네" 라고 판별이 되면 
픽셀 라이팅 연산을 해주는 점이 있다.
물체가 없었다고 하면 애당초 할 필요가 없다는 것.
그래서 계속 그런 연산에 대해 필터링을 해서 거를수가 있게 되니 
모든 픽셀을 다 연산하지 않고, 최대한 불필요한 연산량을 줄일수가 있게 된다.

1차(빛의 영역 체크) -> 2차(픽셀 좌표에 대해 position에 있는지 체크)


그래서 이로써 알수있는 결론은 "빛이 물체를 찾아간다!"

 



shader.h
라이팅과 관련된 쉐이딩(연산)을 할 때는 깊이 버퍼를 어떤 물체를 스킵하면 안된다.
그래서 Depth stencil type에는 
깊이 테스트 할것인지 말건지 
and 깊이 기록을 할것인지 말것인지 정의하는 옵션이 있다.
[깊이 테스트(X) + 깊이 기록(O)]
[깊이 테스트(X) + 깊이 기록(X)]
[깊이 테스트(O) + 깊이 기록(X)]

처음에 렌더타겟을 놔눠서 디퍼드를 했을 때, 검은 물체로 보였던 것도 그런 이유다.
기존에 다른 깊이값이 이미 써져있었기 때문에, 그걸 이용해 테스트하려다보니까
어떤 물체를 누락하고 그런 문제가 생길 수 있었던 것이다.



shader.h
blend type 도 있다. [DEFAULT, ALPHA_BLEND, ONE_TO_ONE_BLEND]
픽쉘 쉐이더에서 계산한 결과물이랑 렌더타겟 텍스쳐의 결과물이랑 
어떻게 혼합할지 얘기하는 것이다.
덮어쓸것인지 or 1:1비율로 섞을것인지 or 알파블렌딩을 해서 투명도를 이용할것인지
결과물을 섞어주는 옵션이다.

댓글