Dzień dobry,
Piszę program toola do GE, który wczytuje obraz, generuje mipmapy i kompresuje do DXT1/3/5 biblioteką libsquish, a później wrzuca do mojego formatu. Program wywala się już przy kompresji bazowego obrazu.
// Ładuje obrazek
FIBITMAP* image = FreeImage_Load(FIF_PNG, input.c_str());
// Konwertuje obrazek na 32 bity jesli nie jest
/*if(FreeImage_GetBPP(image) != 32)
FreeImage_ConvertTo32Bits(image);*/
// Poprawka
if(FreeImage_GetBPP(image) != 32)
{
FIBITMAP* newImage = FreeImage_ConvertTo32Bits(image);
FreeImage_Unload(image);
image= newImage;
}
// Tworzy wymiary bazowego obrazu
GLuint imageW, imageH, imageBpp;
imageW = FreeImage_GetWidth(image);
imageH = FreeImage_GetHeight(image);
imageBpp = FreeImage_GetBPP(image);
std::cout << "Stworzono wymiary" << std::endl; std::cout.flush();
// Kompresuje bazowy obraz
GLubyte basicCompressedSize = squish::GetStorageRequirements(imageW, imageH, squishFlags);
GLubyte* basicCompressedImage = new GLubyte[basicCompressedSize];
squish::CompressImage(FreeImage_GetBits(image), imageW, imageH, basicCompressedImage, squishFlags);
std::cout << "Skompresowano baze" << std::endl; std::cout.flush();
W ostatniej linijce program już nie żyje i wyrzuca Naruszenie ochrony pamięci. Dziwne bo ..._GetBits() zwraca wskaźnik do NIE const i miejsce docelowe też nie jest const. ImageW i imageH wynoszą 512, a imageBpp to 32. Przed kompresją w obrazie nie jest RGBA tylko BGRA, ale to nie robi żadnej różnicy to i tak jest kolor tylko jakby inny.
PS. Znacie może jakąś lepszą libke do kompresji S3TC bo ta jest nieudokumentowana? Pisze w niej na ślepo.