# D3D12ResourceView **命名空间**: `XCEngine::RHI` **类型**: `class` **头文件**: `XCEngine/RHI/D3D12/D3D12ResourceView.h` **描述**: D3D12 后端统一的资源视图对象,既封装基于 descriptor heap 的 RTV/DSV/SRV/UAV/CBV,也承载顶点缓冲和索引缓冲视图所需的地址与步长信息。 ## 概述 在 D3D12 里,“view”并不是一种单一机制: - `RTV` / `DSV` / `SRV` / `UAV` / `CBV` 依赖 descriptor heap 和 descriptor handle。 - `VBV` / `IBV` 则更像一段结构化的地址信息,不需要真实 descriptor。 `D3D12ResourceView` 把这些差异统一封装到了同一个 RHI 对象里。上层只需要拿到一个 `RHIResourceView`,具体是 descriptor handle 还是 buffer address,由 D3D12 后端自己决定。 这和商业引擎里常见的“view handle”思路一致: 渲染层谈的是“资源如何被用”,后端才决定到底是 heap slot、CPU/GPU descriptor handle,还是 GPU virtual address。 ## 生命周期 1. 通常由 [`D3D12Device`](../D3D12Device/D3D12Device.md) 的 `Create*View()` 工厂函数创建。 2. descriptor-backed view 会在初始化时写入某个 `D3D12DescriptorHeap` 槽位。 3. 顶点 / 索引缓冲视图只缓存 GPU 地址、偏移、大小和 stride。 4. [`Shutdown`](Shutdown.md) 只清空 view 自身状态;底层 `ID3D12Resource` 仍由纹理或缓冲对象拥有。 ## 当前实现的真实行为 ### 所有权 - `m_resource` 只是裸指针,不会 `AddRef`。 - 如果通过 [`SetOwnedHeap`](SetOwnedHeap.md) 接管了 heap,view 会在 `Shutdown()` 时释放它。 - 如果只是借用了外部 heap,则调用方必须保证 heap 生命周期覆盖 view 的使用期。 ### descriptor-backed view - `InitializeAsRenderTarget()` / `DepthStencil()` / `ShaderResource()` / `UnorderedAccess()` / `ConstantBuffer()` 都会计算 `CPU descriptor handle` 并调用 `ID3D12Device::Create*View()`。 - 这类 view 的 `GetNativeHandle()` 返回的是 `CPU descriptor handle.ptr`。 - `GetGPUHandle()` 只有在绑定了 heap 时才有意义。 ### buffer view - `InitializeAsVertexBuffer()` / `InitializeAsIndexBuffer()` 不会创建 D3D12 descriptor。 - 它们只缓存 `GPU virtual address + offset`、`size`、`stride` 和格式。 - `GetNativeHandle()` 对这两类 view 返回底层 `ID3D12Resource*`,而不是 descriptor handle。 ## 当前限制 - buffer view 初始化时不做越界检查,`bufferLocation` 需要调用方自己保证合法。 - [`CreateShaderResourceDesc`](CreateShaderResourceDesc.md) 这个 helper 只完整填写了 `Texture2D` 分支。 - `GetBuffer*()` 系列字段主要只对顶点 / 索引缓冲视图有意义。 ## 重点方法 - [InitializeAsRenderTarget](InitializeAsRenderTarget.md) - [InitializeAsShaderResource](InitializeAsShaderResource.md) - [InitializeAsVertexBuffer](InitializeAsVertexBuffer.md) - [InitializeAsIndexBuffer](InitializeAsIndexBuffer.md) - [SetOwnedHeap](SetOwnedHeap.md) - [GetCPUHandle](GetCPUHandle.md) - [GetGPUHandle](GetGPUHandle.md) ## 相关文档 - [D3D12](../D3D12.md) - [D3D12DescriptorHeap](../D3D12DescriptorHeap/D3D12DescriptorHeap.md) - [D3D12Buffer](../D3D12Buffer/D3D12Buffer.md) - [D3D12Texture](../D3D12Texture/D3D12Texture.md)