# 02. Nghiên cứu Đồ họa DirectX 12 & Pipeline Shader (DirectX 12 & Shaders Research)

> **Renderer Đang chạy**: DirectX 12 (`D3D12/`)  
> **Độ phân giải Màn hình**: 2560 x 1440 (1440p Quad-HD)  
> **Chế độ Hiển thị**: Không viền (Borderless Windowed: `fullscreen=false`)

---

## 1. Khảo sát Cấu hình Đồ họa từ `poe2_production_Config.ini`

Tệp cấu hình thực tế tại `C:\Users\Admin\OneDrive\Documents\My Games\Path of Exile 2\poe2_production_Config.ini` chứa các tham số quan trọng tác động trực tiếp tới cách tool can thiệp thị giác:

```ini
[DISPLAY]
resolution_width=2560
resolution_height=1440
renderer_type=DirectX12
fullscreen=false
screenspace_effects=2
screenspace_effects_resolution=0
light_quality=2
upscale_quality_xess=Performance
upscale_resolution=UltraQuality
use_dynamic_resolution=true
dynamic_resolution_fps=60
water_detail=1
screen_shake_v2=true
camera_zrotation=true
triple_buffering=true
```

### Phân tích Ý nghĩa Kỹ thuật:
1. **Chế độ `fullscreen=false` (Borderless Windowed)**:
   - Đây là thiết lập lý tưởng nhất cho việc triển khai lớp phủ (Overlay). Trong chế độ Borderless, cửa sổ game không khóa độc quyền thiết bị hiển thị (Exclusive Mode), cho phép lớp phủ tàng hình (Transparent Layered Window với cờ `WDA_EXCLUDEFROMCAPTURE`) hiển thị mượt mà với tần số quét 144Hz/240Hz mà không gây giật lag hay mất focus.
2. **Công nghệ Siêu lấy mẫu Intel XeSS (`upscale_quality_xess=Performance`) & Dynamic Resolution**:
   - POE2 sử dụng thư viện `libxess.dll` (kích thước ~77.8 MB) để nâng cao hiệu năng đồ họa. Khi game bật Dynamic Resolution (nhắm tới 60 FPS), kích thước bộ đệm nội tại (Internal Render Target) có thể co giãn tự động theo tải của GPU.
   - **Lưu ý cho việc tính toán tọa độ nhấp chuột**: Tọa độ màn hình hiển thị (Viewport Coordinates) luôn cố định ở kích thước chuẩn `2560 x 1440`, do đó các phép chiếu từ tọa độ thế giới 3D (`WorldToScreen`) phải ánh xạ theo kích thước khung nhìn 2560x1440 chứ không theo kích thước nội bộ bị giảm tỉ lệ của bộ đệm GPU.
3. **`camera_zrotation=true`**:
   - POE2 hỗ trợ xoay trục Z nhẹ của camera theo từng địa hình hoặc chuyển động nhân vật, ma trận View Frustum liên tục cập nhật góc nghiêng Roll/Yaw.

---

## 2. Hệ thống Biên dịch & Lưu đệm Shader (DirectX 12 Shader Pipeline)

Trong thư mục game xuất hiện các thư viện biên dịch Shader thế hệ mới của Microsoft:
- `dxcompiler.dll` (17.9 MB): DirectX Shader Compiler (DXC) chính thức hỗ trợ Shader Model 6.x (SM 6.0 – 6.8).
- `dxil.dll` (1.4 MB): Bộ xác thực mã trung gian DirectX Intermediate Language.
- `d3dcompiler_47_ggg.dll` (4.5 MB): Bản tùy biến riêng của Grinding Gear Games cho trình biên dịch D3DCompiler cổ điển (HLSL SM 5.0).
- `CachedHLSLShaders/`: Thư mục lưu đệm các shader đã được biên dịch sẵn (Compiled Shader Bytecode - DXIL / DXBC) tương ứng với phần cứng GPU của máy.

### Cơ chế Can thiệp Vô hiệu hóa Volumetric Fog:
1. **Phương pháp Không sửa Shader (Non-Intrusive)**:
   - Thay vì chỉnh sửa các file mã máy shader trong `CachedHLSLShaders/` (dễ bị hàm băm CRC32 phát hiện), hệ thống can thiệp trực tiếp vào **Constant Buffer (CBV)** được nạp vào GPU mỗi lần gọi lệnh `ExecuteCommandLists`.
   - Bằng cách ghi đè thông số `FogDensity = 0.0f` trong RAM trước khi bộ nhớ đệm này được sao chép vào GPU VRAM, sương mù biến mất hoàn toàn mà các shader bytecode vẫn giữ nguyên mã băm hợp lệ 100%.

---

## 3. Kiến trúc Móc câu DirectX 12 (DirectX 12 Hooking Architecture)

Đối với các tính năng vẽ lớp phủ trực tiếp vào game (In-Game ImGui Rendering):

```mermaid
sequenceDiagram
    participant Game as POE2 Render Thread
    participant CmdQueue as ID3D12CommandQueue
    participant Hook as Detour Hook (Present / ExecuteCommandLists)
    participant Overlay as ImGui Overlay DrawList
    participant SwapChain as IDXGISwapChain3

    Game->>Hook: Gọi IDXGISwapChain::Present(1, 0)
    Hook->>Overlay: Dựng giao diện ESP, Vùng đỏ Boss, Radar
    Overlay->>CmdQueue: Đẩy CommandList của ImGui vào hàng đợi GPU
    Hook->>SwapChain: Gọi Present gốc hiển thị lên màn hình
```

### Các Chỉ số VTable Cốt lõi của DirectX 12:
- `IDXGISwapChain::Present`: Chỉ số VTable thứ **140** (trong `IDXGISwapChain3` / `IDXGISwapChain4`).
- `ID3D12CommandQueue::ExecuteCommandLists`: Chỉ số VTable thứ **54**.
- `IDXGISwapChain::ResizeBuffers`: Chỉ số VTable thứ **145** (Cần thiết để giải phóng Render Target Views khi người chơi thay đổi độ phân giải màn hình).
