mirror of
https://github.com/Vita3K/Vita3K.git
synced 2025-04-02 11:02:10 -04:00
63 lines
2.3 KiB
Markdown
63 lines
2.3 KiB
Markdown
# DDS++
|
|
|
|
DDS image readers are typically not multiplatform and pull in many extra headers (e.g. the fantastic [gli](https://github.com/g-truc/gli) or [Microsoft DirectXTex](https://github.com/Microsoft/DirectXTex)) This single no-dependency header can decode and encode the DDS headers and compute the mipmap and slice offset of a given DDS texture. It is meant as an aid to provide this information directly to graphics APIs to upload data to the GPU.
|
|
|
|
## Usage
|
|
|
|
The code below is not meant to be an exhaustive example on how to create textures from a DDS file, merely a guideline of how you would go about using this in your own engine/API.
|
|
|
|
```cpp
|
|
#include "ddspp.h"
|
|
|
|
// Load image as a stream of bytes
|
|
const char* ddsData = ...
|
|
|
|
// Decode header and get pointer to initial data
|
|
ddspp::Descriptor desc;
|
|
ddspp::Result decodeResult = ddspp::decode_header(ddsData, desc);
|
|
|
|
// Feed to the graphics API
|
|
if(decodeResult == ddspp::Success)
|
|
{
|
|
const char* initialData = ddsData + desc.headerSize;
|
|
|
|
// D3D example
|
|
{
|
|
D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {};
|
|
srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
|
|
srvDesc.Format = desc.format; // Maps directly to D3D
|
|
if(desc.type == ddspp::Texture2D)
|
|
{
|
|
if(desc.arraySize > 1)
|
|
{
|
|
srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2DARRAY;
|
|
srvDesc.Texture2DArray.MipLevels = desc.numMips;
|
|
srvDesc.Texture2DArray.ArraySize = desc.arraySize;
|
|
}
|
|
else
|
|
{
|
|
srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
|
|
srvDesc.Texture2D.MipLevels = desc.mipMapCount;
|
|
}
|
|
}
|
|
// ... Fill in the rest
|
|
}
|
|
|
|
// Vulkan Example
|
|
{
|
|
VkImageCreateInfo imageCreateInfo = {};
|
|
imageCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
|
|
imageCreateInfo.pNext = nullptr;
|
|
imageCreateInfo.format = GetVulkanFormat(desc.format); // Translate DXGI format to Vulkan
|
|
imageCreateInfo.extent = { desc.width, desc.height, desc.depth };
|
|
imageCreateInfo.mipLevels = desc.numMips;
|
|
imageCreateInfo.arrayLayers = desc.arraySize;
|
|
if(desc.type == ddspp::Texture2D)
|
|
{
|
|
imageCreateInfo.imageType = VK_IMAGE_TYPE_2D;
|
|
}
|
|
// ... Fill in the rest
|
|
}
|
|
}
|
|
|
|
```
|