public uint dwReserved2; // [3] public uint GetSize() { // 9 uint + DDS_PIXELFORMAT uints + 2 uint arrays with 14 uints total // each uint 4 bytes each return((9 * 4) + PixelFormat.GetSize() + (14 * 4)); }
private void WriteHeader(BinaryWriter bw) { var ddsHeader = new DDS_HEADER(); ddsHeader.dwSize = DDS_HEADER.GetSize(); ddsHeader.dwHeaderFlags = DDS.DDS_HEADER_FLAGS_TEXTURE | DDS.DDS_HEADER_FLAGS_LINEARSIZE | DDS.DDS_HEADER_FLAGS_MIPMAP; ddsHeader.dwHeight = height; ddsHeader.dwWidth = width; ddsHeader.dwMipMapCount = numMips; ddsHeader.PixelFormat.dwSize = DDS_PIXELFORMAT.GetSize(); ddsHeader.dwSurfaceFlags = DDS.DDS_SURFACE_FLAGS_TEXTURE | DDS.DDS_SURFACE_FLAGS_MIPMAP; ddsHeader.dwCubemapFlags = isCubemap == 1 ? (uint)(DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_NEGATIVEX | DDSCAPS2.CUBEMAP_POSITIVEX | DDSCAPS2.CUBEMAP_NEGATIVEY | DDSCAPS2.CUBEMAP_POSITIVEY | DDSCAPS2.CUBEMAP_NEGATIVEZ | DDSCAPS2.CUBEMAP_POSITIVEZ | DDSCAPS2.CUBEMAP_ALLFACES) : 0u; switch ((DXGI_FORMAT)format) { case DXGI_FORMAT.BC1_UNORM: ddsHeader.PixelFormat.dwFlags = DDS.DDS_FOURCC; ddsHeader.PixelFormat.dwFourCC = DDS.MAKEFOURCC('D', 'X', 'T', '1'); ddsHeader.dwPitchOrLinearSize = (uint)(width * height / 2); // 4bpp break; case DXGI_FORMAT.BC2_UNORM: ddsHeader.PixelFormat.dwFlags = DDS.DDS_FOURCC; ddsHeader.PixelFormat.dwFourCC = DDS.MAKEFOURCC('D', 'X', 'T', '3'); ddsHeader.dwPitchOrLinearSize = (uint)(width * height); // 8bpp break; case DXGI_FORMAT.BC3_UNORM: ddsHeader.PixelFormat.dwFlags = DDS.DDS_FOURCC; ddsHeader.PixelFormat.dwFourCC = DDS.MAKEFOURCC('D', 'X', 'T', '5'); ddsHeader.dwPitchOrLinearSize = (uint)(width * height); // 8bpp break; case DXGI_FORMAT.BC5_UNORM: ddsHeader.PixelFormat.dwFlags = DDS.DDS_FOURCC; ddsHeader.PixelFormat.dwFourCC = DDS.MAKEFOURCC('A', 'T', 'I', '2'); ddsHeader.dwPitchOrLinearSize = (uint)(width * height); // 8bpp break; case DXGI_FORMAT.BC1_UNORM_SRGB: ddsHeader.PixelFormat.dwFlags = DDS.DDS_FOURCC; ddsHeader.PixelFormat.dwFourCC = DDS.MAKEFOURCC('D', 'X', '1', '0'); ddsHeader.dwPitchOrLinearSize = (uint)(width * height / 2); // 4bpp break; case DXGI_FORMAT.BC3_UNORM_SRGB: case DXGI_FORMAT.BC4_UNORM: case DXGI_FORMAT.BC5_SNORM: case DXGI_FORMAT.BC6H_UF16: case DXGI_FORMAT.BC7_UNORM: case DXGI_FORMAT.BC7_UNORM_SRGB: ddsHeader.PixelFormat.dwFlags = DDS.DDS_FOURCC; ddsHeader.PixelFormat.dwFourCC = DDS.MAKEFOURCC('D', 'X', '1', '0'); ddsHeader.dwPitchOrLinearSize = (uint)(width * height); // 8bpp break; case DXGI_FORMAT.R8G8B8A8_UNORM: case DXGI_FORMAT.R8G8B8A8_UNORM_SRGB: ddsHeader.PixelFormat.dwFlags = DDS.DDS_RGBA; ddsHeader.PixelFormat.dwRGBBitCount = 32; ddsHeader.PixelFormat.dwRBitMask = 0x000000FF; ddsHeader.PixelFormat.dwGBitMask = 0x0000FF00; ddsHeader.PixelFormat.dwBBitMask = 0x00FF0000; ddsHeader.PixelFormat.dwABitMask = 0xFF000000; ddsHeader.dwPitchOrLinearSize = (uint)(width * height * 4); // 32bpp break; case DXGI_FORMAT.B8G8R8A8_UNORM: case DXGI_FORMAT.B8G8R8X8_UNORM: ddsHeader.PixelFormat.dwFlags = DDS.DDS_RGBA; ddsHeader.PixelFormat.dwRGBBitCount = 32; ddsHeader.PixelFormat.dwRBitMask = 0x00FF0000; ddsHeader.PixelFormat.dwGBitMask = 0x0000FF00; ddsHeader.PixelFormat.dwBBitMask = 0x000000FF; ddsHeader.PixelFormat.dwABitMask = 0xFF000000; ddsHeader.dwPitchOrLinearSize = (uint)(width * height * 4); // 32bpp break; case DXGI_FORMAT.R8_UNORM: ddsHeader.PixelFormat.dwFlags = DDS.DDS_RGB; ddsHeader.PixelFormat.dwRGBBitCount = 8; ddsHeader.PixelFormat.dwRBitMask = 0xFF; ddsHeader.dwPitchOrLinearSize = (uint)(width * height); // 8bpp break; default: throw new UnsupportedDDSException("Unsupported DDS header format. File: " + this.FullPath); } // If tileMode is NOT TILE_MODE_DEFAULT assume Xbox format if (tileMode != TILE_MODE_DEFAULT) { switch ((DXGI_FORMAT)format) { case DXGI_FORMAT.BC1_UNORM: case DXGI_FORMAT.BC1_UNORM_SRGB: case DXGI_FORMAT.BC2_UNORM: case DXGI_FORMAT.BC3_UNORM: case DXGI_FORMAT.BC3_UNORM_SRGB: case DXGI_FORMAT.BC4_UNORM: case DXGI_FORMAT.BC5_SNORM: case DXGI_FORMAT.BC5_UNORM: case DXGI_FORMAT.BC7_UNORM: case DXGI_FORMAT.BC7_UNORM_SRGB: ddsHeader.PixelFormat.dwFourCC = DDS.MAKEFOURCC('X', 'B', 'O', 'X'); break; } } bw.Write((uint)DDS.DDS_MAGIC); ddsHeader.Write(bw); switch ((DXGI_FORMAT)format) { case DXGI_FORMAT.BC1_UNORM_SRGB: case DXGI_FORMAT.BC3_UNORM_SRGB: case DXGI_FORMAT.BC4_UNORM: case DXGI_FORMAT.BC5_SNORM: case DXGI_FORMAT.BC6H_UF16: case DXGI_FORMAT.BC7_UNORM: case DXGI_FORMAT.BC7_UNORM_SRGB: new DDS_HEADER_DXT10() { dxgiFormat = format, resourceDimension = (uint)DXT10_RESOURCE_DIMENSION.DIMENSION_TEXTURE2D, miscFlag = isCubemap == 1 ? DDS.DDS_RESOURCE_MISC_TEXTURECUBE : 0u, arraySize = 1, miscFlags2 = DDS.DDS_ALPHA_MODE_UNKNOWN }.Write(bw); break; default: if (tileMode != TILE_MODE_DEFAULT) { new DDS_HEADER_DXT10() { dxgiFormat = format, resourceDimension = (uint)DXT10_RESOURCE_DIMENSION.DIMENSION_TEXTURE2D, miscFlag = isCubemap == 1 ? DDS.DDS_RESOURCE_MISC_TEXTURECUBE : 0u, arraySize = 1, miscFlags2 = DDS.DDS_ALPHA_MODE_UNKNOWN }.Write(bw); } break; } // If tileMode is NOT TILE_MODE_DEFAULT assume Xbox format if (tileMode != TILE_MODE_DEFAULT) { bw.Write((uint)tileMode); bw.Write(XBOX_BASE_ALIGNMENT); dataSizePosition = bw.BaseStream.Position; bw.Write((uint)0); bw.Write(XBOX_XDK_VERSION); } }
private void WriteHeader(BinaryWriter bw) { var ddsHeader = new DDS_HEADER(); ddsHeader.dwSize = DDS_HEADER.GetSize(); ddsHeader.dwHeaderFlags = DDS.DDS_HEADER_FLAGS_TEXTURE | DDS.DDS_HEADER_FLAGS_LINEARSIZE | DDS.DDS_HEADER_FLAGS_MIPMAP; ddsHeader.dwHeight = height; ddsHeader.dwWidth = width; ddsHeader.dwMipMapCount = numMips; ddsHeader.PixelFormat.dwSize = DDS_PIXELFORMAT.GetSize(); ddsHeader.dwSurfaceFlags = DDS.DDS_SURFACE_FLAGS_TEXTURE | DDS.DDS_SURFACE_FLAGS_MIPMAP; switch ((DXGI_FORMAT)format) { case DXGI_FORMAT.BC1_UNORM: ddsHeader.PixelFormat.dwFlags = DDS.DDS_FOURCC; ddsHeader.PixelFormat.dwFourCC = DDS.MAKEFOURCC('D', 'X', 'T', '1'); ddsHeader.dwPitchOrLinearSize = (uint)(width * height / 2); // 4bpp break; case DXGI_FORMAT.BC2_UNORM: ddsHeader.PixelFormat.dwFlags = DDS.DDS_FOURCC; ddsHeader.PixelFormat.dwFourCC = DDS.MAKEFOURCC('D', 'X', 'T', '3'); ddsHeader.dwPitchOrLinearSize = (uint)(width * height); // 8bpp break; case DXGI_FORMAT.BC3_UNORM: ddsHeader.PixelFormat.dwFlags = DDS.DDS_FOURCC; ddsHeader.PixelFormat.dwFourCC = DDS.MAKEFOURCC('D', 'X', 'T', '5'); ddsHeader.dwPitchOrLinearSize = (uint)(width * height); // 8bpp break; case DXGI_FORMAT.BC5_UNORM: ddsHeader.PixelFormat.dwFlags = DDS.DDS_FOURCC; ddsHeader.PixelFormat.dwFourCC = DDS.MAKEFOURCC('A', 'T', 'I', '2'); ddsHeader.dwPitchOrLinearSize = (uint)(width * height); // 8bpp break; case DXGI_FORMAT.BC1_UNORM_SRGB: ddsHeader.PixelFormat.dwFlags = DDS.DDS_FOURCC; ddsHeader.PixelFormat.dwFourCC = DDS.MAKEFOURCC('D', 'X', '1', '0'); ddsHeader.dwPitchOrLinearSize = (uint)(width * height / 2); // 4bpp break; case DXGI_FORMAT.BC3_UNORM_SRGB: case DXGI_FORMAT.BC4_UNORM: case DXGI_FORMAT.BC5_SNORM: case DXGI_FORMAT.BC7_UNORM: case DXGI_FORMAT.BC7_UNORM_SRGB: ddsHeader.PixelFormat.dwFlags = DDS.DDS_FOURCC; ddsHeader.PixelFormat.dwFourCC = DDS.MAKEFOURCC('D', 'X', '1', '0'); ddsHeader.dwPitchOrLinearSize = (uint)(width * height); // 8bpp break; case DXGI_FORMAT.R8G8B8A8_UNORM: case DXGI_FORMAT.R8G8B8A8_UNORM_SRGB: ddsHeader.PixelFormat.dwFlags = DDS.DDS_RGBA; ddsHeader.PixelFormat.dwRGBBitCount = 32; ddsHeader.PixelFormat.dwRBitMask = 0x000000FF; ddsHeader.PixelFormat.dwGBitMask = 0x0000FF00; ddsHeader.PixelFormat.dwBBitMask = 0x00FF0000; ddsHeader.PixelFormat.dwABitMask = 0xFF000000; ddsHeader.dwPitchOrLinearSize = (uint)(width * height * 4); // 32bpp break; case DXGI_FORMAT.B8G8R8A8_UNORM: case DXGI_FORMAT.B8G8R8X8_UNORM: ddsHeader.PixelFormat.dwFlags = DDS.DDS_RGBA; ddsHeader.PixelFormat.dwRGBBitCount = 32; ddsHeader.PixelFormat.dwRBitMask = 0x00FF0000; ddsHeader.PixelFormat.dwGBitMask = 0x0000FF00; ddsHeader.PixelFormat.dwBBitMask = 0x000000FF; ddsHeader.PixelFormat.dwABitMask = 0xFF000000; ddsHeader.dwPitchOrLinearSize = (uint)(width * height * 4); // 32bpp break; case DXGI_FORMAT.R8_UNORM: ddsHeader.PixelFormat.dwFlags = DDS.DDS_RGB; ddsHeader.PixelFormat.dwRGBBitCount = 8; ddsHeader.PixelFormat.dwRBitMask = 0xFF; ddsHeader.dwPitchOrLinearSize = (uint)(width * height); // 8bpp break; default: throw new UnsupportedDDSException("Unsupported DDS header format. File: " + this.FullPath); } bw.Write((uint)DDS.DDS_MAGIC); ddsHeader.Write(bw); switch ((DXGI_FORMAT)format) { case DXGI_FORMAT.BC1_UNORM_SRGB: case DXGI_FORMAT.BC3_UNORM_SRGB: case DXGI_FORMAT.BC4_UNORM: case DXGI_FORMAT.BC5_SNORM: case DXGI_FORMAT.BC7_UNORM: case DXGI_FORMAT.BC7_UNORM_SRGB: var dxt10 = new DDS_HEADER_DXT10() { dxgiFormat = format, resourceDimension = (uint)DXT10_RESOURCE_DIMENSION.DIMENSION_TEXTURE2D, miscFlag = 0, arraySize = 1, miscFlags2 = DDS.DDS_ALPHA_MODE_UNKNOWN }; dxt10.Write(bw); break; } }
public uint dwReserved2; // [3] public static uint GetSize() { // 9 uint + DDS_PIXELFORMAT uints + 2 uint arrays (dwReserved1 and dwReserved2) with 14 uints total // each uint 4 bytes each return((9 * 4) + DDS_PIXELFORMAT.GetSize() + (14 * 4)); }