2015-01-01 6 views
1

У меня было довольно много проблем при попытке выполнить пример из OpenGL SuperBible 5th ed. из главы09/hdr_bloom.OpenEXR + OpenGL необработанное исключение

Проблемы были вызваны связыванием библиотек OpenEXR, поэтому я создал их вручную и заменил их на libs от авторов.

Сейчас я могу запустить программу, но при попытке загрузить HDR-изображение, которое используется в качестве текстуры, я получаю необработанную ошибку исключения.

Это часть кода, которая используется для загрузки текстуры HDR, если я прокомментирую все это, программа работает без проблем, но на моем объекте текстуры просто нет.

bool LoadOpenEXRImage(char *fileName, GLint textureName, GLuint &texWidth, GLuint &texHeight) 
{ 
    // The OpenEXR uses exception handling to report errors or failures 
    // Do all work in a try block to catch any thrown exceptions. 
    try 
    { 
     Imf::Array2D<Imf::Rgba> pixels; 
     Imf::RgbaInputFile file(fileName); // UNHANDLED EXCEPTION 
     Imath::Box2i dw = file.dataWindow(); 

     texWidth = dw.max.x - dw.min.x + 1; 
     texHeight = dw.max.y - dw.min.y + 1; 

     pixels.resizeErase(texHeight, texWidth); 

     file.setFrameBuffer(&pixels[0][0] - dw.min.x - dw.min.y * texWidth, 1, texWidth); 
     file.readPixels(dw.min.y, dw.max.y); 

     GLfloat* texels = (GLfloat*)malloc(texWidth * texHeight * 3 * sizeof(GLfloat)); 
     GLfloat* pTex = texels; 

     // Copy OpenEXR into local buffer for loading into a texture 
     for (unsigned int v = 0; v < texHeight; v++) 
     { 
      for (unsigned int u = 0; u < texWidth; u++) 
      { 
       Imf::Rgba texel = pixels[texHeight - v - 1][u]; 
       pTex[0] = texel.r; 
       pTex[1] = texel.g; 
       pTex[2] = texel.b; 

       pTex += 3; 
      } 
     } 

     // Bind texture, load image, set tex state 
     glBindTexture(GL_TEXTURE_2D, textureName); 
     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, texWidth, texHeight, 0, GL_RGB, GL_FLOAT, texels); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

     free(texels); 
    } 
    catch (Iex::BaseExc & e) 
    { 
     std::cerr << e.what() << std::endl; 
     // 
     // Handle exception. 
     // 
    } 

    return true; 
} 

Это называется так:

LoadOpenEXRImage("window.exr", windowTexture, texWidth, texHeight); 

Обратите внимание, мой знак, который показывает, где происходит именно необработанное исключение.

Если я пытаюсь запустить его, я получаю эту ошибку:

Unhandled exception at 0x77938E19 (ntdll.dll) in hdr_bloom.exe: 0xC0000005: Access violation writing location 0x00000014.

Мой отладчик указывает на эту часть кода:

virtual void __CLR_OR_THIS_CALL _Lock() 
    { // lock file instead of stream buffer 
    if (_Myfile) 
     _CSTD _lock_file(_Myfile); // here 
    } 

Который является частью fstream

Мои декларации выглядят так:

#include <ImfRgbaFile.h>   // OpenEXR headers 
#include <ImfArray.h> 

#ifdef _WIN32 
#pragma comment (lib, "half.lib") 
#pragma comment (lib, "Iex.lib") 
#pragma comment (lib, "IlmImf.lib") 
#pragma comment (lib, "IlmThread.lib") 
#pragma comment (lib, "Imath.lib") 
#pragma comment (lib, "zlib.lib") 
#endif 

#pragma warning(disable : 4244) 

Я понятия не имею, если это имеет значение, но когда я попытался запустить его в первый раз, у меня появились ошибки SAFESEH в моем zlib.lib, поэтому я отключил SAFESEH в Linker-> Advanced.

И проект, предоставленный авторами, был создан в VisualStudio2008, где я использую более новую версию, и я ее преобразовал при открытии.

Кроме того, я использую 64-разрядную версию Windows 7 и Microsoft Visual Studio 2013 Ultimate.

Если необходимо, то сообщите мне, и я отправлю более подробную информацию, я попытался сохранить ее как можно короче.

ответ

1

Я, наконец, нашел проблему, хотя я не уверен, как это происходит.

Чтобы решить эту проблему, мне пришлось создать совершенно новый проект и просто скопировать все из оригинального проекта, поэтому мое предсказание заключается в том, что где-то во время преобразования исходного проекта некоторые свойства проекта изменились, и это вызвало некоторые ошибки.

Я выяснил, что возможно, что такой преобразованный проект может не соответствовать разрешению на запись или чтение файлов в некоторых каталогах, и поэтому я получил необработанное исключение из fstream.

Так что для будущих людей с похожими проблемами вместо преобразования вашего проекта создайте совершенно новый и просто скопируйте то, что вам нужно, в моем случае мне просто пришлось копировать библиотеки и каталоги Include:).

Смежные вопросы