0

我正在开发一个 OpenGL 应用程序,并且在Linux(x86_32 和 x86_64)下一切正常,但是我在将应用程序移植到Windows时遇到了困难。我的应用程序使用非常基本的OpenGL 1.0、出色的glfw 2.7.6libpng 1.5.7。在移植整个程序之前,我尝试编写最简单的代码来测试这些库在 Windows 下是否正常工作,并且在我开始使用纹理之前一切似乎都正常工作!

在我的程序中使用纹理glTexImage2D(..)会导致访问冲突并出现以下错误:

First-chance exception at 0x69E8F858 (atioglxx.dll) in sidescroll.exe: 0xC0000005: Access violation reading location 0x007C1000.
Unhandled exception at 0x69E8F858 (atioglxx.dll) in sidescroll.exe: 0xC0000005: Access violation reading location 0x007C1000.

我做了一些研究,发现这可能是 GPU 驱动程序错误。可悲的是,我有一台带有AMD Radeon HD5650的Toshiba L650-1NU笔记本电脑,没有提供驱动程序,但供应商分发过时。给定帖子的作者建议使用,但由于我使用OpenGL 1.0,因此我无权使用此方法。 glBindBuffer

您对如何在不使用更新的 OpenGL 的情况下绕过此问题有任何想法吗?不过,如果这是唯一的解决方案,是否可以向我提供有关如何将OpenGL 2.1glfw一起使用的教程或代码片段?

这是我的一段代码,它导致了错误:

img = img_loadPNG(BACKGROUND);
if (img) {
    printf("%p %d %d %d %d", img->p_ubaData, img->uiWidth, img->uiHeight, img->usiBpp, img->iGlFormat);

    glGenTextures(1, &textures[0]);
    glBindTexture(GL_TEXTURE_2D, textures[0]);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, img->uiWidth, img->uiHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, img->p_ubaData); //SEGFAULT HERE ON WINDOWS!
    //img_free(img); //it may cause errors on windows
} else printf("Error: loading texture '%s' failed!\n", BACKGROUND);
4

1 回答 1

4

您遇到的错误是因为您传递给 glTexImage2D 的缓冲区比 glTexImage2D 尝试从参数中推断出的缓冲区短。那是在 Windows 下崩溃而不是在 Linux 下崩溃,因为在 Linux 下内存分配往往比您要求的要大一些,而在 Windows 下您会受到非常严格的限制。

PNG很可能读作RGB。但是,您告诉 glTexImage2D 您通过了 GL_RGBA,这当然会越界访问。

我看到img你收到的结构有一个元素iGlFormat。我敢打赌,这正是传递给 glTexImage2D 的格式。所以试试这个:

glTexImage2D(
    GL_TEXTURE_2D, 0,
    img->iGlFormat, // This is not ideal, OpenGL will chose whatever suits
    img->uiWidth, img->uiHeight, 0,
    img->iGlFormat, GL_UNSIGNED_BYTE,
    img->p_ubaData )
于 2012-09-08T09:21:01.327 回答