Я новичок в программировании Direct3D, и я создаю простое приложение для Windows, чтобы отображать 4 изображения одно за другим с помощью d3d12. Я имею базовое представление об архитектуре D3D12 и на данный момент создал четыре распределителя команд (размер буфера обратной связи = 4), список команд, очередь команд, кучу дескрипторов и ограждение. Я также загрузил свои изображения из файла с помощью WIC. Я каким-то образом знаю, что мне нужно сделать данные текстуры изображения в качестве ресурса. Хотя эта часть еще не ясна, я хотел бы уточнить, как я могу сделать текстуру из загруженного изображения в d3d12.
Что такое D3D12, эквивалентный D3D11 CreateTexture2D?
Ответы (1)
Основы загрузки текстур 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, и даже не самый эффективный.
ОБНОВЛЕНИЕ: теперь доступен набор инструментов DirectX для DirectX12. Взгляните на DDSTextureLoader и WICTextureLoader.