OpenEXR + необработанное исключение OpenGL

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

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

Прямо сейчас я могу запустить программу, но я получаю необработанную ошибку исключения, когда пытаюсь загрузить 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);

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

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

Необработанное исключение в 0x77938E19 (ntdll.dll) в hdr_bloom.exe:
0xC0000005: Место записи нарушения прав доступа 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,

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

1

Другие решения


По вопросам рекламы [email protected]