Я новичок в программировании direct3d, и я создал простое приложение для Windows, чтобы отображать 4 изображения один за другим с помощью d3d12. Я знаю базовое понимание архитектуры D3D12, и до сих пор я создал четыре распределителя команд (размер буферного буфера = 4), список команд, очередь команд, кучу дескрипторов и забор. Я также загрузил мои изображения из файла с помощью WIC. Я знаю, как-то я должен сделать данные текстуры изображения как ресурс. Хотя эта часть еще не ясна, я хотел бы пояснить, как я могу сделать текстуру из загруженного изображения в d3d12.Что такое D3D12 эквивалент D3D11 CreateTexture2D?
ответ
Основы загрузки текстур Direct3D 12 демонстрируются в образце D3D12HelloTexture
на изображении DirectX-Graphics-Samples GitHub.
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++ рядный только заголовок утилиты.
В качестве примера осложнений использования Direct3D 12 вместо Direct3D 11 этот код работает только правильно, если вы загружаете текстуру для пиксельного шейдера. Если вы используете текстуру для вершинного шейдера или геометрического шейдера, это может привести к сбою. Или это может сработать. Или это может работать иногда, а не другие. Это также единственный способ загрузить текстуры в Direct3D 12 и даже не особенно эффективен.
UPDATE:DirectX Tool Kit for DirectX12 теперь доступен. Взгляните на DDSTextureLoader и WICTextureLoader.
Если я не ошибаюсь, я искал GenerateTextureData() и обнаружил, что функция не создает данные текстуры из растрового изображения. Код мне очень полезен в понимании того, как данные текстуры могут использоваться в качестве ресурса. Но в то же время мне интересно, как я могу создать текстуру из загруженного растрового изображения? – ngub05
Вы можете посмотреть [WICTextureLoader] (https://github.com/Microsoft/DirectXTex/blob/master/WICTextureLoader/WICTextureLoader.cpp) для кода при загрузке растровых данных с использованием WIC. –
Если вы новичок в Direct3D, тогда придерживайтесь Direct3D 11. См. [Эту тему] (http://stackoverflow.com/questions/29719853/directx-c-3d-engine-programming-learn-now-or- ждать-за-DirectX-12/29779660 # 29779660). –
Я собираюсь создать продукт, где требуется d3d12, поэтому я придерживаюсь его. – ngub05
Direct3D 12 - это неумолимый API, предназначенный для специалистов. Если вы уже являетесь экспертом в Direct3D 11, то вы готовы к работе. Если нет, придерживайтесь Direct3D 11. –