Я создаю класс для управления изображениями с помощью OpenGL. Чтобы загрузить изображение, я использую SOIL для загрузки PNG. Поскольку мне нужно проверить конфликт, я хочу получить прозрачный пиксель. Так я пытаюсь получить данные с помощью: glGetTexImageОшибка переполнения буфера при вызове glGetTexImage несколько раз
Конструктор загружает изображение:
Image::Image(string imagePath, unsigned int flags){
this->imagePath=imagePath;
this->pxData=NULL;
texture=SOIL_load_OGL_texture
(
imagePath.c_str(),
SOIL_LOAD_AUTO,
SOIL_CREATE_NEW_ID,
flags
);
//Use that to subdivide in sprites the texture
glGetTexLevelParameteriv(GL_TEXTURE_2D, texture, GL_TEXTURE_WIDTH, &textureWidth);
glGetTexLevelParameteriv(GL_TEXTURE_2D, texture, GL_TEXTURE_HEIGHT, &textureHeight);
glBindTexture(GL_TEXTURE_2D, this->texture);
//cout << "Real Dimensions - " << textureWidth << "-" << textureHeight;
loadPixels(); //multiple instances of image generates error here
}
нагрузку при LoadPixels внутри моей структуры пиксельные данные.
typedef struct PixelData{
unsigned char r;
unsigned char g;
unsigned char b;
unsigned char a;
} PixelData;
PixelData* pxData;
Тогда в loadPixels я хранить эти данные:
void Image::loadPixels(){
pxData = new PixelData[textureHeight*textureWidth];
glGetTexImage(GL_TEXTURE_2D, 1, GL_RGBA, GL_UNSIGNED_BYTE , pxData);
}
Проблема заключается в том, если я создать изображение:
Image img("/Developer/img.png", SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT);
Он работает отлично.
Если я создать много образов:
Image img("/Developer/img.png", SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT);
Image img2("/Developer/img2.png", SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT);
Image img3("/Developer/img3.png", SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT);
Image img4("/Developer/img4.png", SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT);
Image img5("/Developer/img5.png", SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT);
Image img6("/Developer/img6.png", SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT);
Image img7("/Developer/img7.png", SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT);
Image img8("/Developer/img8.png", SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT);
Image img9("/Developer/img9.png", SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT);
Image img10("/Developer/img10.png", SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT);
Тогда моя программа выходит из строя:
Ошибка является:
OpenGL Game Engine(35463,0x7fff7b121310) malloc: *** error for object 0x104017808: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug
Если я свой комментарий glGetTexImage (GL_TEXTURE_2D, 1, GL_RGBA , GL_UNSIGNED_BYTE, pxData); он работает отлично, поэтому я представляю, что проблема не в распределении.
Мне просто нужно получить данные о пикселях, чтобы сохранить его, я хочу создать некоторые данные, используя эти пиксели, поэтому мне нужно получить пиксель моей текстуры.
Примечание:
Программа останавливается на imagePath.c_str() с sigabort, если я раскомментировать loadPixels, если я комментировать его загружает мелкие все текстуры
Благодаря Одри я получил больше информации.
glGetTexLevelParameteriv(GL_TEXTURE_2D, this->texture, GL_TEXTURE_WIDTH, &textureWidth);
glGetTexLevelParameteriv(GL_TEXTURE_2D, this->texture, GL_TEXTURE_HEIGHT, &textureHeight);
Real Dimensions - 128-128
Real Dimensions - 64-64
Real Dimensions - 32-32
Real Dimensions - 16-16
Это то же изображение, но размеры продолжают уменьшаться.
Я проверил идентификатор, и он действительно создает новый идентификатор каждый раз, так почему размеры становятся беспорядочными?
Есть ли другой способ получить эти данные, что мне здесь не хватает? Другой вопрос, этот метод получает текстуру связывания, есть ли способ получить данные текстуры, используя идентификатор текстуры?
Являются ли 'textureWidth' и' textureHeight' возвращающими то, что вы думаете о них? –
Они возвращают размер текстуры, его ок. Проблема в том, когда я хочу получить данные из glGetTexImage, если я только один раз, когда данные вернутся отлично, но если я вызову много времени, программа сработает – Lefsler
Мне интересно, пытается ли 'getGlTexImage писать слишком много байтов к 'pxData'. Это первое, что я проверил бы. Вы не можете получить ошибку при работе с одним изображением, потому что у вас есть некоторая память за пределами 'pxData', и она повреждена, но вы не заметили, и компьютер не жаловался/segfault. –