gpt4 book ai didi

c++ - OpenEXR + OpenGL 未处理的异常

转载 作者:太空宇宙 更新时间:2023-11-04 11:22:42 24 4
gpt4 key购买 nike

在尝试执行 OpenGL SuperBible 第 5 版中的示例时,我遇到了很多问题。来自 Chapter09/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);

请注意我的标记,它显示了未处理的异常发生的确切位置。

如果我尝试运行它,我会得到这个错误:

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)

我不知道这是否重要,但是当我第一次尝试运行它时,我遇到了关于我的 zlib.lib 的 SAFESEH 错误,所以我在 Linker->Advanced 中关闭了 SAFESEH。

作者提供的项目是在VisualStudio2008中创建的,我使用的是较新的版本,并在打开时进行了转换。

另外,我使用的是 Windows 7 64 位和 Microsoft Visual Studio 2013 Ultimate。

如果需要,请告诉我,我会发布更详细的信息,我尽量保持简短。

最佳答案

虽然我不确定它是如何发生的,但我终于找到了问题。

为了解决这个问题,我必须创建一个全新的项目并复制原始项目中的所有内容,所以我的预测是在转换原始项目的过程中,某些项目属性发生了变化,这导致了一些错误。

我发现这样的转换项目可能没有在某些目录中写入或读取文件的权限,这就是为什么我从 fstream 得到未处理的异常。

所以对于 future 遇到类似问题的人来说,与其转换你的项目,不如创建一个全新的项目,然后只复制你需要的东西,在我的例子中,我只需要复制 Library 和 Include 目录:)。

关于c++ - OpenEXR + OpenGL 未处理的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27731622/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com