/// <summary> /// Loads the specified compressed image (in <see cref="BLP"/> format) into a native OpenGL texture. /// </summary> /// <param name="textureID">The ID of the texture to load the image into.</param> /// <param name="compressedImage">The compressed image to load.</param> /// <exception cref="ArgumentException"> /// Thrown if the image format does not match the pixel format. /// </exception> /// <exception cref="ArgumentNullException"> /// Thrown if the input image is null. /// </exception> private static void LoadDXTTexture(int textureID, BLP compressedImage) { if (compressedImage == null) { throw new ArgumentNullException(nameof(compressedImage)); } GL.BindTexture(TextureTarget.Texture2D, textureID); // Load the set of raw compressed mipmaps for (uint i = 0; i < compressedImage.GetMipMapCount(); ++i) { byte[] compressedMipMap = compressedImage.GetRawMipMap(i); Resolution mipResolution = compressedImage.GetMipLevelResolution(i); PixelInternalFormat compressionFormat; switch (compressedImage.GetPixelFormat()) { case BLPPixelFormat.DXT1: { compressionFormat = PixelInternalFormat.CompressedRgbaS3tcDxt1Ext; break; } case BLPPixelFormat.DXT3: { compressionFormat = PixelInternalFormat.CompressedRgbaS3tcDxt3Ext; break; } case BLPPixelFormat.DXT5: { compressionFormat = PixelInternalFormat.CompressedRgbaS3tcDxt5Ext; break; } default: { throw new ArgumentException($"Image format (DXTC) did not match pixel format: {compressedImage.GetPixelFormat()}", nameof(Image)); } } // Load the mipmap into the texture GL.CompressedTexImage2D(TextureTarget.Texture2D, (int)i, compressionFormat, (int)mipResolution.X, (int)mipResolution.Y, 0, compressedMipMap.Length, compressedMipMap); } }