问题描述
我是Direct3d编程的新手,我一直在构建一个简单的Windows应用程序,用d3d12依次显示4张图像.我了解D3D12架构的基本知识,到目前为止,我已经创建了四个命令分配器(backb缓冲区大小= 4),一个命令列表,一个命令队列,描述符堆和围栏.我还使用WIC从文件中加载了我的图像.我知道我必须以某种方式将图像纹理数据作为资源.尽管该部分仍不清楚,但我想澄清一下如何在d3d12中从加载的图像中制作纹理.
I'm new to direct3d programming and I have been building a simple windows application to display 4 images one after other with d3d12.I know a basic understanding of the D3D12 architecture and so far I've created four command allocator (backb buffer size = 4) , a command list, a command queue, descriptor heap, and a fence. I also have loaded my images from file using WIC.I know somehow I have to make image texture data as a resource. While that part is still not clear, I'd like to clarify how I can make texture out of a loaded image in d3d12.
推荐答案
在D3D12HelloTexture示例中,演示了Direct3D 12纹理上传的基础. -Graphics-Samples"rel =" nofollow> DirectX-Graphics-Samples GitHub repro.
The basics of Direct3D 12 texture upload is demonstrated in the D3D12HelloTexture
sample on the DirectX-Graphics-Samples GitHub repro.
ComPtr<ID3D12Resource> textureUploadHeap;
// Create the texture.
{
// Describe and create a Texture2D.
D3D12_RESOURCE_DESC textureDesc = {};
textureDesc.MipLevels = 1;
textureDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
textureDesc.Width = TextureWidth;
textureDesc.Height = TextureHeight;
textureDesc.Flags = D3D12_RESOURCE_FLAG_NONE;
textureDesc.DepthOrArraySize = 1;
textureDesc.SampleDesc.Count = 1;
textureDesc.SampleDesc.Quality = 0;
textureDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;
ThrowIfFailed(m_device->CreateCommittedResource(
&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT),
D3D12_HEAP_FLAG_NONE,
&textureDesc,
D3D12_RESOURCE_STATE_COPY_DEST,
nullptr,
IID_PPV_ARGS(&m_texture)));
const UINT64 uploadBufferSize = GetRequiredIntermediateSize(m_texture.Get(), 0, 1);
// Create the GPU upload buffer.
ThrowIfFailed(m_device->CreateCommittedResource(
&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD),
D3D12_HEAP_FLAG_NONE,
&CD3DX12_RESOURCE_DESC::Buffer(uploadBufferSize),
D3D12_RESOURCE_STATE_GENERIC_READ,
nullptr,
IID_PPV_ARGS(&textureUploadHeap)));
// Copy data to the intermediate upload heap and then schedule a copy
// from the upload heap to the Texture2D.
std::vector<UINT8> texture = GenerateTextureData();
D3D12_SUBRESOURCE_DATA textureData = {};
textureData.pData = &texture[0];
textureData.RowPitch = TextureWidth * TexturePixelSize;
textureData.SlicePitch = textureData.RowPitch * TextureHeight;
UpdateSubresources(m_commandList.Get(), m_texture.Get(), textureUploadHeap.Get(), 0, 0, 1, &textureData);
m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_texture.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE));
// Describe and create a SRV for the texture.
D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {};
srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
srvDesc.Format = textureDesc.Format;
srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
srvDesc.Texture2D.MipLevels = 1;
m_device->CreateShaderResourceView(m_texture.Get(), &srvDesc, m_srvHeap->GetCPUDescriptorHandleForHeapStart());
}
它使用UpdateSubresources
辅助函数 D3DX12.h C ++内联仅实用程序头文件.
It uses the UpdateSubresources
helper function the D3DX12.h C++ inline only utility header.
更新: DirectX12的DirectX工具套件现已可用.看看 DDSTextureLoader 和 WICTextureLoader .
UPDATE: DirectX Tool Kit for DirectX12 is now available. Take a look at DDSTextureLoader and WICTextureLoader.
这篇关于D3D11 CreateTexture2D的D3D12等效项是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!