From 38e23e45c4a8a7cb54b06be5230f401d2813c090 Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Sun, 15 Mar 2026 19:54:00 +0800 Subject: [PATCH] Replace depth buffer creation with D3D12Texture wrapper --- .../include/XCEngine/RHI/D3D12/D3D12Texture.h | 1 + engine/src/RHI/D3D12Texture.cpp | 34 +++++++++++++++++++ tests/D3D12/main.cpp | 32 ++--------------- 3 files changed, 38 insertions(+), 29 deletions(-) diff --git a/engine/include/XCEngine/RHI/D3D12/D3D12Texture.h b/engine/include/XCEngine/RHI/D3D12/D3D12Texture.h index c5d77a68..e2de0912 100644 --- a/engine/include/XCEngine/RHI/D3D12/D3D12Texture.h +++ b/engine/include/XCEngine/RHI/D3D12/D3D12Texture.h @@ -19,6 +19,7 @@ public: bool InitializeFromExisting(ID3D12Resource* resource); bool InitializeFromData(ID3D12Device* device, ID3D12GraphicsCommandList* commandList, const void* pixelData, uint32_t width, uint32_t height, DXGI_FORMAT format); + bool InitializeDepthStencil(ID3D12Device* device, uint32_t width, uint32_t height, DXGI_FORMAT format = DXGI_FORMAT_D24_UNORM_S8_UINT); void Shutdown(); ID3D12Resource* GetResource() const { return m_resource.Get(); } diff --git a/engine/src/RHI/D3D12Texture.cpp b/engine/src/RHI/D3D12Texture.cpp index 7409a21b..a94426b1 100644 --- a/engine/src/RHI/D3D12Texture.cpp +++ b/engine/src/RHI/D3D12Texture.cpp @@ -143,6 +143,40 @@ bool D3D12Texture::InitializeFromData(ID3D12Device* device, ID3D12GraphicsComman return true; } +bool D3D12Texture::InitializeDepthStencil(ID3D12Device* device, uint32_t width, uint32_t height, DXGI_FORMAT format) { + D3D12_RESOURCE_DESC desc = {}; + desc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D; + desc.Alignment = 0; + desc.Width = width; + desc.Height = height; + desc.DepthOrArraySize = 1; + desc.MipLevels = 1; + desc.Format = format; + desc.SampleDesc.Count = 1; + desc.SampleDesc.Quality = 0; + desc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN; + desc.Flags = D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL; + + D3D12_HEAP_PROPERTIES heapProperties = {}; + heapProperties.Type = D3D12_HEAP_TYPE_DEFAULT; + + D3D12_CLEAR_VALUE clearValue = {}; + clearValue.Format = format; + clearValue.DepthStencil.Depth = 1.0f; + clearValue.DepthStencil.Stencil = 0; + + HRESULT hResult = device->CreateCommittedResource( + &heapProperties, + D3D12_HEAP_FLAG_NONE, + &desc, + D3D12_RESOURCE_STATE_DEPTH_WRITE, + &clearValue, + IID_PPV_ARGS(&m_resource) + ); + + return SUCCEEDED(hResult); +} + void D3D12Texture::Shutdown() { m_resource.Reset(); } diff --git a/tests/D3D12/main.cpp b/tests/D3D12/main.cpp index 085c0399..9676c6ab 100644 --- a/tests/D3D12/main.cpp +++ b/tests/D3D12/main.cpp @@ -59,7 +59,6 @@ XCEngine::RHI::D3D12CommandQueue gCommandQueue; XCEngine::RHI::D3D12SwapChain gSwapChain; // 渲染目标 (SwapChain的后台Buffer) -ID3D12Resource* gDSRT = nullptr; // 深度模板缓冲 ID3D12Resource* gColorRTs[2]; // 颜色缓冲 (双缓冲) int gCurrentRTIndex = 0; @@ -84,6 +83,7 @@ XCEngine::RHI::D3D12Shader gPixelShader; XCEngine::RHI::D3D12Buffer gConstantBuffer; // matrices XCEngine::RHI::D3D12Buffer gMaterialBuffer; // material data XCEngine::RHI::D3D12Texture gTexture; // earth texture +XCEngine::RHI::D3D12Texture gDepthStencil; // depth stencil buffer XCEngine::RHI::D3D12ShaderResourceView gTextureSRV; // texture SRV // 同步对象 @@ -486,34 +486,8 @@ bool InitD3D12(HWND inHWND, int inWidth, int inHeight) { dxgiFactory->CreateSwapChain(gCommandQueue.GetCommandQueue(), &swapChainDesc, &swapChain); gSwapChain.Initialize(swapChain, inWidth, inHeight); - D3D12_HEAP_PROPERTIES d3dHeapProperties = {}; - d3dHeapProperties.Type = D3D12_HEAP_TYPE_DEFAULT; - - D3D12_RESOURCE_DESC d3d12ResourceDesc = {}; - d3d12ResourceDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D; - d3d12ResourceDesc.Alignment = 0; - d3d12ResourceDesc.Width = inWidth; - d3d12ResourceDesc.Height = inHeight; - d3d12ResourceDesc.DepthOrArraySize = 1; - d3d12ResourceDesc.MipLevels = 1; - d3d12ResourceDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; - d3d12ResourceDesc.SampleDesc.Count = 1; - d3d12ResourceDesc.SampleDesc.Quality = 0; - d3d12ResourceDesc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN; - d3d12ResourceDesc.Flags = D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL; - - D3D12_CLEAR_VALUE dsClearValue = {}; - dsClearValue.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; - dsClearValue.DepthStencil.Depth = 1.0f; - dsClearValue.DepthStencil.Stencil = 0; - - device->CreateCommittedResource(&d3dHeapProperties, - D3D12_HEAP_FLAG_NONE, - &d3d12ResourceDesc, - D3D12_RESOURCE_STATE_DEPTH_WRITE, - &dsClearValue, - IID_PPV_ARGS(&gDSRT) - ); + gDepthStencil.InitializeDepthStencil(device, inWidth, inHeight); + ID3D12Resource* gDSRT = gDepthStencil.GetResource(); D3D12_DESCRIPTOR_HEAP_DESC d3dDescriptorHeapDescRTV = {}; d3dDescriptorHeapDescRTV.NumDescriptors = 2;