Tip
以 DirectX-Graphics-Samples 的範例專案中的 D3D12HelloTexture 為基礎做修改與擴充。 其餘皆為自己撰寫 (部分有詢問 AI 來學習,但主要由我自己撰寫),並無套用任何既成之 D3D12 渲染框架。
Tip
整合 Open Asset Import Library (Assimp) 來讀取模型與貼圖。 若遇到透明貼圖,有在 Shader 中額外做 Alpha Clipping 處理。
後來才注意到本專案之模型有些破損問題,後續在 Final Project 中有修正。
- WASD: 第一人稱移動
- 滑鼠: 第一人稱轉視角
- ESC: 顯示滑鼠並暫時離開遊戲(此時視角不會轉)
- Z: 切換 Depth / Normal / Albedo / Final Color 狀態
Note
互動的部分,有解耦獨立程式碼
Camera.h及Camera.cpp用來處理攝影機相關InputManager.h用來處理輸入相關- 這些檔案目前在架構上皆為 Singleton 存在,因為目前不會有複數的情況
- 也有整合進
Win32Application.cpp中 - 最後在
D3D12HelloTexture.cpp實作HandleInput()處理輸入
主要分為兩階段
GeometryPass.hlsl用來處理模型本身- 貼圖可能是透明,有做 Alpha Clipping 處理
- G-buffer
- Depth Buffer (使用 D32_FLOAT)
- Normal Buffer (使用 R16G16B16A16_FLOAT)
- Albedo Buffer (使用 R8G8B8A8_UNORM)
Tip
在 D3D12HelloTexture.cpp 的 OnUpdate() 中
XMMATRIX modelMatrix = XMMatrixScaling(0.1f, 0.1f, 0.1f); 將模型 scale 縮小至 0.1 倍。
所以在計算 Depth (深度圖) 時,distance 有縮小才看得比較清楚。
在 LightingPass.hlsl 的 PSLighting(...) 中的 float dist = length(cameraPos - worldPos) / 100.0f;。
LightingPass.hlsl用來處理光照渲染- 使用一個全螢幕三角形 (Full-screen Triangle) 進行採樣渲染
- 從 G-buffer 中讀取資料並計算最終光照結果
- 演算法:實作 Blinn-Phong Shading
- 光源設定:
- 類型:Directional Light (平行光)
- 強度 (Intensity):
(1.0, 1.0, 1.0, 1.0) - 光照入射之反方向 (Direction to Light):
(-0.577f, -0.577f, -0.577f, 1.0f)







