Engine Dev – Deferred Shading적용

D3D12엔진을 Forward Shading에서 Deferred Shading체계로 바꿨다.
아니 정확히는 Lighting은 Forward로 두고, 그림자 처리는 Deferred로 바꿨다.

부분적이지만 Deferred Shading으로 바꾼 이유는 대량의 Voxel을 출력할때 self-shadow를 적용하면 forward에선 와장창 느려지기 때문이다.
사실상 상당히 많은 voxel들이 가려져서 보이지 않음에도 불구하고 보이지 않는 voxel들까지도 depth-test를 하고 있는게 꽤 심각한 성능저하를 가져왔다. 이 부분은 Deferred Shading으로 바꾸고 확실한 속도향상을 기대하고 있다. 아직 Project D Online쪽에만 적용하고 Voxel Horizone프로젝트에는 바뀐 엔진 코드를 완전히 적용하지 못해서 성능 테스트에를 하려면 더 시간이 필요하다.

여러 자료에선 Deferred Shading을 사용하는 이유로 Lighting에서의 성능향상을 꼽는다. 내 경우는 Lighting 때문에 Deferred Shading을 적용한 것은 아니다.
내 프로젝트에선 복잡한 Lighting을 사용하지 않고, 또 Light 개수도 많지 않다. 또한 Light에 대한 culling은 엔진의 윗단에서 충분히 해주고있다. 그리고 Deferred Shading을 쓴다고 Lighting이 무조건 빨라지는것 같진 않다. Compute Shader를 쓰지 않고선 라이트 많아질때 Deferred 방식이 무조건 빠를 이유는 없어보인다.

구현에 있어 생각보다 많은 코드를 고치긴 했는데 손댄김에 구조를 뒤엎었다고 보는 것이 맞고 Deferred Shading구현 때문에 코드를 왕창 고친 것은 아니다.
Outline 이쁘게 처리하려고 depth값을 비롯한 이런저런 값이 필요해서 예전에도 GBuffer 비슷한건 만들어두고 있었기 때문에 구현에서 아주 크게 달라진것은 아니다.
손댄지는 꽤 됐는데 Voxel Horizon과 Project D Online 모두 D3D 12 + Deferred 로 적용해가며 테스트하고 있기 때문에 제대로 돌아가게 하느라 시간이 꽤 걸렸다.

거의 마무리 됐는데 Voxel출력에서의 그림자 성능 테스트후 D3D11엔진에도 적용할 예정이다.

스샷은 별거 없고 그냥 짤방으로…

def_shading


답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

w

%s에 연결하는 중