使用glTexImage2D上传图像数据时失败

时间:2012-09-08 09:12:57

标签: windows opengl segmentation-fault glfw

我正在开发一个OpenGL应用程序,并且在 Linux (x86_32和x86_64)下一切正常但在将应用程序移植到 Windows 期间我遇到了障碍。我的应用程序使用非常基本的 OpenGL 1.0 ,很棒的 glfw 2.7.6 libpng 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.

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

对于如何在不使用新的OpenGL的情况下绕过此问题,您有什么想法吗?然而,如果这是The One Solution,我可以获得有关如何将 OpenGL 2.1 glfw 一起使用的教程或代码段吗?

这是我的代码片段,导致错误:

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);

1 个答案:

答案 0 :(得分:3)

您遇到的错误是因为传递给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 )