Skip to content

Instantly share code, notes, and snippets.

@shaderjp
Created October 3, 2017 14:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shaderjp/c7a76830ca61d40722e8039d3a7d325d to your computer and use it in GitHub Desktop.
Save shaderjp/c7a76830ca61d40722e8039d3a7d325d to your computer and use it in GitHub Desktop.
Create the texture from OpenEXR
// Create the texture from OpenEXR
{
DirectX::TexMetadata metaData;
DirectX::ScratchImage scratchImage;
ThrowIfFailed(LoadFromEXRFile(L"exrtest.exr", &metaData, scratchImage));
const size_t subresoucesize = metaData.mipLevels;
const size_t uploadBufferSize = scratchImage.GetPixelsSize();
D3D12_RESOURCE_DESC textureDesc = {};
textureDesc.Width = metaData.width;
textureDesc.Height = static_cast<UINT>(metaData.height);
textureDesc.MipLevels = static_cast<UINT16>(subresoucesize);
textureDesc.Format = metaData.format;
textureDesc.DepthOrArraySize = static_cast<UINT16>( metaData.arraySize );
textureDesc.SampleDesc.Quality = 0;
textureDesc.SampleDesc.Count = 1;
textureDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;
textureDesc.Flags = D3D12_RESOURCE_FLAG_NONE;
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)));
// 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)));
std::vector<D3D12_SUBRESOURCE_DATA> subresouceData;
for (size_t i = 0; i < subresoucesize; i++)
{
D3D12_SUBRESOURCE_DATA subresouce;
subresouce.pData = scratchImage.GetImages()[i].pixels;
subresouce.RowPitch = scratchImage.GetImages()[i].rowPitch;
subresouce.SlicePitch = scratchImage.GetImages()[i].slicePitch;
subresouceData.push_back(subresouce);
}
UpdateSubresources(m_commandList.Get(), m_texture.Get(), textureUploadHeap.Get(), 0, 0, static_cast<UINT>(subresoucesize), &subresouceData[0]);
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 = static_cast<UINT>(subresoucesize);
m_device->CreateShaderResourceView(m_texture.Get(), &srvDesc, m_srvHeap->GetCPUDescriptorHandleForHeapStart());
m_commandList->DiscardResource(textureUploadHeap.Get(), nullptr);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment