Squall的D3D12 Demo

自主製作的D3D12 Rendering Demo.
並非最佳但是我嘗試去發揮D3D12優點的架構.
我借用了Unity Asset系統,拿到了各資源的ID3D12Resource介面,然後在DLL裡面自製我流的Renderer.
過程中也簡單自製了材質的管理(PSO)以及Shader的一些Parser.

跑Demo需求

  1. Unity Editor 2018.4.17f1+或直接跑執行檔 (建議安裝才能看到我的設定及內容)
  2. 需要Win10支援D3D12, 版本1909 + SDK2004安裝 (也可以嘗試別的win10版本+SDK 2004安裝,我只是列出我的開發環境)
  3. 需要開啟Win10開發者模式,因為D3D12 GPU profiling需要,方法見:
    https://docs.microsoft.com/en-us/windows/apps/get-started/enable-your-device-for-development
  4. NVIDIA RTX系列顯卡
    是的,我有製作一些光線追蹤技術,而且沒考慮GTX系列的fallback (沒意義,GTX系列效能不可能即時),也可以嘗試AMD RX系列顯卡,但我沒試過,我錢沒多到可以再買一張:(

上述條件有一條沒達成,可能就會導致Demo跑不起來~另外我的測試平台是R5 5600X + RTX 2070

功能

多核心Forward+ Rendering

這張圖片的 alt 屬性值為空,它的檔案名稱為 68747470733a2f2f692e696d6775722e636f6d2f7946484a656a452e6a7067.jpg
Fig 1. 多執行緒 Rendering
這張圖片的 alt 屬性值為空,它的檔案名稱為 noname-3.jpg
Fig 2. 可以設定想要的核心數量.

D3D12最重要的精神,微軟一直在告訴我們要把Rendering工作分配給各個執行緒
如圖1所示,我的AMD R5 3600X有12核心,我設定了12核心去Render
圖1總Draw Call 377,表示一個Thread平均負責31個Draw Call
我的系統可以指定想要的執行緒數量,最大可到16或你電腦的最大邏輯核心數目,這個設定只有在初始化有用

這張圖片的 alt 屬性值為空,它的檔案名稱為 68747470733a2f2f692e696d6775722e636f6d2f65576b556179472e706e67.png
Fig3. My rendering pipeline


我的渲染流程,打星號代表有用threads分散我的工作

Instance Based Rendering

本來場景可以到兩千多個Draw Call
集中同Mesh同材質後做instance rendering將總Draw Call降至400以下

SM5.1 Style 貼圖管理

D3D12 介紹了 Descriptor Heap的概念. (https://docs.microsoft.com/en-us/windows/win32/direct3d12/descriptor-heaps)
我集中所有ShaderResourceView到一個足夠大的Heap
我取樣貼圖的方式會像這樣:

// need /enable_unbounded_descriptor_tables when compiling
Texture2D _SqTexTable[] : register(t0);
SamplerState _SqSamplerTable[] : register(s0);
#define SQ_SAMPLE_TEXTURE(x,y,z) _SqTexTable[x].Sample(_SqSamplerTable[y], z)
float4 color = SQ_SAMPLE_TEXTURE(_DiffuseTexIndex, _LinearSamplerIndex);

Shader model 5.1 提供了Dynamic Index to Texture2D的功能,我不用再綁貼圖到shader裡~而是綁一個很大的Texture2D Heap然後對它indexing就好,這方式給了很大的彈性

Tiled-Based Light Culling

所以Forward渲染成了Forward+渲染!
主要是使用在Point Light的情況下,我目前尚未製作SpotLight,因為古代場景有SpotLight實在不搭,實作細節:
https://thegraphicguysquall.wordpress.com/2020/09/17/forward-light-culling/

即時光追陰影 + PCSS

Directional / point light 光追陰影+PCSS.

Opaque/Transparent都能接收陰影,但為了效能Transparent只有最上層的接收.

Test video:
https://www.youtube.com/watch?v=y1H-_5fZ0wI

Implement Detail:
https://thegraphicguysquall.wordpress.com/2020/08/14/squalls-graphic-dxr-ray-tracing-shadow/
https://thegraphicguysquall.wordpress.com/2020/08/24/ray-tracing-shadow-semi-pcss/
https://thegraphicguysquall.wordpress.com/2020/09/02/point-light-ray-tracing-shadow/

即時光線追蹤反射
即時光線追蹤反射,有套用FXAA上去.
遞迴反射也是支援的,最大次數限制為3,並且可以逐材質給予不一樣的遞迴次數.
Opaque/Transparent都能接收反射,但為了效能Transparent只有最上層接收.
另外也用了smoothness檢查來減少光線的數量省效能.

Test Video:
https://www.youtube.com/watch?v=1tcz-XE0tuI

Implement Detail:
https://thegraphicguysquall.wordpress.com/2020/10/13/squalls-graphic-custom-ray-tracing-reflection/

即時光線追蹤漫射光
即時光線追蹤漫射光/漫射遮蔽
只有套用在Opaque物件

Test Video:
https://www.youtube.com/watch?v=8G5hXHF3DGg

Implement Detail:
https://thegraphicguysquall.wordpress.com/2020/11/05/squalls-graphic-custom-dxr-ray-tracing-ambient/

Final Words

這只是D3D12的一部分,其他像是還有mesh shader/VRS等等我還沒玩過,但我遲早會玩!學習新東西總是有趣的:D

Unity 專案Link: https://drive.google.com/file/d/1z6e8OazLlCByPLYQ75lICwP1vW71kVqw/view?usp=sharing
Squall Graphics 是 Unity專案.
D3D Plugin Source 是底層DLL實作專案.

可執行檔 Link: https://drive.google.com/file/d/1tYJHLdzFgJvlKga8vBlYaq0OhZZx4xO7/view?usp=sharing

GitHub連結

https://github.com/SquallLiu99/Squall-D3D12-Demo

發表留言

使用 WordPress.com 設計專業網站
立即開始使用