Windows 使用glTexImage2D上载图像数据时失败

Windows 使用glTexImage2D上载图像数据时失败,windows,opengl,segmentation-fault,glfw,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(..)my程序的纹理会导致访问冲突,错误如下: First-chance excep

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

使用带有
glTexImage2D(..)
my程序的纹理会导致访问冲突,错误如下:

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驱动程序的错误。可悲的是,我有一台东芝L650-1NU笔记本电脑,配有AMD Radeon HD5650,没有提供驱动程序,而是由过时的供应商分发。本文作者建议使用
glBindBuffer
,但由于我使用的是opengl1.0,因此我无法使用此方法

你有没有想过如何在不使用较新的OpenGL的情况下绕过这个问题?然而,如果这是一个解决方案,我可以得到一个关于如何使用opengl2.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);

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

最有可能的是PNG读取为RGB。但是,您告诉GLTEXAGE2D您通过了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 )

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

最有可能的是PNG读取为RGB。但是,您告诉GLTEXAGE2D您通过了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 )

我确信我的图像有阿尔法通道,但你是对的。从GL_RGBA更改为GL_RGB可以绕过错误,但显示的图像已损坏。@Robin92:什么值是
img->usiBpp
?该死,你说得对-24!但我自己在GIMP中创建了这些图像,我确信它们具有alpha通道。即使在Linux下,它们也会显示alpha…我确信我的图像有alpha通道,不过你是对的。从GL_RGBA更改为GL_RGB可以绕过错误,但显示的图像已损坏。@Robin92:什么值是
img->usiBpp
?该死,你说得对-24!但我自己在GIMP中创建了这些图像,我确信它们具有alpha通道。即使在Linux下,它们也显示为alpha。。。