纹理在任何引擎都有使用,它其实就是为模型提供的纹理材质,既然我们介绍的是D3D12,那就从dds文件介绍说起。
加载DDS文件
Microsoft提供了轻量级源代码来加载DDS文件:
https://github.com/Microsoft/DirectXTK/wiki/DDSTextureLoader
但是,代码仅支持DirectX 11,我们修改了DDSTextureLoader.h / .cpp文件并为DirectX 12提供了另一种方法(这些修改过的文件可以在Common文件夹中找到或者 可下载的来源):
HRESULT DirectX::CreateDDSTextureFromFile12(
_In_ ID3D12Device* device,
_In_ ID3D12GraphicsCommandList* cmdList,
_In_z_ const wchar_t* szFileName,
_Out_ Microsoft::WRL::ComPtr<ID3D12Resource>& texture,
_Out_ Microsoft::WRL::ComPtr<ID3D12Resource>& textureUploadHeap);
要从名为WoodCreate01.dds的图像创建纹理,我们将编写以下内容:
struct Texture
{
// Unique material name for lookup.
std::string Name;
std::wstring Filename;
Microsoft::WRL::ComPtr<ID3D12Resource> Resource = nullptr;
Microsoft::WRL::ComPtr<ID3D12Resource> UploadHeap = nullptr;
};
auto woodCrateTex = std::make_unique<Texture>();
woodCrateTex->Name = "woodCrateTex";
woodCrateTex->Filename = L"Textures/WoodCrate01.dds";
ThrowIfFailed(DirectX::CreateDDSTextureFromFile12(
md3dDevice.Get(), mCommandList.Get(),
woodCrateTex->Filename.c_str(),
woodCrateTex->Resource, woodCrateTex->UploadHeap));
SRV 堆
一旦创建了纹理资源,我们需要为它创建一个SRV描述符,我们可以将其设