Ошибка отображения текстуры OpenGL - PullRequest
3 голосов
/ 05 августа 2010

Вот большая проблема с моим проектом:

Мне нравятся учебники на сайте NeHe, и Windows XP отлично запускала программы. Однако, когда я переформатировал свой компьютер, изменил ОС на Windows Vista и переустановил мой компилятор Dev-C ++, а затем я попытался открыть любую программу C ++, которая использовала текстуры, программа потерпела крах.

Я понял, что мой glaux.h пропал без вести. Я нашел файл в интернете и перекомпилировал мой проект, но он все равно потерпел крах. Все прошло хорошо, когда я исключил функции текстур.

Где проблема и что я могу сделать, чтобы решить ее?

Я думал, что один из них является виновником: ОС Windows Vista, моя видеокарта, glaux.h и библиотеки (я знаю, что она содержит ошибки), сам OpenGL.

.

Обновление: я определил источник проблемы.

Этот кусок кода вызвал сбой моей программы:

if (TextureImage[0]) {
    if (TextureImage[0]->data) {    
    free(TextureImage[0]->data);
    }
    free(TextureImage[0]);
}

По какой-то причине моя программа всегда падает, когда я заказываю ее для освобождения памяти. Когда я закомментировал этот раздел, моя программа работает нормально, за исключением того, что все цвета потемнели (я думаю, это из-за цветов моего растрового файла). Любые советы?

.

Ответить: Matias Valdenegro

Ну, это было получено из урока NeHe6, который работал нормально, когда я все еще использовал Windows XP. Абсолютно ничего не изменилось, когда я перешел на Windows Vista.

Просто чтобы вы знали, вот вся функция:

#define NoOfTextures 3
GLuint  texture[NoOfTextures];

int LoadGLTextures()
{
    int Status=FALSE;

    AUX_RGBImageRec *TextureImage[NoOfTextures];

    memset(TextureImage,0,sizeof(void *)*1);

    if (TextureImage[0]=LoadBMP("Data/Bitmaps/texture.bmp"))
    {
        Status=TRUE;

        glGenTextures(1, &texture[0]);

        glBindTexture(GL_TEXTURE_2D, texture[0]);
        glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);

        if (TextureImage[0] != NULL) {  
            if (TextureImage[0]->data != NULL) {    
                free(TextureImage[0]->data);
            }
            free(TextureImage[0]);  
        }
    }

    return Status;                                      
}

.

Дополнительная информация:

Я часто перестраиваю свой проект, и LoadBMP () является частью того же заголовочного файла. Это функция LoadBMP ():

AUX_RGBImageRec *LoadBMP(char *Filename)
{
    FILE *File=NULL;

    if (!Filename)
    {
        return NULL;
    }

    File=fopen(Filename,"r");

    if (File)
    {
        fclose(File);
        return auxDIBImageLoad(Filename);
    }

    return NULL;
}

Мне это кажется довольно ясным.

Ответы [ 4 ]

1 голос
/ 05 августа 2010

Когда происходит сбой при бесплатном звонке, проверьте

  • Чтобы вы не дважды освобождали указатели.
  • Чтобы у вас были действительные указатели где угодно.Это означает, что свободные указатели выделяются с помощью malloc, вы не можете освободить указатель, полученный с помощью new.Кроме того, вы должны освободить исходное значение указателя, полученное из функции выделения, а не указатель + 1 или некоторую арифметику для него.
0 голосов
/ 06 августа 2010

Дело закрыто:

Я редактировал свое растровое изображение (Crate.bmp NeHe урока 7), когда понял, что нарисованные на нем цвета не отображаются правильно.После создания нового 24-битного растрового изображения и маркировки цветов на нем белый фон стал оранжевым, но это было из-за моего предыдущего вызова glColor3f ().Я добавил вызов glColor3f (1.0f, 1.0f, 1.0f) и прокомментировал этот раздел кода с помощью free (), и все стало хорошо.

0 голосов
/ 06 августа 2010

Распределяется ли память (с помощью malloc) в библиотеке, которую вы не перекомпилируете, и затем освобождаете в только что скомпилированном коде?Различные комбинации компилятор / ОС используют кучу по-разному, поэтому несовпадение malloc / free между двумя библиотеками, скомпилированными при разных обстоятельствах, может привести к сбою (или некоторому другому UB).реализация LoadBMP () после переустановки?

0 голосов
/ 05 августа 2010

Я предполагаю, что это связано с правами доступа к файлам.Попробуйте установить права доступа к файлу вашего проекта на более низкий уровень (особенно ваши текстуры).Это случалось со мной и в прошлом в различных проектах, которые загружают ресурсы во время выполнения, когда я перешел на Vista или Win7 с XP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...