# D3D12Texture DirectX 12 纹理的 D3D12 实现,封装了 `ID3D12Resource` (texture 类型)。 ## 头文件 ```cpp #include ``` ## 继承关系 ``` RHITexture (interface) └── D3D12Texture (implementation) ``` ## 公共成员函数 ### 构造函数与析构函数 #### `D3D12Texture()` 默认构造函数。 #### `~D3D12Texture() override` 析构函数,确保调用 `Shutdown()`。 ### 初始化 #### `bool Initialize(ID3D12Device* device, const D3D12_RESOURCE_DESC& desc, D3D12_RESOURCE_STATES initialState = D3D12_RESOURCE_STATE_COMMON)` 使用资源描述创建纹理。 - `device`: D3D12 设备 - `desc`: D3D12 资源描述 - `initialState`: 初始资源状态 - 返回: 初始化是否成功 #### `bool InitializeFromExisting(ID3D12Resource* resource)` 从现有 `ID3D12Resource` 初始化。 #### `bool InitializeFromData(ID3D12Device* device, ID3D12GraphicsCommandList* commandList, const void* pixelData, uint32_t width, uint32_t height, DXGI_FORMAT format)` 创建纹理并从像素数据初始化。 - `device`: D3D12 设备 - `commandList`: 命令列表 - `pixelData`: 像素数据指针 - `width` / `height`: 纹理尺寸 - `format`: 像素格式 - 返回: 初始化是否成功 #### `bool InitializeDepthStencil(ID3D12Device* device, uint32_t width, uint32_t height, DXGI_FORMAT format = DXGI_FORMAT_D24_UNORM_S8_UINT)` 创建深度模板纹理。 - `device`: D3D12 设备 - `width` / `height`: 纹理尺寸 - `format`: 深度格式 (D16, D24S8, D32F) - 返回: 初始化是否成功 #### `void Shutdown() override` 释放纹理资源。 ### 资源信息 #### `ID3D12Resource* GetResource() const` 获取底层 `ID3D12Resource` 指针。 #### `D3D12_RESOURCE_DESC GetDesc() const` 获取资源描述。 #### `uint32_t GetWidth() const override` 获取纹理宽度。 #### `uint32_t GetHeight() const override` 获取纹理高度。 #### `uint32_t GetDepth() const override` 获取纹理深度(3D 纹理)或数组大小。 #### `uint32_t GetMipLevels() const override` 获取 Mipmap 级别数量。 #### `uint32_t GetArraySize() const` 获取数组大小。 #### `uint64_t GetGPUAddress() const` 获取 GPU 虚拟地址。 #### `size_t GetSize() const` 获取纹理大小(字节估算)。 ### 状态管理 #### `void* GetNativeHandle() override { return m_resource.Get(); }` 返回原生句柄。 #### `ResourceStates GetState() const override` 获取当前资源状态。 #### `void SetState(ResourceStates state) override` 设置资源状态。 ### 接口实现 #### `Format GetFormat() const override` 获取纹理格式。 #### `TextureType GetTextureType() const override` 获取纹理类型(当前固定返回 `TextureType::Texture2D`)。 #### `const std::string& GetName() const override` 获取对象名称。 #### `void SetName(const std::string& name) override` 设置对象名称。 ## 内部成员 | 成员 | 类型 | 描述 | |------|------|------| | `m_resource` | `ComPtr` | D3D12 纹理资源 | | `m_state` | `ResourceStates` | 当前资源状态 | | `m_name` | `std::string` | 对象名称 | ## 使用示例 ### 创建 2D 纹理 ```cpp D3D12Texture texture; D3D12_RESOURCE_DESC texDesc = {}; texDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D; texDesc.Width = 1024; texDesc.Height = 1024; texDesc.MipLevels = 1; texDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; texDesc.SampleDesc.Count = 1; texDesc.Flags = D3D12_RESOURCE_FLAG_NONE; texture.Initialize(device->GetDevice(), texDesc); ``` ### 创建深度模板纹理 ```cpp D3D12Texture depthTexture; depthTexture.InitializeDepthStencil( device->GetDevice(), 1920, 1080, DXGI_FORMAT_D24_UNORM_S8_UINT); ``` ### 创建并初始化纹理数据 ```cpp D3D12Texture texture; std::vector pixels(width * height * 4); FillPixelData(pixels.data(), width, height); texture.InitializeFromData( device->GetDevice(), cmdList->GetCommandList(), pixels.data(), width, height, DXGI_FORMAT_R8G8B8A8_UNORM); ``` ## 备注 - 纹理通常创建在 `D3D12_HEAP_TYPE_DEFAULT` 堆上 - 需要上传数据时,先创建 UPLOAD 堆缓冲区,再通过命令列表复制 - 深度纹理需要设置 `D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL` - 渲染目标纹理需要设置 `D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET`